本帖最后由 RISCVLAR 于 2021-7-15 20:20 编辑
CH32V103应用教程——睡眠模式下串口数据传输
本章教程主要讲述如何通过按键控制进入/退出睡眠模式,同时演示正常模式下和睡眠模式下串口数据传输。注意,在睡眠模式下,进行串口数据传输时,当进入串口中断时,会唤醒退出睡眠模式,但不影响数据传输。本次教程所用中断是串口读数据寄存器非空时进入中断。
1、PWR-睡眠模式简介 CH32单片机进入睡眠模式后,所有的IO引脚都保持他们运行模式下的状态,所有的外设时钟,所以进入睡眠模式前,尽量关闭无用的外设时钟,以减低功耗。该模式唤醒所需时间最短。 进入:配置内核寄存器控制位 SLEEPDEEP=0,电源控制寄存器 PDDS=0,LPDS 决定内部调压器状态,执行 WFI 或 WFE,可选 SEVONPEND 和 SLEEPONEXIT。 退出:任意中断或者唤醒事件。 关于CH32V103 PWR睡眠模式具体信息,可参考CH32V103应用手册。
2、硬件设计 单片机长按PA1按键进入睡眠模式,PA0按键按下退出睡眠模式,同时进行串口2数据传输。
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按键长按 WFI 进入睡眠模式,PA0引脚输入低电平触发外部中断 EXTI_Line0 退出睡眠模式,
唤醒后程序继续执行。
*/
#include "debug.h"
#include "key.h"
#include "usart.h"
//用于检测按键是否被长时间按下
//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>=50) //按下时间足够
{
return 1; //检测到按键被时间长按下
}
}
else
{
upCnt++; //记录释放次数
if(upCnt>5) //连续检测到释放超过5次
{
return 0; //按下时间太短,不是按键长按操作
}
}
}
}
/*******************************************************************************
* Function Name : main
* Description : Main program.
* Input : None
* Return : None
*******************************************************************************/
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
Delay_Init();
USART_Printf_Init(115200);
KEY_GPIO_Init();
EXTI0_INT_INIT();
USARTx_CFG();
Delay_Ms(100);
USARTx_SendStr(USART2, "This is a test data.\n");
Delay_Ms(100);
printf("\r\nSystemClk:%d\r\n",SystemCoreClock);
printf("\r\nSleep Mode Test\r\n");
printf("\r\n 实验说明\r\n");
printf("\r\n 1.程序正常运行时可通过长按PA1按键进入睡眠模式:\r\n");
printf("\r\n 2.在睡眠模式下,可通过PA0唤醒\r\n");
printf("\r\n 3.在睡眠状态下,通过Link无法下载程序,需要唤醒后才能下载\r\n");
while(1)
{
//PA1 按键长按进入待机模式
if(KEY_LongPress())
{
printf("\r\n 进入睡眠模式,可通过PA0唤醒\r\n");
//进入睡眠模式
__WFI(); //WFI指令进入睡眠
}
}
}
Main.c文件主要包含三个函数:GPIO引脚全部拉低函数、按键长按检测函数、以及main函数。main函数包含函数初始化、相关状态信息显示。关于程序具体介绍,可见程序注释。
4、下载验证 将编译好的程序下载到开发板并复位,串口1主要打印相关提示信息,串口2主要进行数据传输,具体如下:
|