1)实验平台:正点原子APM32E103最小系统板
2)平台购买地址:https://detail.tmall.com/item.htm?id=609294757420
3)全套实验源码+手册+视频下载地址: http://www.openedv.com/docs/boards/xiaoxitongban
本章介绍APM32E103低功耗模式中的停止模式,进入停止模式后,所有的时钟都将被停止以降低功耗,在停止模式下可以被任意中断唤醒。通过本章的学习,读者将学习到低功耗模式中停止模式的使用。
本章分为如下几个小节:
30.1 硬件设计
30.2 程序设计
30.3 下载验证
30.1 硬件设计
30.1.1 例程功能
#include "apm32e10x.h"
#include "apm32e10x_pmu.h"
void example_fun(void)
{
/* 配置以WFI方式进入停止模式,同时配置调压器进入低功耗模式 */
PMU_EnterSTOPMode(PMU_REGULATOR_LOWPOWER, PMU_STOP_ENTRY_WFI);
}
30.2.2 PMU驱动
本章实验的PMU驱动主要负责向应用层提供停止模式唤醒按键的初始化和进入停止模式的函数,同时实现唤醒按键的中断回调函数。本章实验中,PMU的驱动代码主要包括pmu.c和pmu.h两个文件。
因为本章实验中停止模式的唤醒方式与上一章实验中睡眠模式的唤醒方式一致,都是可以由任意的中断唤醒,且均使用了KEY_UP按键的外部中断进行唤醒,因此本章实验中停止模式唤醒按键的相关宏定义、停止模式唤醒按键的初始化及其中断回调函数均与上一章实验一致,因此请读者自行查看上一章中的相关内容。
PMU驱动中,进入睡眠模式的函数,如下所示:
/**
int main(void)
{
uint8_t key;
uint8_t t = 0;
NVIC_ConfigPriorityGroup(NVIC_PRIORITY_GROUP_4); /* 设置中断优先级分组为组4 */
sys_apm32_clock_init(15); /* 配置系统时钟 */
delay_init(120); /* 初始化延时功能 */
usart_init(115200); /* 初始化串口 */
led_init(); /* 初始化LED */
lcd_init(); /* 初始化LCD */
key_init(); /* 初始化按键 */
pmu_wkup_key_init(); /* 初始化唤醒按键 */
lcd_show_string(30, 50, 200, 16, 16, "APM32", RED);
lcd_show_string(30, 70, 200, 16, 16, "STOP TEST", RED);
lcd_show_string(30, 90, 200, 16, 16, "ATOM@ALIENTEK", RED);
lcd_show_string(30, 110, 200, 16, 16, "KEY0:Enter STOP MODE", RED);
lcd_show_string(30, 130, 200, 16, 16, "KEY_UP:Exit STOP MODE", RED);
while (1)
{
key = key_scan(0);
if (key == KEY0_PRES)
{
LED1(0); /* 点亮LED1,提示进入停止模式 */
pmu_enter_stop(); /* 进入停止模式 */
LED1(1); /* 熄灭LED1,提示退出停止模式 */
}
if ((t % 20) == 0)
{
LED0_TOGGLE();
}
t++;
delay_ms(10);
}
}
从上面的代码中可以看出,在完成相关的初始化操作后,便不断地扫描按键,若扫描到KEY0按键被按下,则会点亮LED1后进入停止模式,此时所有的时钟将会停止,从该停止模式唤醒需要有任意的中断产生,因此可以由KEY_UP按键产生外部中断来唤醒停止模式。退出停止模式后,LED1将被熄灭。
30.3 下载验证
在完成编译和烧录操作后,可以看到LED0闪烁提示系统正在运行,此时可以按下KEY0按按键,可以看到LED1亮起,但LED0不再闪烁,这是因为系统已经进入停止模式了,此时再按下KEY_UP按键,即可从停止模式下唤醒,可以看到LED1熄灭,LED0继续闪烁。