目录

待机唤醒实验

实验目的

1.了解STM32的低功耗模式;
2.学会让单片机进入待机模式;
3.学会让单片机从待机模式唤醒。

实验内容

利用delay_ms延时和printf打印输出5秒倒计时后进入待机模式,然后利用按键来实现唤醒。

实验说明

main.c
/*******************************************************************************
*               		      
--------------------------------------------------------------------------------
* 实 验 名      : 待机唤醒-低功耗实验
* 实验说明      : 通过配置好内部待机模式,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();//待机模式配置		
}

lowpower.c
#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步:修改主函数为:

任务3_main.c
#include "smg.h" // 加入头文件
int main()
{	
    printf_init();  //printf初始化
    smg_init(); //初始化数码管
    while(1)
    {
        static_smg_display(); // 调用数码管,并将串口终端打印倒计时放在该函数中
        printf("进入系统待机模式\r\n");	
        standmodeinit();    //待机模式配置	
    }			
}

第3步:修改数码管函数为

任务3_smg.c
#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