合宙ESP32C3 Demo
相关资料
引脚笔记
建议直接使用的引脚
GPIO2、GPIO3、GPIO4、GPIO5、GPIO7、GPIO10、GPIO0、GPIO1
开机默认电平
-
开机3v3的引脚
6、8、9、11、19、EN、TX0、RX0 -
开机1.71V引脚
12、13 -
开机低电平引脚
2、3、4、5、7、10、0、1、18
特殊引脚
BOOT(IO09)管脚上电前不能下拉,ESP32会进入下载模式。
使用到IO08管脚进行设计,不建议外部直接下拉,因为在下载烧录时,IO08管脚为低电平,不能使用串口进行下载。
IO12(GPIO12)、IO13(GPIO13)在QIO模式下为SPI信号SPIHD和SPIWP复用,为了增加可用GPIO数量,开发板选择采用2线SPI的DIO模式,IO12、IO13并未连接flash,使用自己编译的软件时需要注意配置flash为DIO模式。
外置SPI flash的VDD已链接至3.3V电源系统,使用时不需再配置其他电源,采用普通2线SPI通信方式,对应管脚如表4-3。
GPIO11默认为SPI flash的VDD引脚,需要配置后才能作为GPIO使用。解锁后不可恢复,建议不要使用此引脚。
GPIO18/19,精简版开发板,无(CH340串口芯片),用板载TYPEC虚拟串口进行刷机和日志查看会用到18和19.请勿使用作为输出输入。
- 若程序上传使用的是Arduino IDE,选择开发板型号为AirM2M Core ESP32C3 或 XIAO ESP32 C3
引脚BOM
- 任意GPIO均可作为PWM脚, 编号与GPIO一致, 但同时只能开启4路PWM,务必注意
引脚 | 主要功能 | 其他功能 | 备注 |
---|---|---|---|
GPIO0 | UART1_TX | ADC_0 | 可直接用 |
GPIO02 | SPI2_CK | ADC_2 | 可直接用 |
GPIO03 | SPI2_MOSI | ADC_3 | 可直接用 |
GPIO04 | I2C_SDA | ADC_4 | 可直接用 |
GPIO05 | I2C_SCL | ADC_5 | 可直接用 |
GPIO06 | 可直接用 | ||
GPIO07 | SPI2_CS | 可直接用 | |
GPIO08 | 拉低时,芯片不能进入下载模式 | ||
GPIO09 | BOOTMODE | 板载按钮(按下拉低) | 拉低时,芯片进入下载模式 |
GPIO1 | UART1_RX | ADC_1 | 可直接用 |
GPIO10 | SPI2_MISO | 可直接用 | |
GPIO11 | VDD_SPI | 默认为SPI flash的VDD引脚,需要配置后才能作为GPIO使用 | |
GPIO12 | SPIHD | 板载LED左(高电平亮) | 可直接用 |
GPIO13 | 板载LED右(高电平亮) | 可直接用 | |
GPIO18 | USB_D- | 可直接用 | |
GPIO19 | USB_D+ | 可直接用 | |
GPIO20 | UART0_RX | 默认串口0 | |
GPIO21 | UART0_TX | 默认串口0 |
板载按钮控制板载LED
代码功能,按下板载按钮boot切换左右LED亮灯显示
#include <Arduino.h>
const int board_btn = 9;
const int board_led_left = 12;
const int board_led_right = 13;
void setup()
{
Serial.begin(9600);
pinMode(board_btn, INPUT);
pinMode(board_led_left, OUTPUT);
pinMode(board_led_right, OUTPUT);
}
void loop()
{
if (digitalRead(board_btn) == HIGH)
//默认为高电平
{
digitalWrite(board_led_left, HIGH);
digitalWrite(board_led_right, LOW);
}
else
// 按下按钮为低电平
{
digitalWrite(board_led_left, LOW);
digitalWrite(board_led_right, HIGH);
}
Serial.println(digitalRead(board_btn));
delay(200);
}
控制舵机
由于esp32c3不支持自带舵机库,因此使用延时方式实现控制舵机
#include <Arduino.h>
const int pin_servo = 10;
const int servo_speed = 5;
unsigned long angle_cur = 0;
bool direction1 = true;
void servo_move(const int pin_servo, unsigned int angle, const int servo_speed = 5)
{
if (angle > 180 || angle < 0)
{
angle = 0;
}
uint32_t time_servo = map(angle, 180, 0, 2400, 544);
digitalWrite(pin_servo, HIGH);
delayMicroseconds(time_servo);
digitalWrite(pin_servo, LOW);
delay(servo_speed);
}
void setup()
{
pinMode(pin_servo, OUTPUT);
servo_move(pin_servo, 0, 5);
}
void loop()
{
if (direction1)
{
angle_cur++;
servo_move(pin_servo, angle_cur, 5);
delay(5);
if (angle_cur >= 180)
direction1 = false;
}
else
{
angle_cur--;
servo_move(pin_servo, angle_cur, 5);
delay(5);
if (angle_cur <= 0)
direction1 = true;
}
}
设置PWM示例
可通过串口控制引脚输出PWM的频率和占空比
点击查看代码
#include <Arduino.h>
#define LED_PIN 6
// 定义串口输入缓冲区大小
#define INPUT_BUFFER_SIZE 64
void setup()
{
// 初始化串口
Serial.begin(115200);
// 初始化GPIO8引脚为输出模式
pinMode(LED_PIN, OUTPUT);
// 串口发送命令提示
Serial.println("Enter frequency and duty cycle (in %) separated by a comma (e.g. 1000,50)");
// 提示输入范围 (1Hz - 10000Hz, 0% - 100%)
Serial.println("Frequency range: 1Hz - 10000Hz ; Duty cycle range: 0% - 100%");
}
void loop()
{
// 定义串口输入缓冲区
char inputBuffer[INPUT_BUFFER_SIZE];
// 如果收到串口输入
if (Serial.available() > 0)
{
// 读取串口输入到缓冲区
Serial.readBytesUntil('\n', inputBuffer, INPUT_BUFFER_SIZE);
// 提取频率和占空比
int frequency = atoi(strtok(inputBuffer, ","));
int dutyCycle = atoi(strtok(NULL, ","));
// 限制频率和占空比在合理范围内 (1Hz - 10000Hz, 0% - 100%)
frequency = constrain(frequency, 1, 10000);
dutyCycle = constrain(dutyCycle, 0, 100);
// 计算PWM频率
int pwmFrequency = map(frequency, 1, 10000, 1, 1000000);
// 设置PWM频率
ledcSetup(0, pwmFrequency, 8);
ledcAttachPin(LED_PIN, 0);
// 计算PWM占空比
int pwmDutyCycle = map(dutyCycle, 0, 100, 0, 255);
// 设置PWM占空比
ledcWrite(0, pwmDutyCycle);
Serial.printf("Frequency: %d, Duty Cycle: %d\n", pwmFrequency, pwmDutyCycle);
}
delay(2);
}
此外在ESP32 Arduino SDK 2.0.6中,乐鑫官方更新并支持了pwm的Arduino api,因此如果你的环境ESP32 Arduino SDK更新至2.0.6,则可以直接使用Arduino的指定API,具体如下
analogWrite(pin, dutycycle):在指定的引脚上启用软件PWM。占空比在0到PWMRANGE之间,默认为1023。
analogWrite(pin, 0):禁用指定引脚上的PWM。
analogWriteResolution(new_range):该功能用于改变PWM分辨率。
analogWriteFrequency(new_frequency):调用此功能可将其更改为新频率.PWM频率范围为1 - 1000hz。
使用platform IO编译
如果使用platformIO编译,则需在platformio.ini
文件中添加以下内容
[env:esp32-c3-devkitm-1]
platform = espressif32
board = esp32-c3-devkitm-1
framework = arduino
board_build.flash_mode = dio
或在platform文件夹中自定义luat开发板,就不同每次都修改platformio.ini
具体方法参考