前言
剛收到開發(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倉庫代碼:
添加進(jìn)工程,并包含頭文件
添加定時(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)~
審核編輯:劉清
-
協(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
發(fā)布評論請先 登錄
相關(guān)推薦
評論