草帽王子 发表于 2021-7-31 19:31:34

第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式

本章教程主要讲述如何通过按键控制进入/退出待机模式,同时通过串口打印显示不同状态。

1、PWR-待机模式简介CH32待机模式和STM32待机模式有所区别,CH32待机模式对比其停止模式,唯一的差别在于:在某些指定的唤醒条件下退出后,微控制器将被复位,并且执行的是电源复位,因此,CH32在待机模式下IO口保持原来状态。而STM32在待机模式下,所有IO口引脚状态都处于高阻态,除了以下引脚:
● 复位引脚(始终有效)
● 当被设置为防侵入或校准输出时的TAMPER引脚
● 被使能的唤醒引脚


关于CH32V103 PWR待机模式具体信息,可参考CH32V103应用手册。

2、硬件设计


单片机长按PA1按键进入待机模式,PA0按键按下退出待机模式,不通状态下串口打印信息显示。

3、软件设计


本次实验具体程序如下,主要介绍main函数:
Main.c文件
/********************************** (C) COPYRIGHT*******************************

* File Name          : main.c

* Author             : WCH

* Version            : V1.0.0

* Date               : 2019/10/15

* Description      : Main program body.

*******************************************************************************/



/*

*@Note

低功耗,待机模式例程:

本例程演示长按PA1按键进入待机模式,WKUP(PA0)引脚上升沿,退出待机模式, 唤醒后程序复位。

注:为尽可能的降低功耗,建议将不用的GPIO设置成上拉、下拉、模拟输入或设置成输出模式。

*/



#include "debug.h"

#include "key.h"



void GPIO_ALL_Init(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;



    //为降低功耗,需将不用的GPIO设置成上拉或下拉输入

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;



    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_Init(GPIOB, &GPIO_InitStructure);

    GPIO_Init(GPIOC, &GPIO_InitStructure);

}



//用于检测按键是否被长时间按下

//1 :按键被长时间按下0 :按键没有被长时间按下

static uint8_t KEY_LongPress(void)

{

    uint8_t downCnt =0;                                       //记录按下的次数

    uint8_t upCnt =0;                                           //记录松开的次数



    while(1)                                                    //死循环,由return结束

    {

      Delay_Ms(10);                                           //延迟一段时间再检测



      if(GPIO_ReadInputDataBit ( GPIOA, GPIO_Pin_1 ) == SET)//检测到按下按键

      {

            downCnt++;                                          //记录按下次数

            upCnt=0;                                          //清除按键释放记录



            if(downCnt>=100)                                    //按下时间足够

            {

                return 1;                                       //检测到按键被时间长按下

            }

      }

      else

      {

            upCnt++;                                          //记录释放次数

            if(upCnt>5)                                       //连续检测到释放超过5次

            {

                return 0;                                       //按下时间太短,不是按键长按操作

            }

      }

    }

}



/*******************************************************************************

* Function Name: main

* Description    : Main program.

* Input          : None

* Return         : None

*******************************************************************************/

int main(void)

{



    RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);

    GPIO_ALL_Init();

    Delay_Init();

    USART_Printf_Init(115200);

    KEY_GPIO_Init();



    printf("SystemClk:%d\r\n",SystemCoreClock);

    printf("Standby Mode Test\r\n");



    printf("\r\n 实验说明\r\n");

    printf("\r\n 1.长按 PA1 按键进入待机模式 \r\n");

    printf("\r\n 2.在待机模式下,PA0 接 VCC 可唤醒,唤醒后系统会进行复位,程序从头开始执行 \r\n");

    printf("\r\n 3.可通过检测WU标志位确定复位来源 \r\n");

    printf("\r\n 4.在待机状态下,通过Link无法下载程序,需要唤醒后才能下载 \r\n");



    //检测复位来源

    if(PWR_GetFlagStatus(PWR_FLAG_WU) == SET)      //若检测到唤醒事件,PA0引脚上升沿

    {

      printf("\r\n Standby wake up reset \r\n");

    }

    else

    {

      printf("\r\n Power on reset \r\n");

    }



    while(1)

    {

      //PA1 按键长按进入待机模式

      if(KEY_LongPress())

      {



            printf("\r\n 即将进入待机模式,进入待机模式后可按PA0唤醒,唤醒后会进行复位,程序从头开始执行\r\n");



            Delay_Ms(10);



            //清除WU状态位

            PWR_ClearFlag (PWR_FLAG_WU);



            //使能WKUP引脚的唤醒功能 ,使能PA0*

            PWR_WakeUpPinCmd (ENABLE);



            //进入待机模式

            PWR_EnterSTANDBYMode();

      }



      //正常模式

      Delay_Ms(1000);

      printf("Run in main\r\n");

    }

}
Main.c文件主要包含三个函数:GPIO引脚全部拉低函数、按键长按检测函数、以及main函数。main函数包含函数初始化、相关状态信息显示。代码理解见注释。

4、下载验证

将编译好的程序下载到开发板并复位,串口打印情况具体如下:
长按PA1按键,进入待机模式,串口打印信息如下:
由打印信息可知,提示进入待机模式,可按PA0(WK_UP)按键唤醒退出待机模式,如下图:




页: [1]
查看完整版本: 第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式