STM8S复位总结

本文详细介绍了STM8S微控制器的复位机制,包括9种不同的复位源及其工作原理。文中还深入探讨了复位电路的设计,以及如何通过复位状态寄存器来确定最近一次复位的原因。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

STM8S共有9个复位源:

  • NRST引脚产生的外部复位 
  • 上电复位(POR) 
  • 掉电复位(BOR)
  • 独立看门狗复位
  • 窗口看门狗复位
  • 软件复位
  • SWIM复位
  • 非法操作码复位
  • EMS复位:当一些关键的寄存器被破坏或错误加载时产生的复位

所有的复位源最终都作用于NRST管脚,并在复位过程中保持低电平。复位入口向量在内存映射中位于固定的地址6000h。

STM8 复位电路
(图11:STM8 复位电路)

复位电路

  • 复位引脚NRST内部集成了弱上拉电阻RPU,即可作为输入,也可作为开漏输出。
    一个在复位引脚上宽度最小为500ns的低电平脉冲即可产生一个外部复位。对于复位的检测是异步进行的,因此即使MCU处于停机(Halt)模式,也有可能进入复位状态。
    复位引脚也可以作为开漏输出用于对外部设备进行复位。
    无论内部复位源是什么,一旦复位,内部复位电路都会产生一个至少脉宽为20us的复位脉冲。
    当没有外部复位发生时,内部弱上拉电阻可保证复位引脚处于高电平。
    请参考图11和见数据手册中的电特性参数章节来了解更多细节。

内部复位源

除了上电复位(POR)和掉电复位(BOR),每个内部复位源在复位状态寄存器中都有一个标志位与之相对应。复位时,根据导致复位的复位源,这些标志位被分别设置。因此,这些标志位可用于指示引起最后一次复位的复位源。通过软件写'1'可清除标志位。

  • 上电复位(POR)和掉电复位(BOR)
    • STM8在上电期间,POR保持设备处于复位状态,直到供电电压(VDD和VDDIO)到达BOR的启动电压。此时,BOR复位取代POR,POR自动关闭。
    • BOR复位一直持续到供电电压到达工作电压。详情请参见数据手册的电特性章节。
    • 当工作电压降到门限值VIT-以下时,BOR也将产生一个复位,此后POR模块将重新准备好以响应下一次上电复位。
    • 电压迟滞用以保证清楚地检测电压的上升和下降。
    • 即使是MCU处于低功耗模式,BOR也总是保持激活状态。

STM8 VDD/VDDIO电压检测:POR/BOR门限
(图12:STM8 VDD/VDDIO电压检测:POR/BOR门限 )

  • 看门狗复位
    • 详情请参见14独立看门狗(IWDG)和15窗口看门狗(WWDG)。
  • 软件复位
    • 应用程序可通过清除寄存器WWDG_CR中的T6位来触发一个复位,详情请参见15窗口看门狗(WWDG)。
  • SWIM复位
    • 连接到SWIM接口的外部设备可通过SWIM模块产生一个MCU复位。
  • 非法操作码复位
    • 为了提高STM8设备的可靠性,防止意外行为的发生,使用了非法操作码检测系统。如果一个被执行的代码与任意操作码或预置字节均不相符,则产生一个复位。此功能与看门狗相配合,可使设备从一个意外错误或干扰中恢复。
    • 注意:一个有效的预置字节与一个有效的操作码组成的一个非法的组合将不会产生复位。
  • EMS复位
    • 为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键寄存器都有一个互补寄存器与之相对应。系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。如果不匹配,则产生一个EMS复位,从而使应用程序恢复到正常操作。
### STM8S定时器复位方法及代码示例 对于STM8微控制器中的定时器,当需要停止当前计数并重新开始时,可以通过复位定时器来实现这一目的。这通常涉及到清除定时器寄存器的状态或将它们恢复到初始状态。 #### 复位操作的一般流程 为了有效地复位一个定时器,在软件层面主要涉及以下几个方面: - 清除更新标志(Update Flag),这是因为在某些情况下,即使硬件自动清除了此标志,也可能因为快速连续的操作而导致该标志再次被置位。 - 如果启用了预装载寄存器,则应确保这些寄存器也被适当初始化。 - 对于高级特性如DMA请求、捕获/比较通道等功能也需要相应处理其内部状态。 具体来说,针对不同类型的定时器有不同的做法。这里以通用定时器为例介绍如何进行复位操作[^3]。 #### 通用定时器(Timer2, Timer3, Timer5)的复位方式 对于通用定时器而言,可以直接访问特定的控制寄存器来进行复位动作。下面给出了一段用于复位Timer2的例子,其他同类定时器可参照此类方法调整相应的外设名称和地址偏移量。 ```c #include "stm8s.h" void TIM2_Reset(void){ /* 关闭定时器 */ TIM2->CR1 &= ~TIM_CR1_CEN; /* 清楚所有中断挂起位 */ TIM2->SR = 0; /* 设置ARR为初值 */ TIM2->ARR = 0xFFFF; /* 将CNT重置回零 */ TIM2->CNTR = 0x0000; /* 可选:如果使用了预加载功能则需同步 */ // TIM2->EGR |= TIM_EGR_UG; } ``` 上述函数`TIM2_Reset()`实现了关闭定时器、清除任何待处理的中断条件、将自动重载寄存器(ARR)设置为其最大可能值以便下次启动时能够获得最长的时间间隔,并最终把计数器(CNTR)归零。此外还展示了如何通过写入事件发生寄存器(EGR),使预装载寄存器的内容立即生效,但这一步骤并非总是必需的取决于实际应用场景的需求[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值