前言
剛收到開發(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è)小巧簡(jiǎn)單易用的事件驅(qū)動(dòng)型按鍵驅(qū)動(dòng)模塊,可無(wú)限量擴(kuò)展按鍵,按鍵事件的回調(diào)異步處理方式可以簡(jiǎn)化你的程序結(jié)構(gòu),去除冗余的按鍵處理硬編碼,讓你的按鍵業(yè)務(wù)邏輯更清晰。(搬運(yùn)自github)
移植過程
下載gitbub倉(cāng)庫(kù),在當(dāng)前工程中clone倉(cāng)庫(kù)代碼:
添加進(jìn)工程,并包含頭文件
添加定時(shí)器中斷,將定時(shí)器中斷改為5ms中斷一次。
參考,測(cè)試代碼。
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;//邊沿對(duì)齊 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ù)初始化
/*注冊(cè)一個(gè)按鍵對(duì)象*/ button_init(&btn1, gd_eval_key_state_get, SET, bt1_id); /*注冊(cè)按鍵事件*/ 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á)到長(zhǎng)按時(shí)間閾值時(shí)觸發(fā)一次*/ void BTN1_LONG_PRESS_START_Handler(void *btn){ } /*長(zhǎng)按期間一直觸發(fā)*/ void BTN1_LONG_PRESS_HOLD_Handler(void *btn){ }
結(jié)果展示
通過事件回調(diào),可以輕松實(shí)現(xiàn)按鍵的按下、松開、連擊、長(zhǎng)按等事件對(duì)應(yīng)不通過回調(diào)~
審核編輯:劉清
-
協(xié)處理器
+關(guān)注
關(guān)注
0文章
83瀏覽量
18457 -
按鍵驅(qū)動(dòng)
+關(guān)注
關(guān)注
0文章
11瀏覽量
7211 -
GD32F103
+關(guān)注
關(guān)注
5文章
18瀏覽量
9612
發(fā)布評(píng)論請(qǐng)先 登錄
Linux下如何使用中斷的方式來(lái)驅(qū)動(dòng)按鍵
【MultiButton】并發(fā)狀態(tài)事件驅(qū)動(dòng)按鍵驅(qū)動(dòng)模塊,量產(chǎn)產(chǎn)品實(shí)踐
【星空派GD32F303開發(fā)板試用體驗(yàn)】+移植MultiButton,按鍵+串口+LED
介紹一個(gè)事件驅(qū)動(dòng)型按鍵驅(qū)動(dòng)模塊MultiButton
MultiButton使用步驟和代碼的問題
超精簡(jiǎn)的按鍵組件MultiButton概括
【中科昊芯Start_DSC28027勇士開發(fā)板試用體驗(yàn)】開源庫(kù)MultiButton移植
如何將MultiButton按鍵驅(qū)動(dòng)模塊移植到MM32F5270開發(fā)板上
怎樣將MultiButton按鍵驅(qū)動(dòng)模塊移植到MM32F5270開發(fā)板上呢
MCU之按鍵驅(qū)動(dòng) -剝離按鍵驅(qū)動(dòng)和事件處理

一種按鍵的處理方法方式:MultiButton
Linux驅(qū)動(dòng)開發(fā)-編寫按鍵驅(qū)動(dòng)

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

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

評(píng)論