STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
目录
- STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
- STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
- STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明
- STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项
- STC8H开发(五): SPI驱动nRF24L01无线模块
- STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
- STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
- STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
- STC8H开发(九): STC8H8K64U模拟USB HID外设
- STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
- STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计
- STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
- STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
- STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
- STC8H开发(十五): GPIO驱动Ci24R1无线模块
配置VSCode开发环境运行演示用例
以下介绍在Linux(本文使用Ubuntu20.04)的VSCode下的环境搭建
前提
- 已经安装完VSCode + PlatformIO环境, 并配置好MCS-51 Platform, 如果未完成, 请自行搜索网上的教程和说明
- 本机已安装git
频率设定和参数准备
因为当前在Linux下不能通过烧录工具调整芯片的内置RC时钟频率, 所以芯片的时钟调整要用其它方法
- 最简单直接的方式, 是在Windows下用STC-ISP将芯片设置到目标频率, 这种方式将来要修改频率时, 需要再次用STC-ISP进行修改
- 如果希望将来在Linux下调整无需使用STC-ISP, 则在STC-ISP烧录时, 勾选最后一项"在程序区结束处添加重要测试参数", 这些参数记录了出厂时对芯片这些频率的标定, 在程序中将这部分参数读出, 今后要使用哪个频率就可以直接设置成对应的频率
- 代码参考 demo/tim/timer0_print_cpuid.c
- 对于版本为7.4.4U以上的芯片, 各频率参数已经固化到CHIPID只读地址, 可以直接读取
- 代码参考 demo/mem/mem_read_chipid.c
- 无Windows环境的情况, 可以通过代码动态调整标定(较不精确), 或者通过示波器标定(精确)
对于第二, 第三, 第四种情况, 需要得到以下4个值, 下面配置项目时会用到:
- IRCBAND: 频段编号, 取值范围为[0x00, 0x11], 对于STC8G和STC8H1K, 因为只有两个频段, 所以取值为[0x00, 0x01]
- VRTRIM: 对应频段的电压标定值
- ITRIM: 对应频段并对应目标频率的裁剪值, 以上三个参数联用就可以确定一个时钟频率
- LITRIM: 对上面三个参数产生的时钟频率的微调
在PlatformIO中添加STC8G,STC8H对应的Board
因为PlatformIO的MCS-51中只包含很少的几种board, 需要预先添加. 对应STC8G, STC8H的board配置可以从这里下载 platform-intel_mcs51/tree/contrib-snovotill/boards.
将这些json都放到你本地PlatformIO对应MCS-51的boards目录下去, 默认路径为用户home目录下的 .platformio/platforms/intel_mcs51/boards 目录, 如图
Update 2022-06-01: 2022-05-02 platform-intel_mcs51 发布了2.0版本, 已经合并PR, 将STC8系列的型号加入board数据库, 上面的操作不再需要了
1. 在VSCode中创建项目
打开VSCode, 在下方点击PlatformIO图标, 打开PlatformIO首页
点击 New Project 打开新项目对话框
在对话框中依次填写
- Name: 填写项目名称
- Board: 选择芯片型号
- Framework: 对于MCS-51, 这一项是空白
- Location: 选择项目目录, 如果不使用默认目录, 则取消勾选, 自己选择路径
- 点击Finish创建项目
期间会弹出对话框问是否信任此目录下所有文件的作者, 选择"Yes"
项目创建完成后, 可以看到项目的目录结构
.
├── include # 项目的头文件路径
├── lib # 项目用到的库文件, FwLib_STC8将放到这个目录下
├── src # 项目的源文件, 项目代码都放到这里
└── test # 项目的测试文件
右侧则是对应当前环境的配置信息
2. 导入FwLib_STC8封装库
在lib上右键, 点击Open Containing Folder, 打开文件夹
在lib文件夹下, 注意路径别错了, 右键点击Open In Terminal, 或者直接Ctrl + Alt + T打开命令行, 直接cd到这个路径下也可以,
执行git命令将项目克隆到当前路径
# github
git clone https://github.com/IOsetting/FwLib_STC8.git FwLib_STC8
# 或者giteee
git clone https://gitee.com/iosetting/fw-lib_-stc8.git FwLib_STC8
回到VSCode, 可以看到 lib 目录下已经多了 FwLib_STC8 这个目录, 并且能看到里面的.h和.c文件. PlatformIO 会根据封装库里的 library.json 将封装库自动配置到项目里
3. 编译演示用例
在项目树中, 浏览路径 FwLib_STC8/demo/uart, 选择uart1_timer1_tx.c
, 这是用Timer1做串口1的波特率发生器的演示代码, 右键点击 Copy,
再到 src 上方右键点击 Paste, 将代码复制到项目代码目录
下面配置编译参数, 打开paltformio.ini, 在下面添加参数,
添加之后的内容为
[env:stc8h3k32s2]
platform = intel_mcs51
board = stc8h3k32s2
build_flags =
-D__CONF_FOSC=36864000UL
-D__CONF_MCU_MODEL=MCU_MODEL_STC8H3K32S2
-D__CONF_CLKDIV=0x02
-D__CONF_IRCBAND=0x03
-D__CONF_VRTRIM=0x19
-D__CONF_IRTRIM=0x28
-D__CONF_LIRTRIM=0x00
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_speed = 1152000
upload_flags =
-p$UPLOAD_PORT
-s$UPLOAD_SPEED
-e
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
对以上编译参数的说明
- build_flags 是编译时传入的编译参数
- __CONF_FOSC 是芯片运行时的时钟频率, 36864000UL 代表36.864MHz, 如果使用STC-ISP设定, 需要与设定的值一致
- __CONF_MCU_MODEL 是芯片型号, 如果不是STC8H3K32S2, 则到include/conf.h 中查找对应的型号
- __CONF_CLKDIV 分频系数, 系统时钟是 FOSC经过分频系数分频后的结果, 默认填0表示不分频
- __CONF_IRCBAND=0x03 以下四个参数都是前面准备阶段需要准备的频率设定值, 如果使用STC-ISP设定, 这四个参数可以不加
- __CONF_VRTRIM=0x19
- __CONF_IRTRIM=0x28
- __CONF_LIRTRIM=0x00
对以上烧录参数的说明
- upload_protocol 烧录协议, 因为stcgal无法烧录stc8g, stc8h, 这里设置为 custom, 表示使用自定义的烧录工具
- upload_port 端口, 连接芯片的USB2TTL对应的串口
- upload_speed 下载使用的波特率
- upload_flags 下载时使用的参数 -e 表示擦除
- upload_command 下载使用的完整命令
如果频率是通过STC-ISP设定, 那么需要将示例代码中的频率设定语句注释掉
void main(void)
{
SYS_SetClock(); // <--- 这行用于根据编译参数直接设置RC时钟, 如果使用STC-ISP设置好的时钟, 要注释掉这行
// UART1, baud 115200, baud source Timer1, 1T mode, no interrupt
UART1_ConfigMode1Dyn8bitUart(UART1_BaudSource_Timer1, HAL_State_ON, 115200);
这时候就可以进行编译了, 点击左侧的PlatformIO图标, 然后点击导航栏中的PROJECT TASKS -> stc8h3k32s2(这里根据你的环境命名可能会不同) -> General -> Build
如果最后显示 SUCCESS, 就表示编译成功
4. 通过 stc8prog 将固件烧录到芯片
前往 stc8prog 的发布页stc8prog/releases下载最新版并解压出 stc8prog 可执行文件. 浏览到自己的PlatformIO的packages安装目录, 默认为用户home目录下的 .platformio/packages 目录.
在下面创建目录 tool-stc8prog, 并将刚才得到的 stc8prog 可执行文件复制到这个目录下
回到VSCode, 就可以执行烧录任务了.
连接好USB2TTL和芯片, 点击左侧PlatformIO图标, 点击导航栏中的 PROJECT TASKS -> stc8h3k32s2(这里根据你的环境命名可能会不同) -> General -> Upload, 待下方出现等待提示后对芯片重新上电, 就会开始下载.
下载完成后就会自动运行, 通过串口工具CuteCOM, 或者命令行screen /dev/ttyUSB0 115200
, 使用8bit波特率115200连接, 可以观察到每隔1秒输出的"T41U string"
5. 运行其它演示用例
如果要运行其它演示用例, 则删除include和src目录下的文件, 再将需要运行的演示用例文件复制到src目录, 按上面的步骤进行编译和烧录即可
PlatformIO 的多环境配置
PlatformIO支持同时配置多个环境, 各环境使用不同的芯片和参数, 并设置其中一个为默认环境, 用快捷键可以直接对默认环境进行编译和烧录, 这点比Keil5要方便很多.
platformio.ini的多环境配置示例如下, 这里配置了两个环境, 一个是stc8h3k32s2芯片的stc8h3k32s2_36m840hz, 另一个是stc8h1k08的stc8h1k08_36m840hz, 并将stc8h3k32s2_36m840hz设置成了默认环境. 在开发中, 可以直接用快捷键Ctrl + F9 唤起编译, 用快捷键 Ctrl + Alt + U 唤起烧录.
[platformio]
default_envs = stc8h3k32s2_36m840hz
[env:stc8h3k32s2_36m840hz]
platform = intel_mcs51
board = stc8h3k32s2
build_flags =
;--opt-code-size
-D__CONF_FOSC=36864000UL
-D__CONF_MCU_MODEL=MCU_MODEL_STC8H3K32S2
-D__CONF_CLKDIV=0x02
-D__CONF_IRCBAND=0x03
-D__CONF_VRTRIM=0x19
-D__CONF_IRTRIM=0x28
-D__CONF_LIRTRIM=0x00
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_speed = 1152000
upload_flags =
-p$UPLOAD_PORT
-s$UPLOAD_SPEED
-e
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
[env:stc8h1k08_36m840hz]
platform = intel_mcs51
board = stc8h1k08
build_flags =
-D__CONF_FOSC=36864000UL
-D__CONF_MCU_MODEL=MCU_MODEL_STC8H1K08
-D__CONF_CLKDIV=0x00
-D__CONF_IRCBAND=0x01
-D__CONF_VRTRIM=0x1F
-D__CONF_IRTRIM=0xB5
-D__CONF_LIRTRIM=0x00
upload_protocol = custom
upload_port = /dev/ttyUSB1
upload_speed = 1152000
upload_flags =
-p$UPLOAD_PORT
-s$UPLOAD_SPEED
-e
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
VSCode 不兼容 SDCC 关键词 __sfr, __interrupt 的问题
VSCode 不支持 SDCC 的扩展关键词, 因此如果在 PlatformIO 中配置项目, 默认情况下, 这些都会在界面上提示错误. 虽然不影响编译, 但是开发中提示错误比较烦人. 如何解决呢? 可以查看 include/fw_reg_base.h, 其中使用__SDCC_SYNTAX_FIX
参数对 VSCode 的场景做了特殊处理, 如果存在__SDCC_SYNTAX_FIX
这个参数, 则将这些 VSCode 无法识别的关键词都使用空串或普通类型代替. 在使用中, 可以这样处理
创建一个用于开发的env, 并将其设置为默认, 这样 VSCode 就不会看到无法识别的关键词, 代码提示都是正确的
[platformio]
default_envs = stc8h3k32s2-syntax
[env:stc8h3k32s2-syntax]
platform = intel_mcs51
board = STC8H3K32S2
build_flags =
-D__SDCC_SYNTAX_FIX
在进行实际的编译和烧录时再使用正常的env, 如果安装了 IntelliJ IDEA 快捷键扩展, 可以用 Shift
+Alt
+F10
调出任务菜单, 选择env进行编译和烧录.
指定内存模型的编译配置(small, medium, large)
与Keil C51中的small, compacted, large相对应, 在PlatformIO中也可以将项目编译为默认使用不同的内存区间. PlatformIO自带的SDCC已经对small-stack-auto, medium, large-stack-auto内存模型分别编译了对应的lib, 可以在目录 ~/.platformio/packages/toolchain-sdcc/share/sdcc/lib 下查看.
如果在项目中需要使用不同的类型编译, 需要增加编译参数(针对用户编写的代码)和link环境参数(针对link阶段使用哪个lib), 例如
[env:stc8h1k08-36m864hz]
platform = intel_mcs51
board = STC8H1K08
build_flags =
--model-large <----- 增加这行
-D__CONF_FOSC=36864000UL
-D__CONF_MCU_MODEL=MCU_MODEL_STC8H1K08
-D__CONF_CLKDIV=0x00
-D__CONF_IRCBAND=0x01
-D__CONF_VRTRIM=0x1F
-D__CONF_IRTRIM=0xB5
-D__CONF_LIRTRIM=0x00
extra_scripts = link_large.py <----- 增加这行
upload_protocol = custom
upload_port = /dev/ttyUSB0
upload_speed = 1152000
upload_flags =
-p$UPLOAD_PORT
-s$UPLOAD_SPEED
-e
upload_command = ${platformio.packages_dir}/tool-stc8prog/stc8prog $UPLOAD_FLAGS -f $SOURCE
对应的link_large.py与platformio.ini放置在同一目录, 内容为
Import("env")
env.Append(LINKFLAGS=["--model-large"])
PlatformIO 不生成 VSCode 配置文件的问题
对于 .pio/build 下的配置文件, 如果要自动生成, 需要打开 Manage -> Settings -> Extensions -> PlatformIO IDE configuration, 勾选 Auto Preload Env Tasks
如果是 .vscode/c_cpp_properties.json 没有自动生成, 则需要在左测栏点击 PlatformIO 图标, 打开扩展菜单, 在里面点击 Miscellaneous -> PlatformIO Core CLI, 然后在打开的命令行中就能执行 pio 命令了, 在里面输入
pio project init --ide vscode
这时候 PlatformIO 会去尝试生成对应的 scode 配置文件, 如果有错误则需要先对应处理.
结束
以上就是针对Linux下, VSCode+PlatformIO环境, 使用FwLib_STC8封装库进行环境配置和运行演示用例的说明.