1. GPIO API介绍
1.gpio_reset_pin()函数
函数功能为将选定的GPIO口复位为初始状态,以便后续对该IO口进行设置。
值得一提的是,当GPIO口为初始状态时,其电平属性不定,若硬件设计没有进行相应的上下拉操作,可能导致初始化时硬件跑飞。
/**
* @brief 将GPIO重置为初始状态(选择GPIO的功能,使能上拉和失能输入输出).
*
* @param gpio_num GPIO的引脚号.
*
* @note This function also configures the IOMUX for this pin to the GPIO
* function, and disconnects any other peripheral output configured via GPIO
* Matrix.
*
* @return 永远返回 ESP_OK.
*/
esp_err_t gpio_reset_pin(gpio_num_t gpio_num);
2.gpio_set_direction()函数
函数功能为设置GPIO口的输入输出模式。
/**
* @brief GPIO 设置方向.
*
* 配置GPIO方向,例如输入
*
* @param gpio_num Configure GPIO pins number, it should be GPIO number. If you want to set direction of e.g. GPIO16, gpio_num should be GPIO_NUM_16 (16);
* @param mode GPIO direction
*
* @return
* - ESP_OK Success
* - ESP_ERR_INVALID_ARG GPIO error
*
*/
esp_err_t gpio_set_direction(gpio_num_t gpio_num, gpio_mode_t mode);
2.点灯大法
合宙CORE ESP32核心板板载2颗LED
LED编号 | 对应GPIO | 管脚功能 | 描述 |
---|---|---|---|
D4 | IO12 | GPIO12配置 | 高电平有效 |
D5 | IO13 | GPIO13配置 | 高电平有效 |
1. LED GPIO初始化
在点灯之前,需要将开发板上对应的GPIO口设置为输出模式,可以将IO口的电平默认拉低。
void LedGPIO_Init(void)
{
gpio_reset_pin(12);
gpio_set_direction(12,GPIO_MODE_OUTPUT);
gpio_set_level(12,0);
gpio_reset_pin(13);
gpio_set_direction(13,GPIO_MODE_OUTPUT);
gpio_set_level(13,0);//LED
}
2. LED点灯函数配置
由于我们开发板上有两颗LED,根据个人习惯将其配置为自己擅长用的点灯函数,这里我将其配置为两个单独的控制函数,通过参数State控制LED的亮灭。
void led1(int state)
{
gpio_set_level(12,state);
}
void led2(int state)
{
gpio_set_level(13,state);
}
3. 使用说明
在调用LED函数时,首先需要先对LED的GPIO初始化,接下来就可以使用我们自己的点灯函数进行愉快点灯了。
3.按键配置
1. 按键初始化
和配置LED的GPIO类似,首先复位对应的GPIO口,进而再将其配置为输入模式。
void KeyGPIO_Init(void)
{
gpio_reset_pin(8);
gpio_set_direction(8,GPIO_MODE_INPUT);
gpio_reset_pin(9);
gpio_set_direction(9,GPIO_MODE_INPUT);
gpio_reset_pin(4);
gpio_set_direction(4,GPIO_MODE_INPUT);
}
2. 编写按键处理函数
普通的按键消抖函数,通过延时来过滤掉按键的机械抖动,当松开按键时返回相应的按键状态。
bool KeyPrees(gpio_num_t gpio_k)
{
if(gpio_get_level(gpio_k) == 0)
{
vTaskDelay(20);
while(gpio_get_level(gpio_k) == 0);
vTaskDelay(20);
return true;
}
return false;
}