STM32系列—软件定时器应用示例

STM32系列—软件定时器应用示例在上一篇文章中 有大概讲述了软件定时器的基本思路 本文我会挑两个应用示例 上一篇讲到的软件定时器的基本调用函数 本文不详细描述 有需要的朋友参考我的上一篇文章 1 按键的 Debounce 即当按键按下 需要维持按下状态一定的时间 如 200

欢迎大家来到IT世界,在知识的湖畔探索吧!

在上一篇文章中,有大概讲述了软件定时器的基本思路,本文我会挑两个应用示例:(上一篇讲到的软件定时器的基本调用函数,本文不详细描述,有需要的朋友参考我的上一篇文章)

1.按键的Debounce,即当按键按下,需要维持按下状态一定的时间,如200ms,按键值才有效,松开亦然。这个功能可以有效地实现按键去抖,以及按键值防干扰。

直接上代码讲解:

typedef struct { uint8_t now; uint8_t old; uint8_t debounce; }debounce_t;//定义按键值的结构体,存储了最新值,旧值,以及经过Debounce之后的值,其中Debounce值是有效可用的 //按键Debounce函数 //value:存储按键值,timer_name:软件定时器名称,period:软件定时器周期,call_back:回调函数 void debounce(debounce_t *value,timer_id_t timer_name,uint16_t period,debounce_call_back call_back) { if(value->now == value->debounce) { //如果最新的值和debounce值一致,不需要更新Debounce值,只要更新Old值以及停下定时器 value->old = value->now; timer_stop(timer_name); } else { //如果最新值和Debounce值不一致,那么就需要更新 if(value->now == value->old) { //如果最新值和上一次的值Old值一致,那么就要看Timer有没有运行, //如果没有运行,那么说明定时器计时完成,需要更新Debounce值,然后执行Callback函数 //如果已经在运行,那么说明定时计时没有完成,不用任何动作。 if(timer_is_running(timer_name)==0x00) { value->debounce = value->now; if(call_back!=NULL) { call_back();//执行回调函数 } } } else { // 如果最新值和上一次的值Old不一致,那么说明按键值在剧烈的变动做,不需要更新Debounce值 //先停下定时器,然后重新开启定时器,重新计时,并且更新Old值 timer_stop(timer_name); timer_start(timer_name,period,NULL); value->old = value->now; } } }

欢迎大家来到IT世界,在知识的湖畔探索吧!

上面是按键Debounce的函数,要想使用,需要定义一个软件定时器名称,定义一个回调函数,设定定时器周期,代码如下:

欢迎大家来到IT世界,在知识的湖畔探索吧!#define START_TEST_BUTTON_TIMER 0x51 #define START_TEST_BUTTON_TIMER_PERIOD 200 debounce_t key1_press; //按键回调函数 void button1_callback() { if(key1_press.debounce == GPIO_PIN_RESET) { //按键对应GPIO为低时,执行相应操作 } else { //按键对应GPIO为高时,执行相应操作 } } //按键Debounce函数 void key_action_analyze() { key1_press.now = HAL_GPIO_ReadPin(BUTTON_1_PORT, BUTTON_1_Pin); debounce(&key1_press,START_TEST_BUTTON_TIMER, START_TEST_BUTTON_TIMER_PERIOD, button1_callback); }

通过上述调用,即可实现按键的Debounce函数。

2.LED 1s闪烁,GPIO控制LED,每隔1s,GPIO电平翻转一次,即LED闪烁。

首先声明一下,下面的示例是可以用回调函数实现的,而且用回调函数执行控制时间更加精准,我这边只是演示一下没有回调函数的用法,直接上代码:

#define LED_START_TIMER   0x01 #define LED_START_TIMER_PERIOD  1000 void main() { //需要对时钟,定时器等初始化,这一块不进行叙述 uint8_t led_flag=0x00; while(1) { if(timer_is_running(LED_START_TIMER)==0x00) { timer_start(LED_START_TIMER,LED_START_TIMER_PERIOD,NULL); led_flag= (led_flag==0x00)?0x01:0x00; //GPIO=led_flag,将相应的GPIO设置为led_flag的状态即可 } } }

以上就是软件定时器使用的基本示例,希望对大家有用,大家如果有好的思路也可以分享出来,大家共同学习。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/122186.html

(0)
上一篇 6小时前
下一篇 5小时前

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信