关于stm32软件复位函数,搞不定,求助一下

stm32f303 上电运行程序运行不正常,手动复位后程序正常运行
[问题点数:20分,结帖人u]
stm32f303 上电运行程序运行不正常,手动复位后程序正常运行
[问题点数:20分,结帖人u]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。您当前的位置:&>&&>&
STM32软件复位(基于库文件V3.5)
&STM32软件复位(基于库文件V3.5)
void SoftReset(void)
__set_FAULTMASK(1); // 关闭所有中端
NVIC_SystemReset();// 复位
在官方软件库的 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);
经过反复的比较和遴选,《今日电子》和21ic中国电子网举办的2013年度产品奖正式揭晓…
() () () () () () () () ()后使用快捷导航没有帐号?
查看: 2394|回复: 6
stm32低功耗管理复位问题,请教~~
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
(108.1 KB)
我现在在做微功耗,用的是待机模式,我在看微功耗的待机模式的启动项中,有个启动方式是IWDG,但是这中启动方式我没有办法跟踪,我在手册中看到可以检测复位标记来判断是什么方式复位的。
LPWRRSTF:低功耗复位标志 (Low-power reset flag)
在低功耗管理复位发生时由硬件置’1’;由软件通过写RMVF位清除。
0:无低功耗管理复位发生;
1:发生低功耗管理复位.
这句话我认为是如果从微功耗醒来,不管是那种方式复位的,这个位都被置 1 不知道这样理解对不对?
还有一点我没有闹清楚在系统复位的6.1.1中写到
1.&&在进入待机模式时产生低功耗管理复位:
通过将用户选择字节中的nRST_STDBY位置’1’将使能该复位。这时,即使执行了进入待
机模式的过程,系统将被复位而不是进入待机模式。
而这个中的nRST_STDBY位置指的是什么?是不是进入待机模式?
本人狂踩袅~~~请各个大虾~帮我解决这两个问题~谢谢了
&&&&&&&&&&
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
刚刚我做了一下测试,让单片机进入待机模式,然后我用iwdg复位单片机,这样单片机退出了待机状态,然后我打印RCC-&CSR,发现最高位没有被置位。
版主指点一下小弟~
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&补充而且29位也没有被置位
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
& & & & & & & & & & & & & & & &&&用户选择字节是芯片功能的配置字节,它不能通过程序设置,需要在烧写芯片时配置。
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
用户选择字节中的nRST_STDBY位=0时表示在试图进入低功耗模式时产生复位,这样产生的复位才会设置LPWRRSTF标志。
请看下述文档在第20页的Table8中的描述:
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
这个没有理解~是在仿真的时候 设置吗?
在线时间0 小时
TA的帖子TA的资源
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
一粒金砂(初级), 积分 0, 距离下一级还需 5 积分
在keil中设置??
Powered by
逛了这许久,何不进去瞧瞧?[+30]关于STM32的IAP跳转,以及软件复位,发个帖子,请教下各位高手。
[+30]关于STM32的IAP跳转,以及软件复位,发个帖子,请教下各位高手。
编号: 1928754 类型:STM32 作者:
&&&时间: 11:08:00&&&&
访问次数:261 发贴IP:保密
本贴关键词:
一、背景:目前实现了USB Dual RS485,PCB原理图及源代码已公开。在程序调试中,使用J-Link 仿真器,然而MDK-ARM启动调用了汇编的初始化后,如果没有对GPIO初始化,那么IO脚乱发信号(硬件设计缺陷:IO没有设置上拉或下拉电阻)。解决方案如下:1.汇编初始化调用GPIO初始化代码,然后跳转到main处暂停。  IO脚发错误信号的比较少,能达到要求,该方案测试可行。2.先装载程序,运行到main处暂停,在开电机电源。  该方案测试可行。3.绕过J-Link,内置的bootloader立即启动,下载程序后,跳转到用户程序运行。  该方案测试可行。二、IAP的复位问题:1.用户程序跳转到bootloader,按照网友的方案,不给看门狗信号,则跳转到bootloader,  但跳转到bootlaoder后,所有的标志都被清0了,如何下载程序?2.软件跳转到固定地址,绕过keil隐藏的内存初始化代码。  这个目前还真的不知道怎么实现,而且还有堆栈设置,真心不知道。用GCC就是想解决这个问题,  但看的书少,头大了。  相关帖子>>>:记忆中,KEIL也可以设置为内存不初始化,不过这样,你程序中定义的所有全局变量都得预先赋值.(0字)电子白菜[9次] 11:15:16这个办法好,bootloader的程序不初始化内存就行了。(0字)wjandcf[11次] 11:24:38我做bootloader好象没考虑这些,直接软复位跑就可以了,函数指针跑AP。(0字)coody[11次] 11:17:21你的app中断向量偏移和bootloader的一样吗?(0字)wjandcf[10次] 11:21:22不一样,重新影射(0字)coody[7次] 15:11:07我了个去,APP从16K后开始运行,则中断向量也偏移16K啊,一个函数调用的事情。要注意bootloader跳到APP前,记得关掉所有中断,小心出现临界点问题。(0字)未名[8次] 15:50:56这些都考虑到了,现在就是需要一个程序更新的标志,从用户程序跳过来,这个标志被清除了。(0字)wjandcf[15次] 16:06:38最简单就是软件复位啊,bootloader里面检查复位源。我是复位源再配合了一块内存做的,这块内存声明为不初始化。只要不断电重启,bootloader和app都不会初始化它,而是交给程序来完全控制。(0字)未名[7次] 16:50:22有些复杂应用,一定要了解你的编译器的。我用IAR,就先把它的帮助PDF看了遍。做这种特殊应用也好,写定制的flashloader也好,就没压力了。(0字)未名[10次] 16:56:45你复位后,Boot向主机询问一下要否IAP,如果100ms之内未收到回应,再跳转。(0字)漂亮阿姨[13次] 17:29:51这个是办法是不错,我再搞个上位软件。反正超级终端也不好用,打开串口一直占着资源不放。(0字)wjandcf[9次] 17:31:51超级终端先打开,因为板子没通电,是没有串口的,所以我现在是板子先通电,2000毫秒发一个'C',然后用超级终端发送app程序。(168字)wjandcf[16次] 18:11:00超级终端发完app程序,板子就跳转到app用户程序了,用户程序会关下USB上拉电阻,再打开USB上拉电阻,接着超级终端就崩溃了。 所以这个软件实在是差。现在想着改下.SCT文件了,把SRAM分成两块,一块初始化,一块不初始化。(2412字)wjandcf[15次] 17:42:23; *************************************************************; *** Scatter-Loading Description File generated by uVision ***; *************************************************************LR_IROM1 0xx0; {    ; load region size_region  ER_IROM1 0xx0; {  ; load address = execution address   *.o (RESET, +First)   *(InRoot$$Sections)   .ANY (+RO)  }  RW_IRAM1 0x UNINIT 0x0; {  ; RW data   .ANY (+RW +ZI)  }}修改为; *************************************************************; *** Scatter-Loading Description File generated by uVision ***; *************************************************************LR_IROM1 0xx&&{&&&&; load region size_region&&ER_IROM1 0xx&&{&&; load address = execution address&& *.o (RESET, +First)&& *(InRoot$$Sections)&& .ANY (+RO)&&}&&RW_IRAM1 0xx&&{&&; RW data&& .ANY (+RW +ZI)&&}&&RW_IRAM2 0x UNINIT 0x&&{&& .ANY (+RW +ZI)&&}}标志变量使用绝对地址定位,保证用户程序操作的变量和bootloader操作的是同一个地址。(0字)wjandcf[12次] 17:44:56编译器脾气太怪,去年做的.sct文件还认,今年就不认了,用指针访问不清零的IRAM区域搞定。(0字)wjandcf[11次] 22:35:15今天在MDK-ARM 5.12上重新修改了.sct文件,仿真发现,这个未初始化的内存区域,的确没清零,可正常访问。(1978字)wjandcf[10次] 11:04:53#pragma arm section rwdata = &ram_code&&&zidata = &ram_code&uint8_t SecondTaskStk[32]; // SecondTaskStk 将定位在“ram_code”区段中#pragma arm section // 没有属性描述,则恢复默认设置/*; *************************************************************; *** Scatter-Loading Description File generated by uVision ***; *************************************************************LR_IROM2 0xx&&{&&&&; load region size_region&&ER_IROM2 0xx&&{&&; load address = execution address&&&*.o (RESET, +First)&&&*(InRoot$$Sections)&&&.ANY (+RO)&&}&&RW_IRAM1 0xx&&{&&; RW data&&&.ANY (+RW +ZI)&&}&&RW_IRAM2 0x UNINIT 0x&&{&&&.ANY (+RW +ZI)&&&*(ram_code)&&&&&}}*/【图片】重新启动后ram_code区域没有被清零.jpg,有图有真相(104字)wjandcf[15次] 11:12:15你这是大炮打蚊子啊,直接定义一个数组,noinit一下行了。(0字)未名[9次] 11:40:28不想动.sct也行,就是指针访问下,上传的IAP包就是这样搞的。(0字)wjandcf[9次] 11:56:15谢谢各位的提醒,这两天把STM32自身USB双虚拟串口更新app的bootloader程序整理好发上来,bootloader和app程序的SRAM都这样设置理论上可以。(432字)wjandcf[19次] 17:51:23&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&【图-1】bootloader程序设置.jpg&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&【图-2】用户程序设置.jpg堆栈原来在0x以下,现在自动改为0x以下,这里就不考虑了,编译器设置的。(0字)wjandcf[15次] 18:05:29由coody的说法想到的,没有bootloader的概念了,更新升级的程序放在Flash的高端。(250字)wjandcf[17次] 13:14:281.烧写一个默认的用户程序,和升级程序(升级程序可作为固化的程序块,只读)。2.上电直接跑默认的用户程序,需要升级时调用升级程序,更新用户程序,更新完毕重启,还是跑用户程序。3.升级不能有失败,否则需要重新烧写一个默认的用户程序。直接跳转到bootloader的main处是可以的,关键的是,堆栈该如何设置? bootloader程序用的标志变量可以在APP中通过指针强行赋值。(0字)wjandcf[13次] 11:19:47以前我的方案:芯片前32K用做bootloader,后面的空间存APP。bootloader里面可以通过以太,USB,串口来升级APP的代码。APP设计的时候,存域和运行域都是后一段的空间。(58字)未名[13次] 11:34:48bootloader只能通过jlink或其它工具先下进去。外部一般都另挂有SPI的NOR,应用程序也可以把自己的升级代码暂存到里面,由bootloader来升级。bootloader功能其实很简单,检测有没有升级事件,有就升,没有就启动APP。(0字)未名[6次] 11:41:38这个STM32F103C8只有64K,bootloader要尽量的小,现在整的这个USB双虚拟串口的bootloader大小是12K。(76字)wjandcf[16次] 11:57:13打算用串口下载bootloader进去,这样J-Link的两根线就省出来了。再小也是以页为单位的,64K的,页记得是8K。你用了12K和用了16K是等价的。(0字)未名[10次] 13:05:18还有,小容量的STM32竟然用GCC,那编译效率。。。(36字)未名[11次] 13:07:01正所谓,不做死就不会死。换IAR吧。我就不信整个GPIO翻转,它能给我多两行代码。ST的软件也是用GCC for ARM,奇怪同样的PWM代码,它和MDK-ARM编译出来的电平却是反的。(0字)wjandcf[8次] 13:29:54高容量是每页2K,这种小容量每页1K,之前做过256K的STM32F103VC的bootloader,也就是ISP。现在起码要搞IAP了。(0字)wjandcf[12次] 13:36:16
*wjandcf于 11:08:56修改过此帖内容。系统提示:文章已关闭回复}

我要回帖

更多关于 stm32如何软件复位 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信