1. 理解STM32F103的Stop模式与RTC闹钟唤醒
在实际的嵌入式开发中,低功耗设计是一个绕不开的话题。尤其是在电池供电的设备中,如何让芯片在空闲时进入低功耗模式,同时在需要时能够及时唤醒,成了开发者必须面对的挑战。STM32F103作为一款经典的ARM Cortex-M3内核微控制器,其Stop模式能够显著降低功耗,但唤醒机制需要仔细设计。
与STM32L0系列不同,F103没有直接的RTC唤醒Stop模式的功能。这意味着我们不能简单地调用类似HAL_RTCEx_SetWakeUpTimer_IT()这样的库函数来实现周期唤醒。但别担心,F103提供了另一种巧妙的解决方案:通过RTC闹钟触发EXTI17外部中断,从而实现从Stop模式的唤醒。
这种方法的本质是利用了STM32的中断系统。当RTC闹钟事件发生时,它会触发EXTI17中断,这个中断信号足以将芯片从Stop模式唤醒。虽然看起来绕了个弯,但实际效果与直接的RTC唤醒非常接近,只是在实现细节上需要多花些心思。
2. RTC闹钟与EXTI17中断的工作原理
要理解这个唤醒机制,我们首先需要了解RTC闹钟是如何工作的。STM32的RTC模块有一个32位计数器RTC_CNT,它由两个16位寄存器RTC_CNTL和RTC_CNTH组成。这个计数器在RTC时钟的驱动下不断累加,当它的值与闹钟寄存器RTC_ALR的值相等时,就会产生闹钟事件。
RTC时钟通常由32.768kHz的外部晶振提供。通过设置适当的分频系数,我们可以控制RTC_CNT的计数速度。例如,如果将RTCCLK进行32768分频,就会得到1Hz的时钟信号,此时RTC_CNT每秒加1。如果我们设置分频系数为8192,则会得到4Hz的时钟,RTC_CNT每250ms加1。
当闹钟事件发生时,它会连接到EXTI17中断线。EXTI是STM32的外部中断/事件控制器,负责处理各种外部中断信号。EXTI17专门用于处理RTC闹钟事件,当闹钟触发时,EXTI17会产生中断请求,这个中断可以将芯片从Stop模式唤醒。
需要注意的是,在进入Stop模式前,我们需要正确配置RTC闹钟和EXTI17中断。这包括设置闹钟时间、使能闹钟中断、配置EXTI17中断线,以及设置合适的中断优先级。只有所有这些配置都正确,唤醒机制才能可靠工作。
3. 硬件配置与CubeMX设置
使用STM32CubeMX工具可以大大简化配置过程。首先我们需要启用RTC模块,并设置合适的时钟源。通常选择LSE(低速外部时钟)作为RTC时钟源,也就是那个32.768kHz的晶振。然后设置分频系数,这将决定RTC计数器的计数速度。
在NVIC设置中,我们需要使能RTC闹钟中断。这个中断对应的是EXTI17中断线,所以实际上我们是在使能EXTI17的中断。同时,我们还需要设置合适的中断优先级,确保唤醒中断能够及时得到处理。
对于低


1495

被折叠的 条评论
为什么被折叠?



