单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)

前言

上一篇文章 单片机---Mac下的开发环境【2】(STM32、Arduino + PlatformIO IDE) 的最后提到了 PlatformIO IDE 开发 STC 单片机程序的可行性。

后来我才发现,实际上 PlatformIO IDE 已经对部分 STC 单片机进行了原生支持,如下图:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第1张图片
STC supported.png

可以看到,仅支持 STC15 系列的部分单片机。

实际上支持哪些板子或者单片机都是可配置的,只是这种配置有一定的门槛,当然这个门槛对广大程序员来讲可以忽略不计,但是玩单片机的也有相当一部分电子爱好者,他们不懂太多的软件工程,门槛对于这些人来讲又是比较高的。不过我是希望 PlatformIO 官方可以把这部分做个功能出来,毕竟 GUI 操作更直观、更方便,也让希望能够进行独立配置的伙伴们可以拥有更高的自由度,这不也应该是开源项目的天生特质吗?

回到正题,让我们来看看如何使用 PlatformIO IDE 开发 STC 单片机应用程序。

原生支持的 STC 单片机

我手中的是自己焊接的 STC15W204S 单片机板子,使用内部时钟,有两颗 LED 用来测试代码效果。

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第2张图片
STC15W204S.png

下面就用这个板子来简单的演示开发过程

新建项目

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第3张图片
New Project.png

这里的 Framework 是无法选择的,因为 IDE 所提供的框架都没有对 STC 进行支持。其他的不再赘述。

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第4张图片
Created.png

项目创建成功。可以看到,src 目录下并没有自动为我们生成源文件,因为没有框架参与。我们自己创建即可。

编写代码

老套路,还是用 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 连接:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第5张图片
USB 转串口.png

在没有进行任何其他配置的情况下,我们看看能不能 Upload 成功:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第6张图片
Upload stuck.png

经过我的测试,结果是会一直卡在这里。那么是因为什么呢?又怎么解决这个问题呢?

大家看上图红框内的信息。对,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 这个工具的。

经过阅读源码,找到了上传固件相关的部分:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第7张图片
platform-intel_mcs51/builder/main.py

重点看 UPLOADERFLAGS 里面的参数,有 -p -t -a,但是没有 -P ,正如我上面所说的,-P 这个参数我都是不会省略的,确实有的系列的 STC 单片机在不给 -P 参数的时候烧录没问题,但有的系列就会有问题,这里省略了这个协议参数,导致 stcgal 与单片机通讯失败。

问题找到了,那就解决呗。我们先简单粗暴的在 UPLOADERFLAGS 加上 -P 参数,指定为 stc15:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第8张图片
Modify platform-intel_mcs51/builder/main.py.png

添加红框中的代码后保存,然后我们再通过 IDE 上传固件试试看结果如何:

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第9张图片
Upload success.png
结果符合预期,Upload 成功了,红色框出的位置是修改源码之前卡住的地方,现在把它跨过去成功的将固件上传到单片机中了!

但是问题不能就这么简单粗暴的解决,因为如果要使用 STC8 或者其他系列的 STC 单片机遇到同样的问题怎么办?不能每次都修改源代码啊!这不符合开闭原则,这也太不程序猿了!所以我将 PlatformIO IDE 中涉及到 STC 单片机的相关代码进行了优化,向官方提交了 PRAdd "stcgal_protocol" field #16),已经通过并合并进了 develop 分支,会跟随下一版的 IDE 插件发布更新。到时候无需任何配置,写好代码后即可编译上传,敬请期待吧。

官方已经在 1.2.0 版本中添加了我的PR

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第10张图片
屏幕快照 2019-05-17 上午10.54.29.png

修改时钟频率

单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE)_第11张图片
Change MCU frequency.png

通过 board_build.f_cpu 配置选项可以覆盖板子默认的时钟频率。更多选项参阅官方文档。

非原生支持的 STC 单片机

P.S.

通过解决上面遇到的问题,大概看了一下 PlatformIO IDE 的源码(不看源码怎么解决问题 ),也因此熟悉了板子的配置文件,所以也就知道了如何自己手动添加原生不支持的板子了。这个如果有小伙伴需要了解,我以后再总结一篇文章出来,本片文章就暂时先不介绍非原生支持的开发了。

--- The End ---

你可能感兴趣的:(单片机---Mac下的开发环境【3】(STC单片机 + PlatformIO IDE))