前言
(1)本文主要介绍按键输入,因为开发板上没有硬件消抖,而如果按照常规的延时20ms再去while阻塞方式当然显得有些愚蠢。因为20ms对于CPU是一个漫长的过程,然后再去一个whiile阻塞等待。接下来我将介绍本人结合与多位大佬交流想出来的一种按键消抖方案。
(2)注意,学习本文之前,需要先学习滴答定时器那一章节。
函数介绍
ROM_GPIOPadConfigSet()
为指定的 PIN 设置 PAD 配置。
/****** 函数声明 ******/ //这个存放在ROM void ROM_GPIOPadConfigSet(uint32_t ui32Port,uint8_t ui8Pins,uint32_t ui32Strength,uint32_t ui32PinType); //这个是存放在flash void GPIOPadConfigSet(uint32_t ui32Port,uint8_t ui8Pins,uint32_t ui32Strength,uint32_t ui32PinType); /****** 函数介绍 ******/ /* 作用 : 为指定的 PIN 设置 PAD 配置。 * 传入参数 : * ui32Port : GPIO口的基地地址,GPIO_PORTx_BASE,x可为A,B,C,D,E,F,G,H * ui8Pins : GPIO_PIN_X,x可为1,2,3,4,5,6,7 * ui32Strength : 设置引脚驱动强度,与输入无关 GPIO_STRENGTH_2MA,(驱动强度为2mA) GPIO_STRENGTH_4MA,(驱动强度为4mA) GPIO_STRENGTH_8MA,(驱动强度为8mA) GPIO_STRENGTH_8MA_SC,(指定 8 mA 输出驱动器并具有旋转控制) GPIO_STRENGTH_6MA,(驱动强度为6mA) GPIO_STRENGTH_10MA,(驱动强度为10mA) GPIO_STRENGTH_12MA,(驱动强度为12mA) * ui32PinType : 用于设置上下拉,休眠唤醒,开漏模式等 GPIO_PIN_TYPE_STD,(推挽引脚,如果是设置为输入,那么就是浮空输入) GPIO_PIN_TYPE_STD_WPU,(弱上拉引脚) GPIO_PIN_TYPE_STD_WPD,(弱下拉引脚) GPIO_PIN_TYPE_OD,(开漏引脚) GPIO_PIN_TYPE_ANALOG,(指定模拟输入) GPIO_PIN_TYPE_WAKE_HIGH,(用作休眠唤醒源的引脚,高) GPIO_PIN_TYPE_WAKE_LOW,(用作休眠唤醒源的引脚,低) * 返回参数 : 无 */
ROM_GPIODirModeSet()
(1)设置指定引脚的方向和模式。
(2)引脚有三种模式,可以设置为软件控件或者是硬件控件。
(3)软件控件就是配置输入输出,这个很好理解。硬件控件是什么玩意呢?
在硬件控制模式下,GPIO管脚的输入和输出状态由外部设备控制,而不是由微控制器控制。这种模式通常用于外部设备需要控制或读取GPIO管脚状态的情况,例如与其他外部器件进行通信或数据采集。
(4)这个硬件控件与我们无关,我不进行过多讲解
/****** 函数声明 ******/ //这个存放在ROM void ROM_GPIODirModeSet(uint32_t ui32Port,uint8_t ui8Pins,uint32_t ui32PinIO); //这个是存放在flash void GPIODirModeSet(uint32_t ui32Port,uint8_t ui8Pins,uint32_t ui32PinIO); /****** 函数介绍 ******/ /* 作用 : 设置指定引脚的方向和模式。 * 传入参数 : * ui32Port : GPIO口的基地地址,GPIO_PORTx_BASE,x可为A,B,C,D,E,F,G,H * ui8Pins : GPIO_PIN_X,x可为1,2,3,4,5,6,7 * ui32PinIO : GPIO_DIR_MODE_IN(设置为输入), GPIO_DIR_MODE_OUT(设置为输出), GPIO_DIR_MODE_HW(硬件控制) * 返回参数 : 无 */
ROM_GPIOPinTypeGPIOInput()
(1)将引脚设置为输入。
(2)这个函数的底层是使用的GPIOPadConfigSet()和 GPIODirModeSet()实现的,如果要详细设置 GPIO 的状态(输出电流,上下拉模式),需要调用这两个函数详细设置,默认是不上下拉。
(3)如果用于输入,个人不建议直接调用ROM_GPIOPinTypeGPIOInput()函数,因为如果没有外接电路的上下拉,浮空输入会导致程序是未知的。
(4)以下为
void GPIOPinTypeGPIOOutput(uint32_t ui32Port, uint8_t ui8Pins) { // // Check the arguments. // ASSERT(_GPIOBaseValid(ui32Port)); // // Set the pad(s) for standard push-pull operation. // GPIOPadConfigSet(ui32Port, ui8Pins, GPIO_STRENGTH_2MA, GPIO_PIN_TYPE_STD); // // Make the pin(s) be outputs. // GPIODirModeSet(ui32Port, ui8Pins, GPIO_DIR_MODE_OUT); }
ROM_GPIOPinRead()
读取引脚电平
/****** 函数声明 ******/ //这个存放在ROM int32_t ROM_GPIOPinRead(uint32_t ui32Port,uint8_t ui8Pins); //这个是存放在flash int32_t GPIOPinRead(uint32_t ui32Port,uint8_t ui8Pins); /****** 函数介绍 ******/ /* 作用 : 读取引脚电平 * 传入参数 : * ui32Port : GPIO口的基地地址,GPIO_PORTx_BASE,x可为A,B,C,D,E,F,G,H * ui8Pins : GPIO_PIN_X,x可为1,2,3,4,5,6,7 * 返回参数 : 无 */