esp-idf 默认使用 FreeRTOS 作为系统调度方案, 因为 esp32c3 主要是物联网芯片, 相比32多了非常多的外设.

关于 GPIO

相比32系列的AFIO, esp的IO引脚管理使用 IOMUX , 这是一个IO矩阵, 表示内部的外设到外部引脚的映射关系。这样你想要的外设功能可以映射到你想要的引脚上去。而无需考虑外设引脚复用是否冲突(通常在AFIO类出现).

image.png

有一部分引脚是不通过 IOMUX

image.png

下面图片展示那些外设功能引脚是固定的, 来源https://mischianti.org/esp32-c3-devkitc-02-high-resolution-pinout-and-specs/

image.png

blink

简单的闪烁程序, 由于 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);
}

esp 不像 32 类, 没有 PA0, PB3 啥的, 统一使用 IO<num>, 例如 IO9`

通常在 esp-idf/components/soc/<target>/include/soc/gpio_num.h 描述, 通过 soc/gpio_num.h 引入, esp32c3 只有 22 个IO资源.