0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

MultiButton事件驅(qū)動(dòng)型按鍵驅(qū)動(dòng)移植測試

冬至子 ? 來源:兆易創(chuàng)新GD32 MCU ? 作者:羈傲不馴ぃ ? 2022-10-11 11:11 ? 次閱讀

前言

剛收到開發(fā)板,發(fā)現(xiàn)社區(qū)朋友收到的開發(fā)板是GD32F310K,也就是封裝為QFN32,但是我自己收到的是QFN28,芯片面積約為上面的1/4(QAQ),在參考demo時(shí)需要注意兩者開發(fā)板IO口有些許差異,參考工程需要參考:GD32330G_START_Demo_Suites文件夾中的project文件夾。

GD32F3作為一個(gè)小而美的MCU,小容量的RAM,確實(shí)不適合跑系統(tǒng)或者過于冗余性的東西,作為一個(gè)協(xié)處理器,用作常用外設(shè)控制,當(dāng)為其用武之地。

MultiButton

MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)型按鍵驅(qū)動(dòng)模塊,可無限量擴(kuò)展按鍵,按鍵事件的回調(diào)異步處理方式可以簡化你的程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務(wù)邏輯更清晰。(搬運(yùn)自github)

移植過程

下載gitbub倉庫,在當(dāng)前工程中clone倉庫代碼:

poYBAGNE3nWALKNbAABv6nKgYaw917.png

添加進(jìn)工程,并包含頭文件

pYYBAGNE3qyAVYHWAADlZWyHNK4496.png
poYBAGNE3rGABnx1AADkGseSKt0697.png

pYYBAGNE3raANemsAACQOVf9qQo341.png

添加定時(shí)器中斷,將定時(shí)器中斷改為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 定時(shí)器參數(shù),設(shè)置自動(dòng)重裝載值,分頻系數(shù),計(jì)數(shù)方式 */
 timer0initpara.clockdivision=TIMER_CKDIV_DIV1;//分頻因子
 timer0initpara.alignedmode=TIMER_COUNTER_EDGE;//邊沿對齊
 timer0initpara.counterdirection=TIMER_COUNTER_UP;//向上計(jì)數(shù)
 timer0initpara.period=arr;//自動(dòng)重新加載值
 timer0initpara.prescaler=prescaler;//預(yù)分頻值 if=1時(shí)就是72Mhz else=72/(prescaler/2)
 //timer0initpara.repetitioncounter=;//重復(fù)計(jì)數(shù)器值
 timer_init(TIMER1,&timer0initpara);
 //允許更新中斷
 timer_interrupt_enable(TIMER1,TIMER_INT_UP);
 //TIMER0中斷優(yōu)先級(jí)設(shè)置
 nvic_irq_enable(TIMER1_IRQn,1,1);//搶占優(yōu)先級(jí),響應(yīng)優(yōu)先級(jí)
 //使能TIME0
 timer_enable(TIMER1);
}
/*中斷初始化*/
gd_timer0_config(5000-1,144-1);//72MHz/(144/2)=1us  1us*1000=1ms  1us*5000=5ms

/*中斷回調(diào)函數(shù)*/
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函數(shù)初始化

     /*注冊一個(gè)按鍵對象*/
     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);

添加相關(guān)回調(diào)

/*按下事件*/
void BTN1_PRESS_DOWN_Handler(void *btn){
 gd_eval_led_on(LED1);
}
/*彈起事件*/
void BTN1_PRESS_UP_Handler(void *btn){
 gd_eval_led_off(LED1);
}
/*重復(fù)按下事件 變量repeat計(jì)數(shù)連擊次數(shù)*/
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){
}
/*達(dá)到長按時(shí)間閾值時(shí)觸發(fā)一次*/
void BTN1_LONG_PRESS_START_Handler(void *btn){
}
/*長按期間一直觸發(fā)*/
void BTN1_LONG_PRESS_HOLD_Handler(void *btn){
}

結(jié)果展示

通過事件回調(diào),可以輕松實(shí)現(xiàn)按鍵的按下、松開、連擊、長按等事件對應(yīng)不通過回調(diào)~




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 協(xié)處理器
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    18144
  • 按鍵驅(qū)動(dòng)
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    7123
  • GD32F103
    +關(guān)注

    關(guān)注

    5

    文章

    18

    瀏覽量

    9412
收藏 人收藏

    評論

    相關(guān)推薦

    Linux下如何使用中斷的方式來驅(qū)動(dòng)按鍵

    Linux下的按鍵輸入驅(qū)動(dòng)開發(fā)模板一文中介紹了基本的按鍵輸入捕獲流程,這里將進(jìn)一步介紹如何使用中斷的方式來驅(qū)動(dòng)按鍵,同時(shí)通過定時(shí)器實(shí)現(xiàn)
    發(fā)表于 07-29 08:59 ?956次閱讀

    MultiButton】并發(fā)狀態(tài)事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,量產(chǎn)產(chǎn)品實(shí)踐

    本帖最后由 超導(dǎo)式 于 2016-9-2 14:45 編輯 簡介:MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,
    發(fā)表于 09-02 14:44

    【星空派GD32F303開發(fā)板試用體驗(yàn)】+移植MultiButton,按鍵+串口+LED

    本帖最后由 cooldog123pp 于 2021-11-6 22:08 編輯 板卡初次試用,先體驗(yàn)一下按鍵,串口,以及LED,這里移植MultiButton,即按下按鍵2,L
    發(fā)表于 11-06 22:05

    介紹一個(gè)事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊MultiButton

    MultiButton MultiButton,一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,作者
    發(fā)表于 01-10 07:28

    MultiButton使用步驟和代碼的問題

    、短按,如果沒有一個(gè)按鍵驅(qū)動(dòng)框架是很難實(shí)現(xiàn)的 ,在這里推薦一個(gè)非常好用的按鍵處理框架MultiButton
    發(fā)表于 01-21 06:03

    超精簡的按鍵組件MultiButton概括

    Growing up’s a funny thing. Sneaks up on you.長大是件很有趣的事,不經(jīng)意間就發(fā)生了。一、概括項(xiàng)目的倉庫大佬的超精簡的軟件定時(shí)器multi_timer已經(jīng)讓人眼前一亮,如今這個(gè)按鍵組件MultiButton更令我折服。把
    發(fā)表于 02-28 11:19

    【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗(yàn)】開源庫MultiButton移植

    一、開源庫MultiButton介紹MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)
    發(fā)表于 07-01 23:04

    如何將MultiButton按鍵驅(qū)動(dòng)模塊移植到MM32F5270開發(fā)板上

    簡介MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,可無限量擴(kuò)展按鍵,
    發(fā)表于 08-23 15:43

    怎樣將MultiButton按鍵驅(qū)動(dòng)模塊移植到MM32F5270開發(fā)板上呢

    簡介MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,可無限量擴(kuò)展按鍵,
    發(fā)表于 11-11 15:52

    MCU之按鍵驅(qū)動(dòng) -剝離按鍵驅(qū)動(dòng)和事件處理

    ButtonDrive 自己寫的一個(gè)按鍵驅(qū)動(dòng),支持單雙擊、連按、長按;采用回調(diào)處理按鍵事件(自定義消抖時(shí)間),使用只需3步,創(chuàng)建按鍵,按鍵
    發(fā)表于 10-28 19:21 ?18次下載
    MCU之<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b> -剝離<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>和事件處理

    一種按鍵的處理方法方式:MultiButton

    MultiButton一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,可無限量擴(kuò)展按鍵,
    的頭像 發(fā)表于 04-28 14:58 ?1720次閱讀

    Linux驅(qū)動(dòng)開發(fā)-編寫按鍵驅(qū)動(dòng)

    這篇文章介紹,如何使用雜項(xiàng)設(shè)備框架編寫一個(gè)簡單的按鍵驅(qū)動(dòng),完成編寫、編譯、安裝、測試等流程,了解一個(gè)雜項(xiàng)字符設(shè)備驅(qū)動(dòng)的開發(fā)流程。
    的頭像 發(fā)表于 09-17 15:08 ?1608次閱讀
    Linux<b class='flag-5'>驅(qū)動(dòng)</b>開發(fā)-編寫<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>

    【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗(yàn)】開源庫MultiButton移植

    MultiButton 是一個(gè)小巧簡單易用的事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,可無限量擴(kuò)展按鍵,
    的頭像 發(fā)表于 11-21 11:06 ?518次閱讀
    【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗(yàn)】開源庫<b class='flag-5'>MultiButton</b><b class='flag-5'>移植</b>

    按鍵驅(qū)動(dòng)的實(shí)驗(yàn)

    按鍵驅(qū)動(dòng)實(shí)驗(yàn)與LED以及Beep在整體使用邏輯上一樣,只是按鍵是輸入模式。
    的頭像 發(fā)表于 03-02 16:25 ?712次閱讀
    <b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>的實(shí)驗(yàn)

    基于狀態(tài)機(jī)的按鍵驅(qū)動(dòng)設(shè)計(jì)

    按鍵作為單片機(jī)的輸入設(shè)備,可以向單片機(jī)輸入數(shù)據(jù)、傳輸命令等,是設(shè)置參數(shù)和控制設(shè)備的常用接口。所以,學(xué)會(huì)按鍵驅(qū)動(dòng)也是初學(xué)者必不可少的能力。說到按鍵驅(qū)動(dòng)
    的頭像 發(fā)表于 07-04 11:43 ?1283次閱讀
    基于狀態(tài)機(jī)的<b class='flag-5'>按鍵</b><b class='flag-5'>驅(qū)動(dòng)</b>設(shè)計(jì)