大约是2019年那会儿,自己做了一个ESP32的开发板,使用的模块是ESP32-S。这个模块我在乐鑫官网一直没找到,应该是安信可从乐鑫买的芯片ESP32(不带S),然后自己做模块,起的名字。
当时乐鑫提供的开发环境,懂得都懂,那叫一个倒反天罡,用过的人没有一个不说难用。幸好安信可感觉他们家芯片有价值,于是自己想办法,基于Eclipse做了二次开发,提供了一个说得过去的开发环境,但也仅仅是说得过去。
我当时在那个环境下完成了ESP8266的自学,想着再把ESP32学一下,后来一方面原因是精力分散,另一方面实在是有点恨铁不成钢,所以就暂停了。
几年后,乐鑫应该是意识到了这个问题。在VS Code上提供了idf插件,可以很方便的实现开发环境的搭建。于是我又翻出了当年做的那个小板子,看着它,异常怀念,再点一次灯吧。
开发环境的搭建就不说了,网上资料很多,直接从点亮LED开始。
一、新建工程
在VS Code的idf插件页面,点击新建工程:New project。
点击后,弹出如下页面,依次输入工程名称、存放路径、板子型号,推测我手里的ESP32-S应该是普通的ESP32芯片,所以随便选了一个。最后选择:Choose Template。意思是从官方的例程中,选一个做为新工程的模板。
点击后,跳转到创建新项目的页面。
依次选择:ESP-IDF,然后从下面的例程中点击:blink,即可以此为模板,创建我们的新工程。
箭头3指向的位置,说明该工程支持的芯片型号。然后点击位置4。这时电脑屏幕的右下角弹出一个提示框,如图。
大致意思是,工程已经被创建,是否在新窗口中打开。点击:YES ,即可。
如上图,工程创建成功,双击main下的c文件,即可打开该工程主要代码,如右侧所示。
二、工程编译
工程创建成功后,先编译一下工程,因为有很多信息要编译之后才能准确显示。点击VS Code左下方工具栏里,类似扳手的图标,开始进行编译。
如上图所示,箭头1对应的位置为编译的按钮;箭头2对应的位置为编译成功输出的信息。第一次编译花的时间比较多,我这里用了大约4分钟左右。
因为代码里有很多基于“#ifdef”的条件编译代码,只能等编译成功后,编辑器获取完整的信息,才能正确显示“#ifdef”对应的信息。
这时再看它的代码,大致能看懂。就是个点灯的例子,但是也分成了两种。
#ifdef CONFIG_BLINK_LED_STRIP
#elif CONFIG_BLINK_LED_GPIO
一种是普通的点灯:CONFIG_BLINK_LED_GPIO。即一个IO配置为输出模式,控制一个LED,定时翻转。
另一种控制的是类似WS2812这种的三色LED:CONFIG_BLINK_LED_STRIP。也是只需要一个IO,只要按照特定时序发送信号,就能控制一个三色LED。
这一节先看普通的点灯。对应的IO编号是:CONFIG_BLINK_GPIO。
鼠标右键点击,选择:查找定义。可以看到它实际对应的管脚编号,是IO5。如下图:
在这里,我们可以把它改成板子上实际要用的IO编号。我这里实际使用的IO是26,改成26即可。
但实际,正规的修改方法不是在这,而是通过menuconfig。
几年前,我也写过ESP32点灯的文章,当时找不到IO编号修改的位置,现在终于把这个坑添上了。
三、进入menuconfig修改配置
menuconfig是一套图像化管理工具,主要用于Linux系统下,管理代码工程、模块及功能。乐鑫的工作人员把这套工具用到了ESP8266和ESP32的管理上,实现了这类芯片功能的图形化配置。
(万恶的产品经理,一个单片机级别的东西,搞得这么复杂!!!!)
使用方法很简单,在界面最下面点击箭头1所示位置:打开ESP-IDF终端。然后在位置2(终端)那里输入相关指令。
注意,一定要先点击位置1,使用工具栏的按钮打开终端,不要直接点击位置2的终端。虽然直接点击位置2,看起来效果是一样的,但它是不支持命令输入的。
在位置2输入命令:idf.py menuconfig,然后敲回车。
弹出menuconfig界面,可以用鼠标调整边框来调整显示区域,效果如下:
该页面下,鼠标无效,主要靠键盘。使用键盘上的上下箭头,移动到:Example Configuration 这一行,敲回车。弹出如下页面:
在第二行,可以看到:Blink GPIO number的编辑选项。移动到第二行,敲回车,显示如下:
输入板子上对应的LED管脚,我这里是IO26,输入26,然后敲回车即可。观察下面的快捷键,“S”是保存,“Q”是保存+退出。保险起见,我们先按“S”,再按“Q”。中间有提示你需要确认的,直接敲回车即可。
退的不干净,有残影。不停的敲回车,刷新过去即可。
四、再次编译
因为做了修改,所以要再次点击编译按钮。这次会快一些,差不多两分钟吧。
五、程序烧录
先要确保板子已经通过USB数据线连接到电脑上,驱动已经正常安装。设备管理器中能看到对应的串口号,我这里是COM4。
如上图,点击左下侧端口那里。最上面会显示当前电脑中连接的串口,点击COM4即可。
点击五角星那里选择烧录方法,然后在上面弹出的下拉框那里选择UART。
最后点击五角星旁边的闪电按钮,完成程序的烧录。下载成功后,提升如下信息:
现在,可以看到板子上的LED,正在一闪一闪的闪烁。和程序中设定的1秒的实际能够对应上。
六、对照程序
回到主函数中,看一下主要的代码功能。其实也很简单,一个是GPIO的初始化,然后就是进入while中的一个死循环。在里面不停的打印信息、更新LED状态、延时。
void app_main(void)
{
/* Configure the peripheral according to the LED type */
configure_led();
while (1) {
ESP_LOGI(TAG, "Turning the LED %s!", s_led_state == true ? "ON" : "OFF");
blink_led();
/* Toggle the LED state */
s_led_state = !s_led_state;
vTaskDelay(CONFIG_BLINK_PERIOD / portTICK_PERIOD_MS);
}
}
至此,LED点灯成功,5年前的坑终于添上了。