搜索
bottom↓
回复: 30

STM32的 软件复位 函数 怎么不好用呢 ???

[复制链接]

出0入0汤圆

发表于 2011-3-29 15:44:33 | 显示全部楼层 |阅读模式
stm32官方介绍有以下两个函数,可以完成它的软件复位功能,可是我用起来并不起作用。

  一调用它,好像就死机了,根本没有复位,只有看门狗可以正常复位,是我在使用中发生了

错误?到底怎么使用它才能正确运行,还请各位老师指正,学生还道一声:先谢谢了!!!

==============================================================================================================================
      void NVIC_GenerateSystemReset(void)
    {
      SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
    }

   但是不是直接调用这个函数就OK了?

   在Cortex-M3权威指南中有这么一句话

  这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,
  往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要
  让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把
  FAULTMASK 置位。

   所以最好在将FAULTMASK 置位才万无一失。

     同样官方stm32f10x_nvic.c 文件里也直接提供了该函数

    void NVIC_SETFAULTMASK(void)
  {
    __SETFAULTMASK();
  }

   所以要系统复位 只要 调用这两个函数就OK了

    NVIC_SETFAULTMASK();
    GenerateSystemReset();

===================================================================================

出0入0汤圆

 楼主| 发表于 2011-3-29 17:00:02 | 显示全部楼层
以上可能没有说清楚,再说明白点,下面再贴出官方介绍几个和软件复位有关的函数:

    1, NVIC_GenerateSystemReset();   //STM32的系统软件复位

    2, NVIC_GenerateCoreReset  ();   //STM32的内核软件复位

    3, NVIC_SETFAULTMASK       ();   //FAULTMASK 置位

--------------------------------------------------------------------------------------------------
    1.2 这两个复位函数有什么区别呢?在使用中选那个?还是要全用?

    3,是FAULTMASK 置位函数,是个“内联:函数吧?在IAR编译环境里使用时要报错的,怎么避免这个问题的发生?


/*******************************************************************************/
    void NVIC_GenerateSystemReset(void)  //STM32的系统软件复位
  {
    SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
  }

/*******************************************************************************/

  void NVIC_GenerateCoreReset(void)   //STM32的内核软件复位
  {
    SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x01;
  }

/*******************************************************************************/

  void NVIC_SETFAULTMASK(void)
  {
    __SETFAULTMASK ();
  }

//===================================================================

出0入0汤圆

发表于 2011-3-29 17:50:22 | 显示全部楼层
__asm void SystemReset(void)
{
MOV R0, #1           //;
MSR FAULTMASK, R0    //; 清除FAULTMASK 禁止一切中断产生
LDR R0, =0xE000ED0C  //;
LDR R1, =0x05FA0004  //;
STR R1, [R0]         //; 系统软件复位   

deadloop
    B deadloop        //; 死循环使程序运行不到下面的代码
}

出0入0汤圆

发表于 2011-3-29 17:51:24 | 显示全部楼层
我一直用这个函数。

出0入0汤圆

发表于 2011-3-29 19:11:54 | 显示全部楼层
http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=4254083

出0入0汤圆

 楼主| 发表于 2011-3-29 22:56:01 | 显示全部楼层
回复【3楼】ha002
我一直用这个函数。
-----------------------------------------------------------------------

十分感谢 ha002 老师的解答,我也试用一下看看效果怎样。

出0入0汤圆

发表于 2011-3-29 23:27:32 | 显示全部楼层
标记

出0入0汤圆

发表于 2011-4-20 16:30:22 | 显示全部楼层
3.0以上的库的,复位函数是什么啊

出0入0汤圆

发表于 2011-9-19 19:14:31 | 显示全部楼层
mark!

出0入0汤圆

发表于 2011-10-12 16:46:09 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-3-7 15:41:25 | 显示全部楼层
本帖最后由 fazls 于 2013-3-7 15:43 编辑

转一下别人的,库函数 NVIC_SystemReset(void):
  1. /* ##################################    Reset function  ############################################ */

  2. /**
  3. * @brief  Initiate a system reset request.
  4. *
  5. * Initiate a system reset request to reset the MCU
  6. */
  7. static __INLINE void NVIC_SystemReset(void)
  8. {
  9.   SCB->AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |
  10.                  (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
  11.                  SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */
  12.   __DSB();                                                     /* Ensure completion of memory access */              
  13.   while(1);                                                    /* wait until reset */
  14. }

  15. /*@}*/ /* end of group CMSIS_CM3_Core_FunctionInterface */
复制代码

出0入0汤圆

发表于 2013-4-25 16:25:30 | 显示全部楼层
ha002 发表于 2011-3-29 17:51
我一直用这个函数。

这个函数应该写到哪里啊,如果写到main函数里编译会出错吧。。因为编译器好像只能编译C/C++

出0入0汤圆

发表于 2013-10-9 11:54:14 | 显示全部楼层
非常感谢!

出0入0汤圆

发表于 2013-10-9 12:06:49 | 显示全部楼层
cmsis自带这个函数,在core_cm3.h这个头文件中

出0入0汤圆

发表于 2013-10-9 12:49:13 | 显示全部楼层
NVIC_SystemReset();        3.5的库,cmsis自带这个函数,在core_cm3.h这个头文件中楼上说的对

出0入0汤圆

发表于 2013-11-4 16:13:01 | 显示全部楼层
DiaoMao_Huang 发表于 2013-10-9 12:49
NVIC_SystemReset();        3.5的库,cmsis自带这个函数,在core_cm3.h这个头文件中楼上说的对 ...

mark..........

出0入0汤圆

发表于 2013-11-7 18:03:58 | 显示全部楼层
在3.1库里面试了一下LZ的程序,可以编译通过

出0入0汤圆

发表于 2013-11-7 18:44:25 | 显示全部楼层
miniqq80 发表于 2013-11-7 18:03
在3.1库里面试了一下LZ的程序,可以编译通过

撸主的程序是老掉牙1.x 2.x固件库,3.x固件库用11楼NVIC_SystemReset(void)就行了。

另外,请不要挖坟炒冷饭。

出0入0汤圆

发表于 2014-10-9 10:25:13 | 显示全部楼层
STM32软件复位与硬件复位的区别在哪儿?

出0入0汤圆

发表于 2014-10-9 10:29:09 | 显示全部楼层
标记一下~我都是用看门狗

出0入0汤圆

发表于 2014-10-9 12:30:53 | 显示全部楼层
我试过了,好用的啊

出0入0汤圆

发表于 2014-10-9 14:22:17 | 显示全部楼层
这个要学习!

出0入0汤圆

发表于 2014-10-10 21:38:13 | 显示全部楼层
何小小宝 发表于 2014-10-9 12:30
我试过了,好用的啊

怎么我用的时候都报错呀      我在main中包含了  #include "core_cm3.h"  在main中直接调用  

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-10-15 10:32:34 | 显示全部楼层
王晨 发表于 2014-10-10 21:38
怎么我用的时候都报错呀      我在main中包含了  #include "core_cm3.h"  在main中直接调用  
...

你的程序有个很简单的语法错误

出0入0汤圆

发表于 2014-10-15 11:30:11 | 显示全部楼层
把void去掉

出0入0汤圆

发表于 2015-7-20 15:34:38 | 显示全部楼层
NVIC_SystemReset();学到了

出0入8汤圆

发表于 2015-7-20 16:21:35 来自手机 | 显示全部楼层
我一直是看门狗不喂狗就复位

出0入0汤圆

发表于 2015-7-22 11:18:41 | 显示全部楼层
软件复位应该第一个函数就行

出0入0汤圆

发表于 2015-7-22 13:22:35 | 显示全部楼层
__set_FAULTMASK(1);
NVIC_SystemReset();
软件复位的话要调这两句。

出0入0汤圆

发表于 2015-7-22 14:08:07 | 显示全部楼层
没用过,以后用用试试,防止死机哈

出0入0汤圆

发表于 2016-10-24 19:48:35 | 显示全部楼层
MARK,THS..
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-20 02:21

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表