ⅰ写在前面
某些系统允许复位,但对外设又有特殊要求:某一个io状态不能因为复位而改变,某一个定时器计数器不能改变等。
例子:我一个a系统通过一个io控制另一个b系统的电源,而这个io置高时才开启b系统的电源。
正常工作过程中,b系统只有收到a系统关机命令任务才会进行关机(也就是说不能掉电关机),而a系统在工作过程中有复位的需求。
这个时候如果我使用常规的引脚复位,就会使io置低,不符合要求,就需要使用到本文说到的内核复位。
ⅱ关于复位
说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。
复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。
上面说的复位按键,也就是对应复位引脚复位;而本文说的内核复位与系统复位是属于软件复位。
ⅲ内核与系统复位区别
本文说的内核是指处理器内核,拿stm32f1处理器来说,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语言版函数:
voidnvic_corereset(void)
{
__dsb();
//置位vectreset
scb->aircr = ((0x5fa
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_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
}
细心的朋友可能会发现:
内核复位与系统源代码和相近,差异在于sysresetreq和sysresetreq这两位。
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
提示:如果网盘链接失效,可以微信公众号“底部菜单”查看更新链接。
有哪些1000元左右的蓝牙耳机推荐?便宜好用的真无线蓝牙耳机!
KT142C-sop16语音芯片ic的功能介绍 支持pwm和dac输出 usb直接更新内置空间
三相四线电表怎么偷电及常见偷电方法
小米折叠屏新机已适配MIUI
小米或华为,谁才是AIoT的赢家
CM3(STM32) 内核复位与系统复位区别及应用
混频器噪声系数那些事
提升SD-WAN网络可控性的6大方式介绍
人民网开始进军人工智能
华为P30最新谍报:10X无损变焦强大 高配版破万元
使用增强型主参考时钟(ePRTC)标准,通过精确时间架构应对5G弹性挑战
秦山核电厂扩建项目正式通过专家组的认定并投入运行 剩余机组将继续开展逻辑优化
WTN6系列OTP语音芯片在智能锁的应用
售价2799元的苹果智能音箱HomePod能否斩获中国市场?
不良视觉环境(DVE)的直升机合成视觉航电设备解决方案
超级源随SSF稳定性补偿分析(二)
6514高阻计/电压表/静电计的性能特点及应用
MADGaze开启最新款混合现实智能眼镜众筹 官宣目前双目智能眼镜中最轻
SOD-323封装系列 TVS二极管阵列 型号齐全
降噪蓝牙耳机排行榜10强 实用的降噪耳机品牌排行