- 1、本文档共4页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
stm32软件复位
STM32软件复位(基于库文件V3.5)
对于STM32来说软件复位有两种方式:???1)采用官方自带的软件库?????在官方软件库的?core_cm3.h?文件里?直接提供了?系统复位的函数?
??static __INLINE void NVIC_SystemReset(void)
{
? SCB-AIRCR ?= ((0x5FA SCB_AIRCR_VECTKEY_Pos) ? ? ?|?
? ? ? ? ? ? ? ? ? ? ? ? ? ?(SCB-AIRCR SCB_AIRCR_PRIGROUP_Msk) |?
? ? ? ? ? ? ? ? ? ? ? ? ? ?SCB_AIRCR_SYSRESETREQ_Msk); ? ? ? ? ? ? ? ? ? /* Keep priority group unchanged */
? __DSB(); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??/* Ensure completion of memory access */ ? ? ? ? ? ? ?
? while(1); ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? /* wait until reset */
}
??但是不是直接调用这个函数就OK了????在Cortex-M3权威指南中有这么一句话???这里有一个要注意的问题:从SYSRESETREQ?被置为有效,到复位发生器执行复位命令,?往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要?让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把?FAULTMASK?置位。???所以最好在将FAULTMASK?置位才万无一失。???同样官方?core_cm3.h?文件里也直接提供了该函数???static __INLINE void __set_FAULTMASK(uint32_t faultMask)
{
? register uint32_t __regFaultMask ? ? ? __ASM(faultmask);
? __regFaultMask = (faultMask 1);
}
? 把上面这两个函数写在一起就可以实现软件复位了~~
void SoftReset(void)
{
__set_FAULTMASK(1); ? ? ?// 关闭所有中端
NVIC_SystemReset();// 复位
}
?/*-------------------------------------以下未测试-----------------------------------------*/?2)自己编写相应汇编代码???其实到底一样,我当初是没有看到官方的函数所以自己编的,实际你看官方函数里面其实就是调用的cortexm3_macro.s同样的代码?呵呵。???我的代码:???/*******************************************************************************?*?Function?Name??:?SystemReset?*?Description????:?Configures?the?port?pin?connected?to?the?push?button.?GPIO_D_4?*?Input??????????:?None?*?Output?????????:?None?*?Return?????????:?None?*******************************************************************************/?__asm?void?SystemReset(void)?{??MOV?R0,?#1???????????//;???MSR?FAULTMASK,?R0????//;?清除FAULTMASK?禁止一切中断产生??LDR?R0,?=0xE000ED0C??//;??LDR?R1,?=0x05FA0004??//;??STR?R1,?[R0]?????????//;?系统软件复位??????deadloop?????B?deadloop????????//;?死循环使程序运行不到下面的代码?}?然后用的时候在C程序里直接调用该函数就行了。?
文档评论(0)