前言
剛收到開發板,發現社區朋友收到的開發板是GD32F310K,也就是封裝為QFN32,但是我自己收到的是QFN28,芯片面積約為上面的1/4(QAQ),在參考demo時需要注意兩者開發板IO口有些許差異,參考工程需要參考:GD32330G_START_Demo_Suites文件夾中的project文件夾。
GD32F3作為一個小而美的MCU,小容量的RAM,確實不適合跑系統或者過于冗余性的東西,作為一個協處理器,用作常用外設控制,當為其用武之地。
MultiButton
MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊,可無限量擴展按鍵,按鍵事件的回調異步處理方式可以簡化你的程序結構,去除冗余的按鍵處理硬編碼,讓你的按鍵業務邏輯更清晰。(搬運自github)
移植過程
下載gitbub倉庫,在當前工程中clone倉庫代碼:

添加進工程,并包含頭文件



添加定時器中斷,將定時器中斷改為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文章
85瀏覽量
18975 -
按鍵驅動
+關注
關注
0文章
11瀏覽量
7331 -
GD32F103
+關注
關注
5文章
18瀏覽量
9937
發布評論請先 登錄
相關推薦
熱點推薦
Linux下如何使用中斷的方式來驅動按鍵
Linux下的按鍵輸入驅動開發模板一文中介紹了基本的按鍵輸入捕獲流程,這里將進一步介紹如何使用中斷的方式來驅動按鍵,同時通過定時器實現
發表于 07-29 08:59
?1396次閱讀
【MultiButton】并發狀態事件驅動按鍵驅動模塊,量產產品實踐
本帖最后由 超導式 于 2016-9-2 14:45 編輯
簡介:MultiButton 是一個小巧簡單易用的事件驅動型按鍵驅動模塊,
發表于 09-02 14:44
【星空派GD32F303開發板試用體驗】+移植MultiButton,按鍵+串口+LED
本帖最后由 cooldog123pp 于 2021-11-6 22:08 編輯
板卡初次試用,先體驗一下按鍵,串口,以及LED,這里移植了MultiButton,即按下按鍵2,L
發表于 11-06 22:05
超精簡的按鍵組件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
MCU之按鍵驅動 -剝離按鍵驅動和事件處理
ButtonDrive 自己寫的一個按鍵驅動,支持單雙擊、連按、長按;采用回調處理按鍵事件(自定義消抖時間),使用只需3步,創建按鍵,按鍵事
發表于 10-28 19:21
?18次下載
MultiButton事件驅動型按鍵驅動移植測試
評論