完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
对于STM32来说软件复位有两种方式:
1)采用官方自带的软件库 在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数 /******************************************************************************* * Function Name : NVIC_GenerateSystemReset * Description : Generates a system reset. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_GenerateSystemReset(void) { SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04; } 但是不是直接调用这个函数就OK了? 在Cortex-M3权威指南中有这么一句话 这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令, 往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要 让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把 FAULTMASK 置位。 所以最好在将FAULTMASK 置位才万无一失。 同样官方stm32f10x_nvic.c 文件里也直接提供了该函数 /******************************************************************************* * Function Name : NVIC_SETFAULTMASK * Description : Enables the FAULTMASK priority: Raises the execution priority to -1. * Input : None * Output : None * Return : None *******************************************************************************/ void NVIC_SETFAULTMASK(void) { __SETFAULTMASK(); } 所以要系统复位 只要 调用这两个函数就OK了 NVIC_SETFAULTMASK(); GenerateSystemReset(); 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程序里直接调用该函数就行了。 SystemReset(); 在MDK环境下,包含汇编的代码嵌入到C代码中时,编写、调用与C函数一样 在misc.c中定义了上面的函数; 在misc.h中声明了函数:void SystemReset(void); 在main.c中调用函数:SystemReset(); 补充: MDK和IAR通用的软件复位代码: #if defined ( __CC_ARM ) /*------------------RealView Compiler -----------------*/ __asm void GenerateSystemReset(void) { MOV R0, #1 //; MSR FAULTMASK, R0 //; FAULTMASK 禁止一切中断产生 LDR R0, =0xE000ED0C //; LDR R1, =0x05FA0004 //; STR R1, [R0] //; deadloop B deadloop //; } #elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ //#pragma diag_suppress=Pe940 void GenerateSystemReset(void) { __ASM("MOV R0, #1"); __ASM("MSR FAULTMASK, R0"); SCB->AIRCR = 0x05FA0004; for(;;); } 上面的代码,程序在FLASH中跑时可以复位,在RAM中调试不成功,原因可能是板子上的boot比较松,导致RAM启动选择有问题 由上面可以看出,IAR下嵌入汇编不是简单的asm("...");,如asm("LDR R0, =0xE000ED0C ");就会报错 |
|
|
|
只有小组成员才能发言,加入小组>>
调试STM32H750的FMC总线读写PSRAM遇到的问题求解?
1297 浏览 1 评论
X-NUCLEO-IHM08M1板文档中输出电流为15Arms,15Arms是怎么得出来的呢?
1310 浏览 1 评论
718 浏览 2 评论
STM32F030F4 HSI时钟温度测试过不去是怎么回事?
526 浏览 2 评论
ST25R3916能否对ISO15693的标签芯片进行分区域写密码?
1325 浏览 2 评论
1727浏览 9评论
STM32仿真器是选择ST-LINK还是选择J-LINK?各有什么优势啊?
435浏览 4评论
STM32F0_TIM2输出pwm2后OLED变暗或者系统重启是怎么回事?
390浏览 3评论
378浏览 3评论
stm32cubemx生成mdk-arm v4项目文件无法打开是什么原因导致的?
357浏览 3评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-9-20 11:53 , Processed in 2.840444 second(s), Total 75, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号