CM3(STM32)内核复位与系统复位区别及应用
相关标题:STM32软件复位 、 Cortex - M芯片软件内核复位 、 STM32系统复位
为方便大家阅读,本文内容已经整理成PDF文件:
http://pan.baidu.com/s/1gfHygyn
Ⅰ、写在前面
某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。
例子:我一个A系统通过一个IO控制另一个B系统的电源,而这个IO置高时才开启B系统的电源。
正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。
这个时候如果我使用常规的引脚复位,就会使IO置低,不符合要求,就需要使用到本文说到的内核复位。
Ⅱ、关于复位
说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。
复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。
上面说的复位按键,也就是对应复位引脚复位;而本文说的内核复位与系统复位是属于软件复位。
Ⅲ、内核与系统复位区别
本文说的内核是指处理器内核,拿STM321处理器来说,STM32F1的内核就是Cortex-M3内核,而这里的系统就是包含内核和外设整个一起。
内核复位:它会使Cortex-M3进行复位,而不会影响其外设,如GPIO、TIM、USART、SPI等这些寄存器的复位。
系统复位:这个复位会使整个芯片的所有电路都进行复位,我们查看寄存器手册时,会发现某某某寄存器复位值等于多少。
因此,我们常说的复位一般指的就是系统复位。
Ⅳ、内核与系统复位应用及代码分析
本文拿CM3(STM32F1)进行举例说明,其他芯片类似。在下一节提供源代码工程供大家参考学习。
本文提供的复位函数分:内核和系统复位、C语言和汇编共四个版本(在一个工程),主要讲解其4个函数:
void NVIC_CoreReset(void);
void NVIC_CoreReset_a(void);
void NVIC_SysReset(void);
void NVIC_SysReset_a(void);
本章节内容可以参照Cotrex-M3权威指南中,Cotrex-M3其他特性章节下的自复位控制(软件复位)。中文版位于第13张,英文版位于第14张。
同时结合core_cm3.h源代码,其中系统复位中的C语言版就是core_cm3.h里面的源代码。
1.NVIC_CoreReset内核复位
CM3 允许由软件触发复位序列,用于特殊的调试或维护目的。在CM3中,有两种方法可以执行自我复位。第一种方法,是通过置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的 VECTRESET 位(位偏移:0)。
这种复位的作用范围覆盖了整个CM3处理器中,除了调试逻辑之外的所有角落,但是它不会影响到 CM3 处理器外部的任何电路,所以单片机上的各片上外设和其它电路都不受影响。
C语言版函数:
void NVIC_CoreReset(void)
{
__DSB();
//置位VECTRESET
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_VECTRESET_Msk);
__DSB();
while(1);
}
汇编版函数:
__asm void NVIC_CoreReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0001 //置位VECTRESET
STR R1, [R0]
deadloop_Core
B deadloop_Core
}
内核主要注意:SCB_AIRCR_VECTRESET_Msk和LDR R1, =0x05FA0001,它是和系统复位唯一的区别。
2.NVIC_SysReset系统复位
系统复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会波及整个芯片上的电路:它会使 CM3 处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是CM3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅该芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如, STM32系列的芯片有后备存储区,该区就被特殊对待)。
大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把 CM3 处理器的系统复位信号(SYSRESETn)置为有效。通常, SYSRESETREQ 不应复位调试逻辑。
这里有一个要注意的问题:从 SYSRESETREQ 被置为有效,到复位发生器执行复位命令,往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把FAULTMASK置位。因此,我在提供源代码中有这么一句:__set_FAULTMASK(1);,也就是置位FAULTMASK。
C语言版函数:
void NVIC_SysReset(void)
{
__DSB();
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB();
while(1);
}
汇编版函数:
__asm void NVIC_SysReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0004
STR R1, [R0]
deadloop_Sys
B deadloop_Sys
}
细心的朋友可能会发现:
1.内核复位与系统源代码和相近,差异在于SYSRESETREQ和SYSRESETREQ这两位。
2.C语言版本的代码和core_cm3.h中NVIC_SystemReset函数相似。对的这个函数就是系统复位函数,而我们的内核复位只是简单修改了一下。
3.main函数应用
Main函数中主要以LED1和LED2两个IO来说明。
LED1作为"标志灯": 上电"标志"置为高;
LED2作为指示灯:看从内核启动改变状态没有。
请在main函数中应用不同的配置进行测试:
#if 0 /* 内核复位 */
NVIC_CoreReset();
// NVIC_CoreReset_a();
#else /* 系统复位 */
NVIC_SysReset();
// NVIC_SysReset_a();
#endif
Ⅴ、代码下载
Cotrex-M3权威指南:
http://pan.baidu.com/s/1mhQYa1q
本文源代码工程(STM32F103ZE(Keil)_Reset):
http://pan.baidu.com/s/1hskScba
提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。
Ⅵ、最后
微信搜索“EmbeddDeveloper” 或者扫描下面二维码、关注,查看更多精彩内容!
CM3(STM32)内核复位与系统复位区别及应用相关推荐
- STM32的复位方式:硬件复位、软件复位(看门狗复位和系统复位)
STM32的复位方式:硬件复位.软件复位(看门狗复位和系统复位). 1.硬件复位: 硬件复位通过给NRST引脚输入低电平复位单片机. 2.看门狗复位: 独立看门狗和窗口看门狗. (1)独立看门狗 ST ...
- stm32如何执行软复位_stm32 上电复位 跟软复位有什么区别
stm32 上电复位 和软复位有什么区别. 我有一个lwip的程序, 1.上电跑不正确. 2.上电同时按下复位键,跑也不正确. 3.上电跑不正确.跑一会按下复位键.再跑一次正确. 4跑一会儿,软复位. ...
- stm32外部中断问题(每次stm32进行系统复位按键控制NRST=0,程序立马进入中断服务函数)
rf射频数据收发芯片的一个数据接收指示引脚连接stm32的一个gpio口,设置为中断口.当rf接收到数据的时候,数据接收指示引脚由高电平变为低电平,所以中断配置里面配置的是IPU,下降沿触发.系统复位 ...
- STM32,软复位,上电复位,看门狗复位对芯片IO状态的影响?
这个问题比较重要. 有网友问: 大家好,我是做工业控制的,我想问一下STM32如何实现看门狗复位不初始化RAM区,因为是做控制的所以我们想实现CPU热复位后系统能接着原来的流程走,动作开出能不受看门狗 ...
- STM32的电源复位和引脚复位
在调试程序的时候,发现仿真的时候程序一切运行正常,当重新上电后,程序运行不正常 具体现象如下: 1.确定是进入while(1)了,因为有程序运行的秒闪灯在闪烁 2.应该是MCU无法正常收到的24L01 ...
- STM32F103ZE单片机在WWDG窗口看门狗的EWI中断中喂狗导致系统复位的原因及解决办法(中断函数重入问题)
版权声明:本文为博主原创文章,欢迎转载 https://blog.csdn.net/ZLK1214/article/details/78308058 程序开启了WWDG的Early wakeup ...
- 【操作系统】Linux内核和Windows系统的内核有什么区别?
本文内容转载自"拉勾教育"的讲义,更多课程信息请关注拉勾教育.本人在学习之余记记笔记,顺便当当搬运工! 目录 Linux内核和Windows系统的内核有什么区别? 什么是内核? 内 ...
- 计算机归零按键,上电复位和按键复位区别
描述 上电复位是指上电压从无到有在RESET处会先处于高电平一段时间,然后由于该点通过电阻接地,则RESET该点的电平会逐渐的改变为低电平,从而使得单片机复位口电平从1转到0,达到给单片机复位功能的一 ...
- android 系统复位(Reset 恢复出厂设置)9.0源码分析
今天来从源码的角度 分析一下android 系统复位的流程 1. 从点击 Reset 看起.点击Reset后,会弹出Erase everything.故而从在Setting中搜索此字段开始. 因为我这 ...
最新文章
- Android 多屏显示分析
- 解决windows图片查看器背景色变成米黄色
- ListView的使用和数据绑定
- 根据条件单元格的值改变单元格的显示色块和文字颜色等属性。
- java学习(126):throw向上抛出异常
- Oracle数据文件scn不一致,数据文件SCN的一致性问题
- 22套精美的网页按钮图标设计推荐(包括PSD和AI文件)
- RabbitMQ(三) 集群配置
- python变量的使用_python – 如何在变量中使用冒号(:)
- mysql 8 sql server_终于将 SQL Server 成功迁移至 MySQL8.0 啦!!!
- python3.6 asyncio paramiko_网工的Python之路:Concurrent.Futures
- C语言实现将彩色BMP位图转化为二值图
- 复利单利计算的功能解释
- 推荐一个强大的开源的录制、直播软件(obs-studio)
- 强化学习系列(五):蒙特卡罗方法(Monte Carlo)
- 反距离加权matlab算法,ImageWarping变形算法研究---反距离加权插值(IDW)
- WIFI 6有哪些新特征
- 排名第一《羊了个羊》我通关了
- ad18放置标尺(测量)
- SOPC设计02——硬件系统开发流程
热门文章
- 转载:Linux内核参数的优化(1.3.4)《深入理解Nginx》(陶辉)
- oracle学生成绩表的创建,oracle如何创建视图(1)创建视图V_StudInfo,查询学生的学号,姓名,所修课程号,所修课程名称,成绩等级(9...
- cad等比例缩放快捷键_原来CAD可以这样不等比例缩放!太方便了!这些技巧你都知道吗?...
- plc通讯的握手信号_MES与PLC握手的几种方式
- base operand of '-' has non-pointer type 'const Comple
- 如果input标签中有runat=”server”,则在服务端,Request.Form接收不到
- python爬去朋友圈_爬取朋友圈的内容
- 神州信息:让数字普惠金融真正普惠中小微企业
- 【天光学术】法学论文:计算机字库的著作权保护问题研究(节选)
- CiteSpace多数据库一键去重-知网、万方、维普数据库