在编码器中,有一个按键,为了方便的驱动这个按键,我找到了一个开源的按键驱动https://github.com/jiejieTop/ButtonDrive。
Button_drive是一个小巧的按键驱动,支持单击、双击、长按、连续触发等(后续可以在按键控制块中添加触发事件),理论上可无限量扩展Button,Button_drive采用按键触发事件回调方式处理业务逻辑,支持在RTOS中使用,作者仅在RT-Thread上测试过。 写按键驱动的目的是想要将用户按键逻辑与按键处理事件分离,用户无需处理复杂麻烦的逻辑事件。这次我在FreeRTOS上驱证,是可以正常驱动的。
【移植方法】
1、下载源码到本地。
2、在https://forum.eepw.com.cn/thread/389953/1 这篇工程的基础上,添加一个button的工程目录,将下载的源码,除去main.c外,添加进工程中,如下图所示:
2、添加key.c/h
首先加入头文件的引用:
#include "key.h" #include "button.h" #include "platform.h" #include "FreeRTOS.h" #include "task.h"
接着实例化按键
Button_t Button1;
按键GPIO的Init,把PB0初始化为上拉输入模式:
void GPIO_Configure(void) { GPIO_InitTypeDef GPIO_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB, ENABLE); /* K1->PB0 K2->PB1 */ GPIO_StructInit(&GPIO_InitStruct); GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0; GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPD; GPIO_Init(GPIOB, &GPIO_InitStruct); }
编写按键状态的获取函数:
uint8_t Read_Button1_Level(void) { return GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_0); }
注册一个单击的回调按函数,这里打印出单击:
void Btn1_Dowm_CallBack(void *btn) { PRINT_INFO("Button1 单击!"); }
编写一个任务函数,用于FreeRTOS创建任务:
void key_task(void *pvParameters) { static uint8_t KeyState[4] = { 0, 0, 0, 0 }; static uint8_t KeyCount[4] = { 0, 0, 0, 0 }; void GPIO_Configure(); Button_Create("Button1", &Button1, Read_Button1_Level, 0); Button_Attach(&Button1,BUTTON_DOWM,Btn1_Dowm_CallBack); //单击 Get_Button_Event(&Button1); while(1) { Button_Process(); vTaskDelay(20); } }
在任务创建函数中,添加任务的创建 :
xTaskCreate((TaskFunction_t )key_task, (const char* )"key_task", (uint16_t )LED2_STK_SIZE, (void* )NULL, (UBaseType_t )LED2_TASK_PRIO, (TaskHandle_t* )&keyTask_Handler);
下载后,实现效果:
按下编码器的按键后就可以成功的在串口中输出了单击的铵键效果。
当然我们也可以通过添加双击,长按等来定义更多的按键效果,这里我只需要单击的效果。