[应用方案] 【NuMaker-M471测评】+gpio pin 的wakeup功能的讨论

[复制链接]
3066|4
 楼主| qjp1988113 发表于 2021-8-19 09:31 | 显示全部楼层 |阅读模式
其他的MCU,譬如ST的,NXP,大部分都会给出一个或者几个具有特定的WAKEUP功能的引脚。但是新唐就
做的比较特殊,它的大部分引脚都支持WAKEUP功能~
我们来看看,新唐的规格书自己是怎么说的:
AA1.png
可以看到,它在概述GPIO功能时,就提出了这个~
A8.png
根据查看,我们知道当芯片进入空闲/关机模式时,gpio也可以作为芯片的唤醒源。
唤醒触发器条件的设置与gpio中断触发器相同 。  
也就是我们配置PIN位外部中断模式,也就间接的具有了WAKUP功能!
还真是有点与众不同啊~
对与普通按键按下瞬间的抖动及噪音感染的问题,我们以往都选择延时,再检测电平的功能,
或者硬件去抖动的方案~
这里新唐给出了一种解决方案~
B1.png
一个被称为去弹跳的功能~当gpiopin的进行中断输入采样,防止噪声引起的意外中断。
Gpio去弹跳功能仅支持边缘检测触发器类型,不支持断电模式。对于边缘触发条件,
通过设置选择:下降边缘触发、上升边缘触发。
当然想使用,得配置2个寄存器:
1)、gpiopin设置去弹跳启用控制寄存器px_dben。
A4.png
2)、gpio_dbctl寄存器:
       通过设置dbclksrc(gpio_dbctl[4])寄存器,去弹跳时钟源可以是hclk或lirc。
       通过设置dbclksel(gpio_dbctl[3:0])寄存器可以控制采样周期。
A2.png
这种功能,说白了,就是在检测按键时,在启动一个定时器,一直检测电平:
在其某一个周期间及后续一周期内(2周期为一个测试周期),发生电平转换,才认为是一次触发:
具体看图:
M2.png
说白了也就是那么回事,那么其他的没有这种功能的MCU,我可不可以用这个方法来检测?
当然可以,就是得开销一个定时器~
下面看代码配置:
KEY.H
  1. #ifndef __KEY_H_
  2. #define __KEY_H_

  3. #include "NuMicro.h"

  4. #define KEY0 PH4

  5. #define KEY0_EXTI_ENABLE             1         //允许外部中断
  6. #define KEY0_WAKEUPLP_ENABLE    1         //允许唤醒LOWPOWER模式

  7. void KEY_Init(void);

  8. #endif
KEY.C
  1. #include "key.h"

  2. void KEY_Init(void)
  3. {

  4.     CLK->AHBCLK |= CLK_AHBCLK_GPHCKEN_Msk;
  5.     GPIO_SetMode(PH, BIT4, GPIO_MODE_INPUT);
  6.     #if KEY0_EXTI_ENABLE
  7.     GPIO_EnableInt(PH, 4, GPIO_INT_FALLING);   
  8.     NVIC_EnableIRQ(GPH_IRQn);
  9.     #if KEY0_WAKEUPLP_ENABLE
  10.     /* Enable interrupt de-bounce function and select de-bounce sampling cycle time is 1024 clocks of LIRC clock */
  11.     GPIO_SET_DEBOUNCE_TIME(GPIO_DBCTL_DBCLKSRC_LIRC, GPIO_DBCTL_DBCLKSEL_1024);
  12.     GPIO_ENABLE_DEBOUNCE(PH, BIT4);
  13.     #endif
  14.     #endif

  15. }

  16. void GPH_IRQHandler(void)
  17. {
  18.     volatile uint32_t temp;

  19.     /* To check if PB.3 interrupt occurred */
  20.     if(GPIO_GET_INT_FLAG(PH, BIT4))
  21.     {
  22.         GPIO_CLR_INT_FLAG(PH, BIT4);
  23.         printf("PH.4 INT occurred.\n");
  24.     }
  25.     else
  26.     {
  27.         /* Un-expected interrupt. Just clear all PH interrupts */
  28.         temp = PH->INTSRC;
  29.         PH->INTSRC = temp;
  30.       
  31.         printf("Un-expected interrupts.\n");
  32.     }
  33. }


然后,我们在main函数的while循环里,让它进入LOW POWER模式。我们每按一下就会唤醒一次,然后接着进入LOW POWER模式,然后循环:
main函数while里面添加:
  1. while(1)
  2.   {  
  3.    
  4.     //进入低功耗模式 PH4引脚中断可唤醒
  5.     printf("进入 Power-Down 模式,请按按键唤醒...\n");
  6.     PowerDownFunction();
  7.     printf("系统被唤醒了...\n\n");
  8. }
下载,查看串口输出,按键按一次,唤醒一次:
M3.png
好,那到这,我的简单的分享结束了!
大神勿喷!~谢谢观看~


gaoyang9992006 发表于 2021-8-20 23:01 | 显示全部楼层
51077611fc3c65c363.png
唤醒源很多的,串口都可以。
kiwis66 发表于 2021-8-21 14:02 | 显示全部楼层
楼主的讲解非常的nice
不仅评测,还有讲解,条理清晰,很棒!
kiwis66 发表于 2021-9-13 11:43 | 显示全部楼层
这么好的评测,没人关注?
我都看好几遍了
dongnanxibei 发表于 2023-9-27 19:51 | 显示全部楼层
IO唤醒功能。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

111

主题

627

帖子

2

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