0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

MultiButton事件驱动型按键驱动移植测试

冬至子 来源:兆易创新GD32 MCU 作者:羁傲不驯ぃ 2022-10-11 11:11 次阅读

前言

刚收到开发板,发现社区朋友收到的开发板是GD32F310K,也就是封装为QFN32,但是我自己收到的是QFN28,芯片面积约为上面的1/4(QAQ),在参考demo时需要注意两者开发板IO口有些许差异,参考工程需要参考:GD32330G_START_Demo_Suites文件夹中的project文件夹。

GD32F3作为一个小而美的MCU,小容量的RAM,确实不适合跑系统或者过于冗余性的东西,作为一个协处理器,用作常用外设控制,当为其用武之地。

MultiButton

MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。(搬运自github)

移植过程

下载gitbub仓库,在当前工程中clone仓库代码:

poYBAGNE3nWALKNbAABv6nKgYaw917.png

添加进工程,并包含头文件

pYYBAGNE3qyAVYHWAADlZWyHNK4496.png
poYBAGNE3rGABnx1AADkGseSKt0697.png

pYYBAGNE3raANemsAACQOVf9qQo341.png

添加定时器中断,将定时器中断改为5ms中断一次。

参考,测试代码。

void gd_timer0_config(uint32_t arr,uint16_t prescaler)
{
 timer_parameter_struct timer0initpara;
 /* enable the timer0 clock */
 rcu_periph_clock_enable(RCU_TIMER1);//挂在AHB=72MHz上面

 /* 初始化timer0 定时器参数,设置自动重装载值,分频系数,计数方式 */
 timer0initpara.clockdivision=TIMER_CKDIV_DIV1;//分频因子
 timer0initpara.alignedmode=TIMER_COUNTER_EDGE;//边沿对齐
 timer0initpara.counterdirection=TIMER_COUNTER_UP;//向上计数
 timer0initpara.period=arr;//自动重新加载值
 timer0initpara.prescaler=prescaler;//预分频值 if=1时就是72Mhz else=72/(prescaler/2)
 //timer0initpara.repetitioncounter=;//重复计数器值
 timer_init(TIMER1,&timer0initpara);
 //允许更新中断
 timer_interrupt_enable(TIMER1,TIMER_INT_UP);
 //TIMER0中断优先级设置
 nvic_irq_enable(TIMER1_IRQn,1,1);//抢占优先级,响应优先级
 //使能TIME0
 timer_enable(TIMER1);
}
/*中断初始化*/
gd_timer0_config(5000-1,144-1);//72MHz/(144/2)=1us  1us*1000=1ms  1us*5000=5ms

/*中断回调函数*/
void TIMER1_IRQHandler(void)
{
 if(SET==timer_interrupt_flag_get(TIMER1,TIMER_INT_UP))
 {
   //gd_eval_led_toggle(LED1);
         button_ticks();
 }
 timer_interrupt_flag_clear(TIMER1,TIMER_INT_UP);
}

main函数初始化

     /*注册一个按键对象*/
     button_init(&btn1, gd_eval_key_state_get, SET, bt1_id);
     /*注册按键事件*/
     button_attach(&btn1, PRESS_DOWN,       BTN1_PRESS_DOWN_Handler);
     button_attach(&btn1, PRESS_UP,         BTN1_PRESS_UP_Handler);
     button_attach(&btn1, PRESS_REPEAT,     BTN1_PRESS_REPEAT_Handler);
     button_attach(&btn1, SINGLE_CLICK,     BTN1_SINGLE_Click_Handler);
     button_attach(&btn1, DOUBLE_CLICK,     BTN1_DOUBLE_Click_Handler);
     button_attach(&btn1, LONG_PRESS_START, BTN1_LONG_PRESS_START_Handler);
     button_attach(&btn1, LONG_PRESS_HOLD,  BTN1_LONG_PRESS_HOLD_Handler);
     button_start(&btn1);

添加相关回调

/*按下事件*/
void BTN1_PRESS_DOWN_Handler(void *btn){
 gd_eval_led_on(LED1);
}
/*弹起事件*/
void BTN1_PRESS_UP_Handler(void *btn){
 gd_eval_led_off(LED1);
}
/*重复按下事件 变量repeat计数连击次数*/
void BTN1_PRESS_REPEAT_Handler(void *btn){
 uint8_t i = 0;
 for(i = 0; i <= btn1.repeat; i++){
     gd_eval_led_toggle(LED1);
     delay_1ms(250);
     gd_eval_led_toggle(LED1);
     delay_1ms(250);
 }
}
/*单击按键事件*/
void BTN1_SINGLE_Click_Handler(void *btn){
}
/*双击按键事件*/
void BTN1_DOUBLE_Click_Handler(void *btn){
}
/*达到长按时间阈值时触发一次*/
void BTN1_LONG_PRESS_START_Handler(void *btn){
}
/*长按期间一直触发*/
void BTN1_LONG_PRESS_HOLD_Handler(void *btn){
}

结果展示

通过事件回调,可以轻松实现按键的按下、松开、连击、长按等事件对应不通过回调~




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 协处理器
    +关注

    关注

    0

    文章

    70

    浏览量

    17996
  • 按键驱动
    +关注

    关注

    0

    文章

    11

    浏览量

    7100
  • GD32F103
    +关注

    关注

    4

    文章

    17

    浏览量

    9358
收藏 人收藏

    评论

    相关推荐

    Linux下如何使用中断的方式来驱动按键

    Linux下的按键输入驱动开发模板一文中介绍了基本的按键输入捕获流程,这里将进一步介绍如何使用中断的方式来驱动按键,同时通过定时器实现
    发表于 07-29 08:59 850次阅读

    MultiButton】并发状态事件驱动按键驱动模块,量产产品实践

    本帖最后由 超导式 于 2016-9-2 14:45 编辑 简介:MultiButton 是一个小巧简单易用的事件驱动按键驱动模块,
    发表于 09-02 14:44

    介绍一个事件驱动按键驱动模块MultiButton

    MultiButton MultiButton,一个小巧简单易用的事件驱动按键驱动模块,作者
    发表于 01-10 07:28

    MultiButton使用步骤和代码的问题

    、短按,如果没有一个按键驱动框架是很难实现的 ,在这里推荐一个非常好用的按键处理框架MultiButton
    发表于 01-21 06:03

    超精简的按键组件MultiButton概括

    Growing up’s a funny thing. Sneaks up on you.长大是件很有趣的事,不经意间就发生了。一、概括项目的仓库大佬的超精简的软件定时器multi_timer已经让人眼前一亮,如今这个按键组件MultiButton更令我折服。把
    发表于 02-28 11:19

    【中科昊芯Start_DSC28027勇士开发板试用体验】开源库MultiButton移植

    一、开源库MultiButton介绍MultiButton 是一个小巧简单易用的事件驱动按键驱动
    发表于 07-01 23:04

    如何将MultiButton按键驱动模块移植到MM32F5270开发板上

    简介MultiButton 是一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键
    发表于 08-23 15:43

    怎样将MultiButton按键驱动模块移植到MM32F5270开发板上呢

    简介MultiButton 是一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键
    发表于 11-11 15:52

    《Linux设备驱动开发详解》第23章、Linux设备驱动移植

    《Linux设备驱动开发详解》第23章、Linux设备驱动移植
    发表于 10-27 10:58 9次下载
    《Linux设备<b class='flag-5'>驱动</b>开发详解》第23章、Linux设备<b class='flag-5'>驱动</b>的<b class='flag-5'>移植</b>

    MCU之按键驱动 -剥离按键驱动和事件处理

    ButtonDrive 自己写的一个按键驱动,支持单双击、连按、长按;采用回调处理按键事件(自定义消抖时间),使用只需3步,创建按键按键
    发表于 10-28 19:21 18次下载
    MCU之<b class='flag-5'>按键</b><b class='flag-5'>驱动</b> -剥离<b class='flag-5'>按键</b><b class='flag-5'>驱动</b>和事件处理

    一种按键的处理方法方式:MultiButton

    MultiButton一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键按键事件的回调
    的头像 发表于 04-28 14:58 1432次阅读

    Linux驱动开发-编写按键驱动

    这篇文章介绍,如何使用杂项设备框架编写一个简单的按键驱动,完成编写、编译、安装、测试等流程,了解一个杂项字符设备驱动的开发流程。
    的头像 发表于 09-17 15:08 1353次阅读
    Linux<b class='flag-5'>驱动</b>开发-编写<b class='flag-5'>按键</b><b class='flag-5'>驱动</b>

    【中科昊芯Start_DSC28027勇士开发板试用体验】开源库MultiButton移植

    MultiButton 是一个小巧简单易用的事件驱动按键驱动模块,可无限量扩展按键按键事件
    的头像 发表于 11-21 11:06 373次阅读
    【中科昊芯Start_DSC28027勇士开发板试用体验】开源库<b class='flag-5'>MultiButton</b><b class='flag-5'>移植</b>

    按键驱动的实验

    按键驱动实验与LED以及Beep在整体使用逻辑上一样,只是按键是输入模式。
    的头像 发表于 03-02 16:25 451次阅读
    <b class='flag-5'>按键</b><b class='flag-5'>驱动</b>的实验

    基于状态机的按键驱动设计

    按键作为单片机的输入设备,可以向单片机输入数据、传输命令等,是设置参数和控制设备的常用接口。所以,学会按键驱动也是初学者必不可少的能力。说到按键驱动
    的头像 发表于 07-04 11:43 684次阅读
    基于状态机的<b class='flag-5'>按键</b><b class='flag-5'>驱动</b>设计