> 文档中心 > 【GD32F103开发板试用】MultiButton事件驱动型按键驱动移植测试(轻量级任务处理机制)

【GD32F103开发板试用】MultiButton事件驱动型按键驱动移植测试(轻量级任务处理机制)


首发极术社区。如对兆易创新GD32F310 MCU感兴趣,欢迎添加微信 aijishu2020 加入GD32技术讨论群。

前言

刚收到开发板,发现社区朋友收到的开发板是GD32F310K,也就是封装为QFN32,但是我自己收到的是QFN28,芯片面积约为上面的1/4(QAQ),它长这样[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2ek4bP9I-1649928452004)(/img/bVbuti)]

,在参考demo时需要注意两者开发板IO口有些许差异,参考工程需要参考:GD32330G_START_Demo_Suites文件夹中的project文件夹。
本次测试依赖前方网友测试:https://aijishu.com/a/1060000000315966
GD32F3作为一个小而美的MCU,小容量的RAM,确实不适合跑系统或者过于冗余性的东西,作为一个协处理器,用作常用外设控制,当为其用武之地。

MultiButton

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

移植过程

  1. 下载gitbub仓库,在当前工程中clone仓库代码:
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V7lDnjUD-1649928452005)(/img/bVbutj)]

  2. 添加进工程,并包含头文件
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FdoTIB8O-1649928452005)(/img/bVbutk)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w5Q7qHDc-1649928452005)(/img/bVbutl)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lULjc8P1-1649928452006)(/img/bVbutn)]

  1. 添加定时器中断,将定时器中断改为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);}
  1. 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);
  1. 添加相关回调
/*按下事件*/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){}

结果展示

(视频上传不了~上传个文件,可以直接打开查看噢)
https://www.aliyundrive.com/s/7WARxzLCKTU

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