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)按键唤醒退出待机模式,如下图:
|