一、复位

(1)什么是单片机的复位

STM32单片机的复位(Reset)是指将微控制器重置到其初始启动状态的过程。复位行为会导致所有运行中的程序终止,并将微控制器的寄存器和功能恢复到初始值。复位过程为程序提供了一个已知的起始状态,从而可以安全地开始或重新开始执行代码。
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。
系统复位:
当发生以下任一事件时,产生一个系统复位:(可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。)

  1. NRST引脚上的低电平(外部复位)
  2. 窗口看门狗计数终止(WWDG复位)
  3. 独立看门狗计数终止(IWDG复位)
  4. 软件复位(SW复位)
    • 通过将Cortex™-M3中断应用和复位控制寄存器中的SYSRESETREQ位置’1’,可实现软件复位。
  5. 低功耗管理复位
    • 在进入待机模式时产生低功耗管理复位:通过将用户选择字节中的nRST_STDBY位置’1’将使能该复位。这时,即使执行了进入待机模式的过程,系统将被复位而不是进入待机模式。
    • 在进入停止模式时产生低功耗管理复位:通过将用户选择字节中的nRST_STOP位置’1’将使能该复位。这时,即使执行了进入停机模式的过程,系统将被复位而不是进入停机模式

电源复位:
当以下事件中之一发生时,产生电源复位:

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

备份域复位:
备份区域拥有两个专门的复位,它们只影响备份区域。
当以下事件中之一发生时,产生备份区域复位。

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

复位电路:

复位成功之后单片机又在干什么呢:

  • 所有的I/O引脚将被配置为默认状态(大多数为浮空输入)。
  • 大多数寄存器将被设置为它们的默认复位值。
  • 微控制器停止执行当前程序并重新启动。
  • 微控制器开始从其预设的启动地址执行代码,通常是启动加载程序或主程序的入口点。

复位是微控制器可靠性和稳定性的关键特性,它确保了即使在发生严重错误或异常情况后,设备也能够恢复到一个已知且安全的工作状态。在STM32等微控制器的应用开发中,理解和正确实现复位机制对于创建健壮的系统至关重要。

(2)外部复位电路设计

说了那么多复位(我都快不认识这俩字了),我们最经常使用的还是上电/掉电复位和外部复位,而外部复位则完全是由NRST引脚上的电平的高低决定,当NRST引脚上的电平小于0.8V,输入脉冲时间为100ns时,单片机外部复位。

下面请看电路图:

虽然上面讲了一大堆,但至少电路图还是很简单的嘛?
先看电阻R2,这个电阻做为上拉电阻将NRST引脚拉高(图中标识为RESET)

#上拉电阻(Pull-up Resistor)通过连接到正电源电压(通常是Vcc)来确保电路中的一个节点在没有其他输入的情况下具有一个高电平(逻辑高)状态。

其实32单片机在内部已经对NRST引脚进行了上拉,为什么我们还要在外部对这个引脚进行上拉呢?

简单来说这是因为内部上拉可能不足以保证系统在所有操作条件下的可靠性。因此,即使的NRST引脚内部已经有上拉电阻,仍然推荐在外部对NRST引脚进行上拉。
那这个电阻为什么选用10k的阻值
选择10kΩ作为上拉电阻的原因是它提供了一个合理的折中方案,我们需要考虑到功耗、输入电压的拉高能力、以及按钮按下时的电流等多种因素,较大的电阻值可以降低静态功耗。当按钮未按下时,电流通过上拉电阻流向微控制器的NRST引脚。如果电阻值较小,这个电流会变大,会消耗更多的功率,当按钮被按下时,上拉电阻和微控制器的NRST引脚之间会形成一个电流回路。电阻越小,流过按钮的电流越大。这个电流不应该太大,不然会造成不必要的功耗和可能的损害。但是电阻也需要足够小以确保即使在最大允许的输入漏电流发生时,也能将NRST引脚的电压拉高到识别为高电平的水平。所以10k刚刚好。


再来看电容C2和按键,按键起到使NRST引脚接地的作用,但是按键在按下时存在按键抖动,电容在这里可以消抖

#按键抖动(Bouncing)是指在机械开关或按钮操作时,由于机械接触点的不完美接触,造成的电信号在短时间内的快速波动。

电容的型号是105,所以此电容的容量大小为1微法,为什么选用105电容,而不选用更大或者更小的?
选择电容器时,目标是找到一个合适的容值,使得电容器能够在按钮按下时有效地去抖,并且在释放时能够迅速为微控制器的复位引脚提供稳定的高电平信号。1μ是一个最优的选择,因为:

对于更大的电容值:

  • 延长去抖时间:更大的电容器会增加电路的去抖时间,导致复位信号延迟,增大按钮按下到复位动作之间的延时。
  • 增加电源冲击:按钮释放时,较大的电容器需要更多时间来充电,会导致电源线上出现较大的电流尖峰,影响电源稳定性或其他电路部分。
  • 物理尺寸:更大容量的电容器可能也具有更大的物理尺寸,不适合紧凑的电路板设计。

对于更小的电容值

  • 不充分的去抖:如果电容太小,无法提供足够的去抖效果,导致短时间内的联系不稳定或多次触发复位。
  • 更快的响应时间:虽然较小的电容值可以减少去抖时间,提供更快的响应,但如果过小,可能无法滤除因机械接触不良造成的电压波动。

选择1μF的电容是基于这样的考虑:它提供了足够的去抖效果,同时又不会过分延长复位信号的响应时间。这个值也考虑到了电容器的充电和放电时间,使得按钮释放后NRST引脚可以迅速恢复到高电平状态。
咱们也可以脑内仿真一下:
按钮按下的瞬间,NRST引脚的电压应当还是VCC,因为C2接在NRST与地之间(电容两端电压不跳变)电压随着C2放电而下降,不过由于电容并联在按钮两端,这相当于电容两端短路,及时相比按键抖动的时间都是很短的(一般微动开关按键抖动时间在5-10ms),所以低电平持续100ns后单片机复位,100ns之后,按键仍在抖动中,当抖动使按键断开时vcc通过10k电阻给电容充电,那我们可以计算一下电容充电至0.8v需要多久:
要计算电容充电到特定电压所需的时间,我们可以使用RC电路的充电方程:

[ V(t) = V_{\text{max}} \times \left(1 - e^{-\frac{t}{RC}}\right) ]

其中:
( V(t) ) 是时间 ( t ) 处的电压。
( V_{\text{max}} ) 是电源电压,这里是 3.3V。
( R ) 是电阻的值,这里是 10kΩ(10000Ω)。
( C ) 是电容的值,105表示电容值为10×10^5 pF,即1μF(1×10^-6 F)。
( e ) 是自然对数的底数,约等于 2.71828。
( t ) 是时间,单位是秒。

我们要求解的是电容充电到0.8V所需的时间 ( t )

首先,我们将所有已知的值代入方程中:

[ 0.8V = 3.3V \times \left(1 - e^{-\frac{t}{10000 \times 1 \times 10^{-6}}}\right) ]

为了求解 ( t ),我们首先解开方程中的 ( e ):

[ e^{-\frac{t}{10000 \times 1 \times 10^{-6}}} = 1 - \frac{0.8V}{3.3V} ]

[ e^{-\frac{t}{0.01}} = 1 - \frac{0.8}{3.3} ]

[ e^{-\frac{t}{0.01}} = 1 - 0.2424 ]

[ e^{-\frac{t}{0.01}} = 0.7576 ]

现在,取自然对数来解 ( t ):

[ -\frac{t}{0.01} = \ln(0.7576) ]

[ t = -0.01 \times \ln(0.7576) ]

使用计算器计算 ( \ln(0.7576) ) 的值大约为 -0.2776,所以:

[ t = -0.01 \times (-0.2776) ]

[ t = 0.002776 \text{秒} ]

或者

[ t \approx 2.776 \text{毫秒} ]

一通计算我们得到大约需要2.776毫秒充电到0.8V。当然这是一个理论计算,在实际电路中,电阻和电容的公差、电源电压的波动等因素都可能影响这个时间。所以我们可以推断出105 的电容足够使按键闭合后抖动时的电压维持在0.8v以下,使单片机不会反复复位。
当按钮弹开后,也可以稳定上拉电压不会反复横跳。

一切的理论计算都需要以实践为落脚点,最合适的电容值还是取决于具体的应用场景和电路设计。在实际的电路设计中,我们需要通过实验和调整来确定最佳的电容值。就比如复位按钮的机械特性不同(例如,不同的开关弹跳特性),我们就需要调整电容器的值以优化性能。