前言
上一篇文章 单片机---Mac下的开发环境【2】(STM32、Arduino + PlatformIO IDE) 的最后提到了 PlatformIO IDE 开发 STC 单片机程序的可行性。
后来我才发现,实际上 PlatformIO IDE 已经对部分 STC 单片机进行了原生支持,如下图:
可以看到,仅支持 STC15 系列的部分单片机。
实际上支持哪些板子或者单片机都是可配置的,只是这种配置有一定的门槛,当然这个门槛对广大程序员来讲可以忽略不计,但是玩单片机的也有相当一部分电子爱好者,他们不懂太多的软件工程,门槛对于这些人来讲又是比较高的。不过我是希望 PlatformIO 官方可以把这部分做个功能出来,毕竟 GUI 操作更直观、更方便,也让希望能够进行独立配置的伙伴们可以拥有更高的自由度,这不也应该是开源项目的天生特质吗?
回到正题,让我们来看看如何使用 PlatformIO IDE 开发 STC 单片机应用程序。
原生支持的 STC 单片机
我手中的是自己焊接的 STC15W204S 单片机板子,使用内部时钟,有两颗 LED 用来测试代码效果。
下面就用这个板子来简单的演示开发过程
新建项目
这里的 Framework 是无法选择的,因为 IDE 所提供的框架都没有对 STC 进行支持。其他的不再赘述。
项目创建成功??梢钥吹剑瑂rc 目录下并没有自动为我们生成源文件,因为没有框架参与。我们自己创建即可。
编写代码
老套路,还是用 Blink Led 程序来测试。创建源代码文件,然后编写代码如下:
// main.c
#include <8052.h>
// 定义时钟频率
#define MAIN_Fosc 24000000L
// 定义 LED 驱动管脚
#define LED P1_1
void delay_ms(unsigned int ms)
{
unsigned int i;
do
{
i = MAIN_Fosc / 13000;
while (--i)
; //14T per loop
} while (--ms);
}
void main()
{
while (1)
{
// 让 LED 点亮 100ms,熄灭 100ms,循环闪烁。
LED = 0;
delay_ms(100);
LED = 1;
delay_ms(100);
}
}
编译项目
使用快捷键 control+option+B 或者点击左下角的 Build 按钮进行编译。因为没有依赖或者使用框架,所以不用下载资源。其他的不再赘述。
Upload
我使用 FT232 USB 转串口??榻テ?Mac 连接:
在没有进行任何其他配置的情况下,我们看看能不能 Upload 成功:
经过我的测试,结果是会一直卡在这里。那么是因为什么呢?又怎么解决这个问题呢?
大家看上图红框内的信息。对,PlatformIO IDE 在向 STC 单片机 Upload 时使用了 stcgal 这个工具,这个工具在我的这篇文章 单片机---Mac下的开发环境【1】(STC单片机 + SDCC + Stcgal) 中有介绍过。
那么我直接在终端中使用 stcgal 这个工具是可以的,为什么到 IDE 中就不行了呢?那是因为没有指定 stcgal 的 Protocol,我们先看一下可以烧录的 stcgal 命令:
~ stcgal -P stc15 -t 24000 -p /dev/tty.usbserial-A105L08V firmware.hex
这个算是常规来讲比较完整的一个烧录命令,简单介绍一下:
- -P : 用来指定 stcgal 的协议,stc15 就是指 STC15 系列单片机的协议。通常我都不会省略这个参数,因为有些系列不显式的指定协议的话可能会引发一些问题,日后整理好再发布出来;
- -t : 在使用内部时钟时指定时钟频率,这个参数在第一次使用内部时钟时必须填写,不然无法烧录。第一次过后,如果不需要修改内部时钟频率的话,这个参数可以不填;
- -p : 指定端口,必须填写,不然找不到设备;
- firmware.hex : 固件的相对路径。
介绍完可用的命令后,我们再来看为什么 IDE 无法使用 stcgal 成功的 Upload 固件。实际上在分析这个问题的时候我是花费了一些时间的,因为在终端中的显示的信息里面没有任何问题,就是一直卡在 Cycling power 这块。后来我发现,在给单片机重新上电后,USB 转串口??槭怯蟹从Φ?,TXD、RXD 的 LED 灯会闪一下,然后就保持??榈?TXD 的 LED 高速闪烁(看起来很像常亮),这说明??楹偷テ怯型ㄑ兜模徊还鐾ㄑ读四敲匆凰布?,然后??橐恢背⑹苑⑺褪?,单片机没有进一步的响应。啰嗦了这么多不知道小伙伴们能不能看懂 ??。总结来讲,就是与单片机的串口通讯被拒绝了。
发现上面所描述的现象后,问题就变得简单了。因为这一定是 stcgal 协议的问题,这个问题很有可能是 PlatformIO IDE 对 stcgal 的使用存在问题导致的(当然,PlatformIO IDE 能原生支持 STC 就已经很走心了,毕竟老外很少玩 STC 单片机),那么就需要知道 IDE 是如何使用 stcgal 这个工具的。
经过阅读源码,找到了上传固件相关的部分:
重点看 UPLOADERFLAGS 里面的参数,有 -p -t -a,但是没有 -P ,正如我上面所说的,-P 这个参数我都是不会省略的,确实有的系列的 STC 单片机在不给 -P 参数的时候烧录没问题,但有的系列就会有问题,这里省略了这个协议参数,导致 stcgal 与单片机通讯失败。
问题找到了,那就解决呗。我们先简单粗暴的在 UPLOADERFLAGS 加上 -P 参数,指定为 stc15:
添加红框中的代码后保存,然后我们再通过 IDE 上传固件试试看结果如何:
结果符合预期,Upload 成功了,红色框出的位置是修改源码之前卡住的地方,现在把它跨过去成功的将固件上传到单片机中了!
但是问题不能就这么简单粗暴的解决,因为如果要使用 STC8 或者其他系列的 STC 单片机遇到同样的问题怎么办?不能每次都修改源代码??!这不符合开闭原则,这也太不程序猿了!所以我将 PlatformIO IDE 中涉及到 STC 单片机的相关代码进行了优化,向官方提交了 PR(Add "stcgal_protocol" field #16),已经通过并合并进了 develop 分支,会跟随下一版的 IDE 插件发布更新。到时候无需任何配置,写好代码后即可编译上传,敬请期待吧。
官方已经在 1.2.0 版本中添加了我的PR
修改时钟频率
通过 board_build.f_cpu 配置选项可以覆盖板子默认的时钟频率。更多选项参阅官方文档。
非原生支持的 STC 单片机
P.S.
通过解决上面遇到的问题,大概看了一下 PlatformIO IDE 的源码(不看源码怎么解决问题 ??),也因此熟悉了板子的配置文件,所以也就知道了如何自己手动添加原生不支持的板子了。这个如果有小伙伴需要了解,我以后再总结一篇文章出来,本片文章就暂时先不介绍非原生支持的开发了。