[RISC-V MCU 应用开发] 第一百零六章、CH32V103应用教程——睡眠模式下串口数据传输

[复制链接]
3843|0
 楼主| RISCVLAR 发表于 2021-7-15 20:20 | 显示全部楼层 |阅读模式
本帖最后由 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文件
  1. /********************************** (C) COPYRIGHT  *******************************
  2. * File Name          : main.c
  3. * Author             : WCH
  4. * Version            : V1.0.0
  5. * Date               : 2019/10/15
  6. * Description        : Main program body.
  7. *******************************************************************************/

  8. /*
  9. *@Note
  10. 低功耗,睡眠模式例程:
  11. 本例程演示 PA1按键长按 WFI 进入睡眠模式,PA0引脚输入低电平触发外部中断 EXTI_Line0 退出睡眠模式,
  12. 唤醒后程序继续执行。
  13. */

  14. #include "debug.h"
  15. #include "key.h"
  16. #include "usart.h"

  17. //用于检测按键是否被长时间按下
  18. //1 :按键被长时间按下  0 :按键没有被长时间按下
  19. static uint8_t KEY_LongPress(void)
  20. {
  21.     uint8_t downCnt =0;                                         //记录按下的次数
  22.     uint8_t upCnt =0;                                           //记录松开的次数

  23.     while(1)                                                    //死循环,由return结束
  24.     {
  25.         Delay_Ms(10);                                           //延迟一段时间再检测

  26.         if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == SET)      //检测到按下按键
  27.         {
  28.             downCnt++;                                          //记录按下次数
  29.             upCnt=0;                                            //清除按键释放记录

  30.             if(downCnt>=50)                                     //按下时间足够
  31.             {
  32.                 return 1;                                       //检测到按键被时间长按下
  33.             }
  34.         }
  35.         else
  36.         {
  37.             upCnt++;                                            //记录释放次数
  38.             if(upCnt>5)                                         //连续检测到释放超过5次
  39.             {
  40.                 return 0;                                       //按下时间太短,不是按键长按操作
  41.             }
  42.         }
  43.     }
  44. }


  45. /*******************************************************************************
  46. * Function Name  : main
  47. * Description    : Main program.
  48. * Input          : None
  49. * Return         : None
  50. *******************************************************************************/
  51. int main(void)
  52. {
  53.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  54.     Delay_Init();
  55.     USART_Printf_Init(115200);

  56.     KEY_GPIO_Init();
  57.     EXTI0_INT_INIT();
  58.     USARTx_CFG();

  59.     Delay_Ms(100);
  60.     USARTx_SendStr(USART2, "This is a test data.\n");

  61.     Delay_Ms(100);
  62.     printf("\r\nSystemClk:%d\r\n",SystemCoreClock);
  63.     printf("\r\nSleep Mode Test\r\n");
  64.     printf("\r\n 实验说明\r\n");
  65.     printf("\r\n 1.程序正常运行时可通过长按PA1按键进入睡眠模式:\r\n");
  66.     printf("\r\n 2.在睡眠模式下,可通过PA0唤醒\r\n");
  67.     printf("\r\n 3.在睡眠状态下,通过Link无法下载程序,需要唤醒后才能下载\r\n");

  68.     while(1)
  69.     {
  70.         //PA1 按键长按进入待机模式
  71.         if(KEY_LongPress())
  72.         {
  73.             printf("\r\n 进入睡眠模式,可通过PA0唤醒\r\n");
  74.             //进入睡眠模式
  75.             __WFI();    //WFI指令进入睡眠
  76.         }
  77.     }
  78. }
Main.c文件主要包含三个函数:GPIO引脚全部拉低函数、按键长按检测函数、以及main函数。main函数包含函数初始化、相关状态信息显示。关于程序具体介绍,可见程序注释。

4下载验证
将编译好的程序下载到开发板并复位,串口1主要打印相关提示信息,串口2主要进行数据传输,具体如下:
图片1.png

  

105、睡眠模式下串口数据传输.rar

495.11 KB, 下载次数: 6

您需要登录后才可以回帖 登录 | 注册

本版积分规则

133

主题

296

帖子

45

粉丝
快速回复 在线客服 返回列表 返回顶部