【MM32F5270开发板试用】移植MultiButton到MM32
本篇文章来自极术社区与灵动组织的MM32F5270开发板评测活动,更多开发板试用活动请关注极术社区网站。作者:家星
简介
MultiButton 是一个小巧简单易用的事件驱动型按键驱动模块,可无限量扩展按键,按键事件的回调异步处理方式可以简化你的程序结构,去除冗余的按键处理硬编码,让你的按键业务逻辑更清晰。
移植MultiButton需要一个定时器为MultiButton提供计时服务。
本次移植使用mindsdk自动生成的工程:plus-f5270_tim_basic_mdk
开始移植
说明:本次移植实现了按键一(D7)单击,双击,长按时分别点亮不同的LED灯。
1.将MultiButton的.c文件和.h文件添加到工程中,并在魔术棒中设置好MultiButton的文件路径。
2.实现按键的GPIO口初始化
void button_gpio_init(void){ GPIO_Init_Type gpio_init;/*开启按键端口的时钟*/ RCC_EnableAHB1Periphs(B1_GPIO_CLK, true); RCC_ResetAHB1Periphs(B1_GPIO_CLK); gpio_init.Pins = B1_GPIO_PIN; gpio_init.PinMode = GPIO_PinMode_In_Floating; //浮空输入 gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(B1_GPIO_PORT, &gpio_init);}
3.实现按键对应的高低电平读取函数
read_button_GPIO函数的作用就是读取对应的按键的电平,判断按键是否按下,因为本次只使用了一个按键,所以只有一个case btn1_id,
后续如果需要扩展更多的按键,可以在.h文件中Button_IDs增加。
Button_ID相当于按键的身份证。
enum Button_IDs { btn1_id,};uint8_t read_button_GPIO(uint8_t button_id){ // you can share the GPIO read function with multiple Buttons switch(button_id) { case btn1_id: return GPIO_ReadInDataBit(B1_GPIO_PORT, B1_GPIO_PIN); break; default: return 0; break; }}
4.写按键动作对应的回调函数:下面分别的我写的单击,双击,长按的回调函数。
void BTN1_SINGLE_Click_Handler(void* btn){ LED4_ON; LED5_OFF; LED6_OFF;}void BTN1_DOUBLE_Click_Handler(void* btn){ LED4_OFF; LED5_ON; LED6_OFF;}void BTN1_LONG_PRESS_START_Handler(void* btn){ LED4_OFF; LED5_OFF; LED6_ON;}
5.定义一个按键:Button btn1;
6.在main函数中初始化一个按键
button_init | |
---|---|
btn1 | 按键1 |
read_button_GPIO | 高低电平读取函数 |
BUTTON_ON | 设置按键触发时,是高电平还是低电平 |
btn1_id | 按键1对应的id |
button_init(&btn1, read_button_GPIO, BUTTON_ON, btn1_id);//为按键1设置动作对应的回调函数 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); //使能按键1 button_start(&btn1);
7.设置一个5ms间隔的定时器循环调用后台处理函数
修改定时器触发时间为1ms
添加一个变量,
volatile int time=0;
在定时器中断中time++;
之后在main函数中调用button_ticks
while (1)
{ if(time>=5) { time=0; button_ticks(); }}
button_ticks中不需要我们进行修改,直接使用就可以了。
源代码下载
https://gitee.com/holly-knight/mm32_tft_lcd_demo