提到复位,咱们都不会生疏,体系根本都有一个复位按键。复位的品种有许多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。本文讨论的便是在stm32中复位电路怎么规划。
STM32介绍
STM32系列根据专为要求高功能、低成本、低功耗的嵌入式运用专门规划的ARM Cortex®-M0,M0+,M3, M4和M7内核在STM32F105和STM32F107互连型系列微操控器之前,意法半导体现已推出STM32根本型系列、增强型系列、USB根本型系列、互补型系列;新系列产品沿袭增强型系列的72MHz处理频率。内存包括64KB到256KB闪存和 20KB到64KB嵌入式SRAM。新系列选用LQFP64、LQFP100和LFBGA100三种封装,不同的封装坚持引脚摆放一致性,结合STM32渠道的规划理念,开发人员经过挑选产品可从头优化功用、存储器、功能和引脚数量,以最小的硬件改动来满意个性化的运用需求。
stm32复位电路规划
复位电路的效果是为了是体系康复到初始状况的,单片机的复位办法也是存在好几种的:上电复位,体系复位,备份区域复位
上电复位:其产生的条件是,当体系上电、掉电,以及体系从待机形式回来时,产生电源复位。电源复位能够复位除了备份区域寄存器之外的一切寄存器的状况。
体系复位:以下任一作业产生时,均能产生一个体系复位:
1. NRST引脚上的低电平(外部复位)
2. 窗口看门狗计数停止(WWDG复位)
3. 独立看门狗计数停止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗办理复位
体系复位能够复位除时钟操控寄存器CRS中的复位标志和备份区域中的寄存器之外的一切寄存器。
备份区域复位:关于备份区域的复位,一种是在软件复位的时分设定备份区域操控寄存器中的对应位产生的;另一种是当电源和电池都掉电又从头上电时产生的。
往常咱们常用的复位办法有两种,一种是NRST引脚的低电平复位,经过按键复位电路给这个引脚一个低电平,让体系完结复位,另一种咱们都知道,那便是上电复位了,有时分是复位电路莫名失效了,有时是刚发动的时分,尽管用的没有按键复位电路多,不过也算是很常用的一种复位办法了。按键复位电路直接给图了,网上的解说可能把这电路图都讲烂了,我就不费口舌了。
电容充电时刻核算:T = 1.1RC = 1.1 * 10000 * 0.0000001 = 0.0011s = 1.1ms
STM32 内核复位 与 体系复位
内核复位与体系复位的差异
本文说的内核是指处理器内核,也便是MPU(Microprocessor Unit)。比方STM32F103,其内核便是Cortex-M3内核。
而这儿的体系便是包括内核和外设,也便是MCU(Microcontroller Unit),关于STM32F103来说,便是Cortex-M3内核+各种外设接口。
内核复位:只复位Cortex-M3处理器,而不复位外设如GPIO、TIM、USART、SPI等的寄存器。
体系复位:即复位Cortex-M3处理器,又复位外设寄存器。
因而,咱们常说的复位一般指的是体系复位。
内核复位与体系复位的函数源代码
本文以Cortex-M3(STM32F103)为例来阐明,其他芯片相似。
编写了4个复位函数,内核复位(C言语)、内核复位(汇编)和体系复位(C言语)、体系复位(汇编):
void NVIC_CoreReset(void); //内核复位(C言语)
void NVIC_CoreReset_a(void); //内核复位(汇编)
void NVIC_SystemReset(void); //体系复位(C言语)
void NVIC_SystemReset_a(void); //体系复位(汇编)
在ST官方库中的core_cm3.h文件中现已供给了NVIC_SystemReset的C言语源代码。
Cortex-M3答应由软件触发复位序列,用于特别的调试或保护。在Cortex-M3中,有两种办法能够完成自我复位。
榜首种办法:置位 NVIC 中运用程序中止与复位操控寄存器(AIRCR)的 VECTRESET 位(位偏移:0)。
NVIC_CoreReset内核复位
这种复位的效果规模覆盖了整个Cortex-M3处理器,除了调试逻辑之外的一切旮旯,可是它不会影响到Cortex-M3处理器外部的任何电路,所以STM32上的各片上外设和其它电路都不受影响。
编写的NVIC_CoreReset函数C言语源码:
staTIc __INLINE 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,这是和体系复位仅有的差异。
第二种办法:置位 NVIC 中运用程序中止与复位操控寄存器(AIRCR)的 SYSRESETREQ位(位偏移:2)。
NVIC_SysReset体系复位
体系复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会涉及整个芯片上的电路:它会使Cortex-M3处理器把送往体系复位产生器的恳求线置为有用。可是体系复位产生器不是Cortex-M3的一部分,而是由芯片厂商完成,因而不同的芯片对此复位的呼应也不同。因而,读者需求仔细参看芯片规格书,理解当产生片内复位时,各外设和功用模块都会回到什么样的初始状况,或许有哪些功用模块不受影响(比方,STM32系列的芯片有后备存储区,该区就被特别对待)。
大多数情况下,复位产生器在呼应 SYSRESETREQ 时,它也会一起把Cortex-M3处理器的体系复位信号(SYSRESETn)置为有用。一般,SYSRESETREQ不该复位调试逻辑。
这儿有一个要留意的问题:从SYSRESETREQ被置为有用到复位产生器履行复位指令,往往会有一个延时。在此延时期间,处理器依然能够呼应中止恳求。但咱们的原意往往是要让此次履行到此为止,不要再做任何其它作业了。所以,最好在宣布复位恳求前,先把FAULTMASK置位。能够选用下列汇编句子:__disable_fault_irq();。
core_cm3.h中供给的NVIC_SystemReset函数C言语源码:
staTIc __INLINE void NVIC_SystemReset(void)
{
SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos) |
(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |
SCB_AIRCR_SYSRESETREQ_Msk);
__DSB(); /* Ensure compleTIon of memory access /
while(1); /* wait until reset */
}
汇编版函数:
__asm void NVIC_SysReset_a(void)
{
LDR R0, =0xE000ED0C
LDR R1, =0x05FA0004
STR R1, [R0]
deadloop_Sys
B deadloop_Sys
}
结语
某些体系答应复位,但对外设又有特别要求:某一个IO状况不能由于复位而改动,某一个定时器计数器不能改动等。比如:A体系经过一个IO操控B体系的电源,而这个IO置高时才敞开B体系的电源。
正常作业进程中,B体系只要收到A体系关机指令使命才会进行关机(也便是说不能掉电关机),而A体系在作业进程中有复位的需求。
这个时分假如运用惯例的复位办法,就会复位IO,不符合要求。假如有一种办法只复位内核而不复位外设就好了。
关于stm32复位电路相关介绍就到这了,期望经过本文能让你对stm32复位电路有更深的知道,如有不足之处还望海涵。