本文详细介绍了在使用STM32微控制器时实现低功耗模式下有效唤醒的三种策略和技巧,帮助开发者优化能耗并提高设备能效。
设计要求如下:系统需按以下方式进入与退出睡眠模式:
1. 系统启动后2秒内配置RTC,在3秒之后触发一个报警事件。
2. 通过WFI指令使系统进入停机模式。
3. 若要唤醒系统至正常工作状态,可以通过按下Key按钮;否则在设定的时刻,RTC将自动产生报警中断以唤醒系统。
4. 当从停机模式退出后,系统时钟恢复到先前的状态(此时外部高速振荡器HSE和PLL是不可用的)。
5. 系统将在一段延时之后再次进入停机状态,并可重复上述操作无限次。
硬件电路设计采用与7.1小节应用实例相同的硬件配置。Key按钮通过PB9产生一个外部中断信号,LED1、LED2、LED3和LED4用于指示处理器模式及中断触发情况。
软件程序的设计包括以下内容:
- 配置GPIOB口及相关引脚。
- 初始化RTC模块与设置报警事件。
- 设置PB端口的第9个引脚作为外部中断输入,并配置其为下降沿触发;同时,配置RTC以上升沿方式产生报警中断信号。
本项目包含三个源文件:STM32F10x.s、stm32f10x_it.c和main.c。其中STM32F10x.s是启动代码,所有中断服务子程序位于stm32f10x_it.c中;其余函数则在main.c中实现。
具体来说:
- 函数SYSCLKConfig_STOP负责配置系统时钟、启用HSE及PLL,并将PLL设为系统时钟源。
- GPIO_Configuration用于设置GPIO的PC6至PC9和PB9引脚的功能。
- EXTI_Configuration用来配置外部中断线9(对应PB9)与17(RTC报警事件)的相关参数。
- NVIC_Configuration负责配置NVIC及中断向量表,主要是针对外部中断线9和17进行设置。
- 函数EXTI9_5_IRQHandler处理由Key按钮触发的中断,主要任务是切换LED2的状态。
- RTCAlarm_IRQHandler则响应RTC产生的报警事件,并翻转LED3的状态;同时清除唤醒标志。
运行时步骤:
1. 使用Keil uVision3通过ULINK 2仿真器连接EduKit-M3实验平台。打开PWR_TEST目录下的项目,进行编译链接操作;
2. 在软件调试模式下启动程序,在逻辑分析仪中监视GPIOC的输出状态变化,并使用Peripherals-General Port-GPIOB模拟按钮动作;
3. 切换到硬件调试模式下载并运行代码,观察LED的状态切换情况。注意进入停机模式后无法通过仿真器进行后续调试。
4. 将编译好的程序烧录至目标平台Flash中复位设备,并检查LED灯的行为是否符合预期:系统正常工作时LED1亮而LED4灭;处于休眠状态则相反;按下按钮或发生RTC报警事件会相应地改变特定的指示灯。