ESP32-C3-LCDkit 基础入门

1 前言

上篇 ESP32-C3 开发环境搭建 提到了,我买了块乐鑫的 ESP32-C3-LCDkit 开发板,并且搭建好了环境,所以准备跑下 .\esp-idf\examples\get-started 的例程,试试基础的功能。

2 Get-Started

.\esp-idf\examples\get-started 目录下有三个例程,分别是 hello_worldsample_projectblink,所以我们简单分析并运行下这三个例程。

copy esp-idf 的 get-started 文件夹到自己的开发目录,这里我创建了个 esp_study 目录来存放,用于学习对应的 esp 例程。

2.1 hello_world

使用 vscode 打开 hello_world 工程,并且在 hello_world 根目录下保存工作区,并新建一个 .vscode,存放该工作区项目配置和工具相关文件。

完成后,在 .vscode 创建 c_cpp_properties.json,并填入下述内容:

1
2
3
4
5
6
7
8
9
10
{
"configurations": [
{
"includePath": [
"${workspaceFolder}/**"
],
"compileCommands": ".\\build\\compile_commands.json"
}
]
}

这个目的主要是为该工程导入 esp-idf 的文件,防止看代码的时候没办法跳转,不知道函数具体实现。

上述内容填充完毕后,后续的两个工程都可以同样用该方式实现,后面就不赘述了,接下来看代码前,我们先配置一下工程,并让工程跑起来。

  1. 填充 c_cpp_properties.json 内容
  2. 连接设备,并设置 COM 端口
  3. 选择对应的芯片
  4. 点击火焰图标,该按钮会进行编译、烧录并且打开日志监控
  5. 查看输出内容

上述图片可以看出,实现的功能具体是打印了 Hello World!、芯片型号及芯片的资源,随后延时计数 10S 最终调用软件复位接口,复位软件。

我们简单看下代码,

  1. 输出 Hello world!
  2. 调用 esp_chip_info 接口,获取芯片信息,先确定它获取了什么信息,定位到 esp_chip_info_t chip_info 的结构体,它作为变量传入接口,

可以看出该结构体,定义了芯片型号、功能、版本、核心数,那么 esp_chip_info 这个接口,就是为了获取这些内容,我们跳转进去看看,

上面图片可以看到最终为传参填充的数据,不过版本号的获取,还调用了一个函数 efuse_hal_chip_revision,同样的,跳转进去看看,函数最终返回了 efuse_hal_get_major_chip_version() * 100 + efuse_hal_get_minor_chip_version();,为了减少大量图片的引用,所以我直接跳过到最后,

这里能看出,主要版本号和次要版本号都是从 EFUSE - rd_mac_spi_sys_5 寄存器中获取,关于乐鑫这款芯片的可以访问 EFUSE,里面有对应的 eFuse 管理器说明,我们只需要知道它是在 EFUSE BLOCK 寄存器中获取的就可以了。

在路径 .\esp-idf\components\efuse\esp32c3\ 可以看到 esp_efuse_table.csv,它描述了 Efuse 的字段。

确定了芯片信息获取接口执行的内容后,这些打印的信息就简单多了。

  1. 调用 esp_flash_get_size 接口,这个很好理解,读取对应的 flash 大小,工程默认配置是 2M flash,所以输出的时候是不对的,需要去 menuconfig 修改工程配置 Serial flasher config -> Flash size -> 4MB。不过 esp32-c3-lcdkit 标注的是内部 4MBFlash,但其是相对于 ESP32-C3-MINI-1 这个模组,对于 ESP32-C3 芯片来说,其实是外部的 Flash,所以输出的日志可以看到是外部 2Mb flash,这点一开始我存在疑惑,我也提交了对应的 PR,感谢乐鑫开发者的不吝指教
  2. 调用 esp_get_minimum_free_heap_size 获取了剩余的堆的大小,这个暂时不深究,了解其作用就可以了。
  3. for 循环 10 次,每次延时 1S 并输出 log,最后调用 esp_restart,进行复位。

2.2 sample_project

对于 sample_project 这个例程,可以跳过,不过官方推荐用该例程作为新项目的模板,并且这个例程的 main.capp_main 没有任何操作。

hello_world 一样,创建工作区、创建 c_cpp_properties.json 文件,完成后配置工程,让其跑起来先,

开发板上只有一个 RGB LED,并没有普通的 LED 可以驱动,而且接到了芯片的 IO8 脚位,所以配置工程时,需要确定我们的 IO 口和对应 LED 类型是否正确,

  • Blink LED type 需要勾选 RMT - Addressable LED
  • Blink GPIO number 需要设置为 8
  • Blink period in ms 默认即可。

确认无误后,点击右上方的保存,点击编译烧录并监控日志,

简单看下代码,

  1. 执行 configure_led 配置 LED 管脚
  2. 输出 Example configured to blink addressable LED!,并且设置 led_strip_config_t 结构体,填充当前使用的 IO 和最大的 LED 数,开发板上只有一颗,所以默认填充 1,配置 rmt 频率为 10MHz,RMT(Remote Control),本质是用于红外发送/接收红外遥控信号的,由于 RMT 模块的灵活性,还可以用来生成和接收许多相似类型的信号,这里不做深究,调用 led_strip_new_rmt_device 接口,基于 RMT TX 通道来设置 led strip,
  3. 配置完成后,while 循环中会定时翻转 LED,并输出 Turning the LED ON/OFF,根据 Blink period 来延时翻转,翻转调用的 blink_ledON 调用了 led_strip_set_pixel(led_strip, 0, 16, 16, 16),设置对应的 RGB,并刷新显示,OFF 则调用 led_strip_clear 清除,从而达到闪烁的效果。

最终效果如下:

3 结语

到这里,基本都没有问题了。过程中有什么不能理解的,可以留言告知我!有什么错误,也可以指出来告诉我~