esp-idf
默认使用 FreeRTOS
作为系统调度方案, 因为 esp32c3
主要是物联网芯片, 相比32多了非常多的外设.
相比32系列的AFIO, esp的IO引脚管理使用 IOMUX
, 这是一个IO矩阵, 表示内部的外设到外部引脚的映射关系。这样你想要的外设功能可以映射到你想要的引脚上去。而无需考虑外设引脚复用是否冲突(通常在AFIO类出现).
有一部分引脚是不通过 IOMUX
的
下面图片展示那些外设功能引脚是固定的, 来源https://mischianti.org/esp32-c3-devkitc-02-high-resolution-pinout-and-specs/
简单的闪烁程序, 由于 esp-idf
库, 细节我们看不到, 对于 GPIO
而言, 我们只需要申请资源即可。
#include "hal/gpio_types.h"
#include <driver/gpio.h>
#include <freertos/FreeRTOS.h>
#include <freertos/task.h>
#include <soc/gpio_num.h>
#include <stdint.h>
#include <stdio.h>
#define GPIO_LED GPIO_NUM_10
void gpio_hello(void *param) {
uint32_t level = 0;
while (1) {
vTaskDelay(pdMS_TO_TICKS(500));
gpio_set_level(GPIO_LED, 0);
level = level ? 0 : 1;
}
}
void init() {
gpio_config_t led_cfg = {
.pin_bit_mask = 1 << GPIO_LED,
.mode = GPIO_MODE_OUTPUT,
.pull_up_en = GPIO_PULLUP_DISABLE,
.pull_down_en = GPIO_PULLDOWN_DISABLE,
.intr_type = GPIO_INTR_DISABLE,
};
gpio_config(&led_cfg);
}
void app_main(void) {
init();
xTaskCreate(gpio_hello, "hello_gpio", 128, NULL, 1, NULL);
}
pin_bit_mask
IO 掩码esp 不像 32 类, 没有 PA0, PB3 啥的, 统一使用 IO<num>, 例如
IO9`
通常在 esp-idf/components/soc/<target>/include/soc/gpio_num.h
描述, 通过 soc/gpio_num.h
引入, esp32c3
只有 22 个IO资源.