1.了解STM32的低功耗模式; 2.学会让单片机进入待机模式; 3.学会让单片机从待机模式唤醒。
利用delay_ms延时和printf打印输出5秒倒计时后进入待机模式,然后利用按键来实现唤醒。
/******************************************************************************* * -------------------------------------------------------------------------------- * 实 验 名 : 待机唤醒-低功耗实验 * 实验说明 : 通过配置好内部待机模式,printf打印倒计时数据后进入待机模式 , 在串口助手上显示其时间和待机模式输出 ,进入待机模式后按下复位开关重新运行 见文件内截图 ,程序设计中所有中断函数都放在中断stm32f10x_it.c文件 * 连接方式 : * 注 意 : 所用函数在头文件.c文件内 *******************************************************************************/ #include "public.h" #include "printf.h" #include "systick.h" #include "lowpower.h" /**************************************************************************** * Function Name : main * Description : Main program. * Input : None * Output : None * Return : None ****************************************************************************/ int main() { printf("Ttime: 5\r\n"); delay_ms(1000); //隔1秒显示计数 printf("Time: 4\r\n"); delay_ms(1000); printf("Time: 3\r\n"); delay_ms(1000); printf("Time: 2\r\n"); delay_ms(1000); printf("Time: 1\r\n"); delay_ms(1000); printf("进入系统待机模式\r\n"); standmodeinit();//待机模式配置 }
#include "lowpower.h" /******************************************************************************* * 函 数 名 : standmodeinit * 函数功能 : 待机模式配置初始化 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ void standmodeinit() //待机模式 { NVIC_SystemLPConfig(NVIC_LP_SLEEPDEEP,ENABLE); //选择系统进入低功耗模式的条件 RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR,ENABLE); //使能PWR外设时钟 PWR_WakeUpPinCmd(ENABLE); //使能唤醒管脚 使能或者失能唤醒管脚功能 PWR_EnterSTANDBYMode(); //进入待机模式 }
注意:
进入待机后,JTAG 连接被断开,下载程序时,需要在 Keil 中设置
Debug --> Use --> J-LINK/J-Trace Cortex --> Settings --> Port --> JTAG/SW/JTAG
1. 使用 1根1P 杜邦线连接核心板 PA0与“独产按键”单元 JP69(K1)。 2. 使用 1根2P 杜邦线连接核心板 PA2连接“两路串行通信”单元的TXD1,PA3与 RXD1连接。(printf 输出定义在USART2上面) 3. “两路串行通信”单元中的卧式开关打在“串行”上,串口线DB1同电脑连接。 4. 在KEIL软件中调试运行“待机唤醒-低功耗”工程文件。 5. 实验现象:打开PC端串口调试助手 选择连接串口,设置波特率为9600,字符串显示。按下K1按钮重复进入倒计时进入待机模式。
1. 按上述步骤调试出结果; 2. 更改唤醒的按键(如K1改为K3),分析如何关闭按键唤醒; 3. 在串口终端显示倒计时的同时,静态数码管同步显示倒计时,并且倒计时结束进入待机状态时,数码管灭; 按键唤醒后数码管亮,同时串口终端和数码管开始倒计时,如:9、8、7、6、5、4、3、2、1、0、S、L、E、E、P。
任务2:
1). 将连 PA0 的杜邦线接 K3 即可; 2). 注释掉 lowpower.c 中的 PWR_WakeUpPinCmd(ENABLE) 即可。
任务3:
第1步:配置
1). 将前面学过的静态数码管功能文件 **smg.c** 加入 APP 中; 2). 用1根8p杜邦线连接 PC0~PC7 与 “一位共阳数码管”单元 JP44 的 A~DP。
第2步:修改主函数为:
#include "smg.h" // 加入头文件 int main() { printf_init(); //printf初始化 smg_init(); //初始化数码管 while(1) { static_smg_display(); // 调用数码管,并将串口终端打印倒计时放在该函数中 printf("进入系统待机模式\r\n"); standmodeinit(); //待机模式配置 } }
第3步:修改数码管函数为
#include "smg.h" /******************************************************************************* * 函 数 名 : smg_init * 函数功能 : 数码管端口初始化函数 * 输 入 : 无 * 输 出 : 无 *******************************************************************************/ u8 smgduan[16]={0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F, 0x77, 0x7C, 0x39, 0x5E, 0x79, 0x71}; // 0~F 数码管段选数据 void smg_init() { GPIO_InitTypeDef GPIO_InitStructure; //声明一个结构体变量,用来初始化GPIO RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE); // 开启GPIO时钟 /* 配置GPIO的模式和IO口 */ GPIO_InitStructure.GPIO_Pin=smg_duan; //选择你要设置的IO口 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOC,&GPIO_InitStructure); // 初始化GPIO } void static_smg_display() //静态数码管显示 { u8 i; for(i=16;i>0;i--) // 从 0d16 --> 0d1,即 0xF --> 0x1 { printf("time: %d\r\n",i); // 串口打印 GPIO_Write(GPIOC,(u16)(~smgduan[i])); // 数码管显示 delay_ms(1000); } }
静态数码管的段选数据表
数字 | dp | g | f | e | d | c | b | a |
---|---|---|---|---|---|---|---|---|
0 | 灭 | 灭 | 亮 | 亮 | 亮 | 亮 | 亮 | 亮 |
1 | 灭 | 灭 | 灭 | 灭 | 灭 | 亮 | 亮 | 灭 |
2 | 灭 | 亮 | 灭 | 亮 | 亮 | 灭 | 亮 | 亮 |
3 | 灭 | 亮 | 灭 | 灭 | 亮 | 亮 | 亮 | 亮 |
4 | 灭 | 亮 | 亮 | 灭 | 灭 | 亮 | 亮 | 灭 |
5 | 灭 | 亮 | 亮 | 灭 | 亮 | 亮 | 灭 | 亮 |
6 | 灭 | 亮 | 亮 | 亮 | 亮 | 亮 | 灭 | 亮 |
7 | 灭 | 灭 | 灭 | 灭 | 灭 | 亮 | 亮 | 亮 |
8 | 灭 | 亮 | 亮 | 亮 | 亮 | 亮 | 亮 | 亮 |
9 | 灭 | 亮 | 亮 | 灭 | 亮 | 亮 | 亮 | 亮 |
共阴数码管 | 共阳数码管 | |||
---|---|---|---|---|
数字显示 | 二进制 | 十六进制 | 二进制 | 十六进制 |
0 | 00111111 | 0x3F | 11000000 | 0xC0 |
1 | 00000110 | 0x06 | 11111001 | 0xF9 |
2 | 01011011 | 0x5B | 10100100 | 0xA4 |
3 | 01001111 | 0x4F | 10110000 | 0xB0 |
4 | 01100110 | 0x66 | 10011001 | 0x99 |
5 | 01101101 | 0x6C | 10010010 | 0x92 |
6 | 01111101 | 0x9B | 10000010 | 0x82 |
7 | 00000111 | 0x07 | 11111000 | 0xF8 |
8 | 01111111 | 0x7F | 10000000 | 0x80 |
9 | 01101111 | 0x6F | 10010000 | 0x90 |