查看: 1380|回复: 0
收起左侧

第一百零六章:CH32V103应用教程——睡眠模式下串口数据传输

[复制链接]

  离线 

  • TA的每日心情
    慵懒
    2021-7-23 17:16
  • 签到天数: 17 天

    [LV.4]

    发表于 2021-7-31 19:36:21 | 显示全部楼层 |阅读模式

    有人预言,RISC-V或将是继Intel和Arm之后的第三大主流处理器体系。欢迎访问全球首家只专注于RISC-V单片机行业应用的中文网站

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    本章教程主要讲述如何通过按键控制进入/退出睡眠模式,同时演示正常模式下和睡眠模式下串口数据传输。注意,在睡眠模式下,进行串口数据传输时,当进入串口中断时,会唤醒退出睡眠模式,但不影响数据传输。本次教程所用中断是串口读数据寄存器非空时进入中断。

    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主要进行数据传输,具体如下:
    CH32V CH573单片机芯片-第一百零六章:CH32V103应用教程——睡眠模式下串口数据传输risc-v单片机中文社区(1)

    CH32V CH573单片机芯片-第一百零六章:CH32V103应用教程——睡眠模式下串口数据传输risc-v单片机中文社区(2) 105、睡眠模式下串口数据传输.rar (495.11 KB, 下载次数: 15)






    上一篇:第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式
    下一篇:教你动手移植RT-Thread到国产MCU
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

    RISC-V单片机中文网上一条 /2 下一条



    版权及免责声明|RISC-V单片机中文网 |网站地图

    GMT+8, 2024-4-19 14:02 , Processed in 0.805901 second(s), 48 queries .

    快速回复 返回顶部 返回列表