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

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

[复制链接]

  离线 

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

    [LV.4]

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

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

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

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

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


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

    2、硬件设计


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

    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按键进入待机模式,WKUP(PA0)引脚上升沿,退出待机模式, 唤醒后程序复位。

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

    13. */



    14. #include "debug.h"

    15. #include "key.h"



    16. void GPIO_ALL_Init(void)

    17. {

    18.     GPIO_InitTypeDef GPIO_InitStructure;



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

    20.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);

    21.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_All;

    22.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;



    23.     GPIO_Init(GPIOA, &GPIO_InitStructure);

    24.     GPIO_Init(GPIOB, &GPIO_InitStructure);

    25.     GPIO_Init(GPIOC, &GPIO_InitStructure);

    26. }



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

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

    29. static uint8_t KEY_LongPress(void)

    30. {

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

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



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

    34.     {

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



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

    37.         {

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

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



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

    41.             {

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

    43.             }

    44.         }

    45.         else

    46.         {

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

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

    49.             {

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

    51.             }

    52.         }

    53.     }

    54. }



    55. /*******************************************************************************

    56. * Function Name  : main

    57. * Description    : Main program.

    58. * Input          : None

    59. * Return         : None

    60. *******************************************************************************/

    61. int main(void)

    62. {



    63.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR , ENABLE);

    64.     GPIO_ALL_Init();

    65.     Delay_Init();

    66.     USART_Printf_Init(115200);

    67.     KEY_GPIO_Init();



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

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



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

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

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

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

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



    75.     //检测复位来源

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

    77.     {

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

    79.     }

    80.     else

    81.     {

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

    83.     }



    84.     while(1)

    85.     {

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

    87.         if(KEY_LongPress())

    88.         {



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



    90.             Delay_Ms(10);



    91.             //清除WU状态位

    92.             PWR_ClearFlag (PWR_FLAG_WU);



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

    94.             PWR_WakeUpPinCmd (ENABLE);



    95.             //进入待机模式

    96.             PWR_EnterSTANDBYMode();

    97.         }



    98.         //正常模式

    99.         Delay_Ms(1000);

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

    101.     }

    102. }
    复制代码

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

    4、下载验证

    将编译好的程序下载到开发板并复位,串口打印情况具体如下:
    CH32V CH573单片机芯片-第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式risc-v单片机中文社区(1)
    长按PA1按键,进入待机模式,串口打印信息如下:
    CH32V CH573单片机芯片-第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式risc-v单片机中文社区(2)
    由打印信息可知,提示进入待机模式,可按PA0(WK_UP)按键唤醒退出待机模式,如下图:
    CH32V CH573单片机芯片-第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式risc-v单片机中文社区(3)

    CH32V CH573单片机芯片-第一百零五章:CH32V103应用教程 按键控制进入/退出待机模式risc-v单片机中文社区(4) 104、通过按键控制进入和退出待机模式.rar (468.04 KB, 下载次数: 14)






    上一篇:第一百零四章:CH32V103应用教程——通过EXTI控制LED灯
    下一篇:第一百零六章:CH32V103应用教程——睡眠模式下串口数据传输
    RISCV作者优文
    全球首家只专注于RISC-V单片机行业应用的中文网站
    回复

    使用道具 举报

    高级模式
    B Color Image Link Quote Code Smilies

    本版积分规则

    关闭

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



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

    GMT+8, 2024-11-26 09:57 , Processed in 0.704150 second(s), 47 queries .

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