前言
剛收到開發板,發現社區朋友收到的開發板是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文章
75瀏覽量
18191 -
按鍵驅動
+關注
關注
0文章
11瀏覽量
7154 -
GD32F103
+關注
關注
5文章
18瀏覽量
9449
發布評論請先 登錄
相關推薦
評論