复位

HK32F030M是航顺一款入门级经济型32位MCU,使用ARM® Cortex®-M0内核,最高工作频率32 MHz,内置16 KByte Flash、448 Byte EEPROM和2 KByte SRAM。由于其超高的性价比,在工业、医疗、消费电子等行业得到广泛应用。

1.jpg

电路中复位时,复位源将最终作用于 NRST 引脚,并在复位过程中保持低电平。复位入口矢量被固定在地址 0x0000 0004。芯片内部的复位信号会在 NRST 引脚上输出。脉冲发生器保证每一个内部复位源都能有至少40μs的脉冲延时。当NRST引脚被拉低产生外部复位时,它将产生复位脉冲。复位电路如图所示:

2.jpg2.jpg

当产品电路中复位引脚悬空时,由于芯片复位引脚电路上有一个30K-40K弱上拉,如果产品受到外部较大干扰的时候,可能会引起复位引脚上电平波动,导致MCU产生复位现象。对于这种情况,请参考以下两种解决方案。

方案一:

硬件方法:修改硬件电路,在复位脚的外部加上R-C电路。参考如下:

3.png

方案二:

软件方法:通过IOMUX,将该复位引脚配置为普通IO,PA0,由于内部逻辑变化,该引脚上的电平波形不会导致MCU复位。需要注意的是,当NRST配置为PA0之后,需要在main函数的第一行加入延时,否则可能会导致再次下载程序失败。

以TSSOP20封装为例。

4.png

如果您对我们的产品感兴趣,请访问我们的官网或联系我们的销售代表获取更多信息。

来源:航顺芯片

免责声明:本文为转载文章,转载此文目的在于传递更多信息,版权归原作者所有。本文所用视频、图片、文字如涉及作品版权问题,请联系小编进行处理(联系邮箱:cathy@eetrend.com)。

围观 212

作者: strongerHuang

最近有朋友问了些关于STM32复位的问题,今天结合前面文章再次总结一下复位相关知识。

1、STM32的复位和时钟控制

RCC:Reset and Clock Control

每一块STM32中都有这么一个RCC复位和时钟控制模块。

STM32的复位为三类:系统复位、电源复位和后备域复位。

系统复位:

1. NRST引脚上的低电平(外部复位)
2. 窗口看门狗计数终止(WWDG复位)
3. 独立看门狗计数终止(IWDG复位)
4. 软件复位(SW复位)
5. 低功耗管理复位

电源复位:

1. 上电/掉电复位(POR/PDR复位)
2. 从待机模式中返回

备份区域复位:

1. 软件复位,备份区域复位可由设置备份域控制寄存器(RCC_BDCR)中的BDRST位产生。
2. 在VDD和VBAT两者掉电的前提下, VDD或VBAT上电将引发备份区域复位。

2、STM32的复位来源

在很多应用中,都会判断是什么引起的复位。

比如:判断为看门狗引起的复位,我们进行xxx操作。软件引起的复位,我们又执行xxx操作。

在STM32RCC模块中,有这么一个寄存器:控制/状态寄存器 (RCC_CSR):


这个寄存器就会记录各种复位的状态,我们直接读取这个寄存器(库函数有读寄存器接口)就能知道是什么引起的复位。

3、STM32的复位来源例程

之前我提供了一个简单Demo,STM32F103ZE(Keil)_复位来源(寄存器版):

http://pan.baidu.com/s/1hskScba


4、STM32系统和内核复位

内核复位:它会使STM32内核(Cortex-M)进行复位,而不会影响其外设,如GPIO、TIM、USART、SPI等这些寄存器的复位。

系统复位:这个复位会使整个芯片的所有电路都进行复位,系统默认的函数接口NVIC_SystemReset就是系统复位(位于core_cm*.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
}

内核复位与系统源代码和相近,差异在于SYSRESETREQ和SYSRESETREQ这两位。

关于复位的知识,在实际项目中应用的比较多。

可以结合上面提供例程理解,以及结合Cortex-M手册理解。

本文转自:公众号『strongerHuang』,转载此文目的在于传递更多信息,版权归原作者所有。

围观 1095

外部复位(External Reset) 

它是影响时钟模块和所有内部电路,属于同步复位,但外部Reset引脚为逻辑低电平。在引脚变为低电平后,CPU的复位控制逻辑单元确认复位状态直到Reset释放。复位控制逻辑保持复位低电平状态,在额外512个时钟周期内。因为当复位引脚为低电平时与MCU执行复位命令是相互冲突的,因此复位引脚必须保证520时间周期内低电平才能保证外部复位被外部总线辨识出来。

上电复位(Power-on reset) 

它是由外部总线产生的一种异步复位。单片机在电源电压VDD小于大约2.5V的时候复位,只要VDD电压不超过这个阈值,单片机就仍然保持复位状态。 

电压跌落的时间大概在纳米级(如果一旦出现了,马上会复位)。因此监测上电复位不能单片机内部,因为小于这个电压单片机逻辑功能。  

低电压复位(Low-Voltage Reset) 

它是部分单片级内部监控器形成的异步复位,单片机电压小于一定触发值时,单片机开始复位。 低电压的复位电平是和供电电压相关的,会有一个波动: 

软件复位(Software Reset) 

它是由软件看门狗定时器超时引起的一个异步复位。如果要开启软件复位,必须要注意设置软件内部寄存器,使之有效。这个功能主要是用来防止程序跑飞。  

双总线故障复位(Double Bus Fault Reset) 

它是由双总线错误监视器产生的异步复位,它是总线错误的特殊状态会导致中止异常处理。     
 
时钟丢失复位(Loss of Clock Reset) 

它在参考时钟子模块消失的时候产生的同步复位。如果要使该复位有效,需要设置寄存器SYNCR。  

关于更详细的外部Reset的资料可以这样描述(51单片机): 

为了确保良好的外部复位和上电复位,复位脉冲宽度必须足够宽,我们要考虑以下两个参数来确定复位脉冲宽度:  

tosc:振荡器才可达到Vih1或Vil1电压的时间。  

tvddrise:电压VDD由10上升至90%的时间。
  
当这两个参数的条件得到满足时,还必须维持至少一定的机器周期来保证单片机内部的启动。

如果是不正常的复位的话:

如果要具体的计算,关于LDO的Reset可参考前面关于拉普拉斯变换的计算过程。 

偷懒的话可以查表:

围观 469
订阅 RSS - 复位