STC8H开发(一): 在Keil5中配置和使用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无线传输音频(对讲机原型)

介绍

FwLib_STC8 是一个针对STC8G, STC8H系列MCU的C语言封装库, 适用于基于这些MCU的快速原型验证.

  • 项目地址: Gitee FwLib_STC8
  • 镜像地址: GitHub FwLib_STC8

为避免之前STC12封装库存在的问题, 这个封装库在以下方面进行了改进

  1. 兼容SDCC和Keil C51
    FwLib_STC12封装库只支持SDCC编译, 并且寄存器命名与官方不同, 使得基于FwLib_STC12的项目代码与其他Keil开发的项目代码无法兼容. 在FwLib_STC8的开发上, 采用了与官方库文件一致的命名, 并且增加了对Keil C51和SDCC的适配. 基于FwLib_STC8的项目, 可以在Linux下使用SDCC编译, 也可以在Windows下使用Keil C51环境进行编译.
  2. 减小代码尺寸
    FwLib_STC12封装库较多使用函数的方式对寄存器进行封装, 而函数与函数间的层级调用都会增加栈开支, 这样一方面8位MCU本来就不多的内存更加捉襟见肘, 另一方面增加了生成的固件尺寸. 在FwLib_STC8封装库中, 大量使用宏语句对寄存器操作进行封装, 并且控制方法间的层级调用深度, 有效节省了固件体积和堆栈占用.

以下介绍在Windows下Keil55开发环境的搭建

配置Keil5开发环境运行演示用例

前提

  1. 已经安装完成Keil5, 并配置好STC的插件, 如果未完成, 请自行搜索网上的教程和说明
  2. (可选)本机安装了Git并且可以在命令行下使用git命令

1. 创建项目目录

在文件浏览器中, 创建项目目录, 建议目录路径中不要有中文和空格, 例如本例使用路径

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第1张图片

2. 创建Keil5项目

打开Keil5, 点击 Project -> New uVision Project, 在弹出的对话框中, 选择刚才创建的目录, 填入项目名称, 点击保存

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第2张图片

3. 选择MCU型号

刚才的保存点击后, 会弹出MCU选择对话框, 在里面选择STC MCU Database,

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第3张图片

在下面的列表中选择自己型号的那款, 点击OK保存. 如果没有完全匹配的型号, 则选择同样系列中, 内存数量一致的型号, 例如我使用的是STC8H3K32S2, 在列表中没有此项, 就选用同样是STC8H系列3K内存的STC8H3K64S4

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第4张图片

会弹出一个对话框问是否复制STARTUP.A51, 点Yes

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第5张图片

4. Keil5 项目结构

Keil5项目就已经创建完成, 这时候其实就已经可以添加官方的头文件, 直接用寄存器进行开发了

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第6张图片

项目的目录结构为

stc8h_demo/
|
│  STARTUP.A51
│  stc8h_demo.uvproj
├─Listings
└─Objects

5. 下载FwLib_STC8

可以通过git clone导出项目代码, 或者直接下载zip包解压

方式一: 通过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

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第7张图片

方式二: 下载zip包后解压
访问这篇文章顶部的项目链接, 在页面上, 点击"克隆/下载" 下载ZIP, 并解压成目录

6. 将FwLib_STC8放入项目目录

将上一步得到的目录, 复制到Keil5项目的目录下, 复制完成后的项目目录结构如下

stc8h_demo/
|
│  STARTUP.A51
│  stc8h_test003.uvproj
├─FwLib_STC8
│  ├─demo
│  ├─include
│  └─src
├─Listings
└─Objects

在文件系统中的目录列表

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第8张图片

7. 在Keil5中添加封装库库

通过菜单点开Project -> Manage -> Project Items, 或者直接从图标栏点击对应的图标,

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第9张图片

打开文件管理对话框, 在Groups中增加一项, 名称"FwLib_STC8", 这个可以根据需要自己改成别的名称也可以, 点中这个新增加的Group, 在右侧那列点击下面的Add Files, 会弹出一个文件选择对话框

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第10张图片

在文件选择对话框中浏览到FwLib_STC8\src, 全选全部c文件(可以使用Ctrl+A), 点Add, 然后点Close,

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第11张图片

可以看到文件都已经添加进来了

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第12张图片

8. 在Keil5中添加演示用例

保持上一步的窗口不动, 点击选中Source Group 1, 在右侧那列点击下面的Add Files, 会弹出一个文件选择对话框

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第13张图片

浏览到 FwLib_STC8\demo\uart, 选中uart1_timer1_tx.c, 这是一个用定时器1做波特率时钟源的串口1测试样例

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第14张图片

添加之后, 可以看到增加了对应的文件, 点击OK保存

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第15张图片

可以看到, 刚才添加的文件都已经出现在项目树结构中

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第16张图片

9. 在Keil5中对项目进行配置

直接对刚才的项目结构进行编译是不行的, 还需要配置一下环境变量, 通过菜单点开Project -> Options for Target ... , 或者直接从图标栏点击项目选项图标

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第17张图片

打开选项对话框

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第18张图片

如上图, 选中C51标签页, 在"2"标识的输入框中, 输入

__CX51__, __CONF_MCU_MODEL=MCU_MODEL_STC8H3K32S2,__CONF_FOSC=36864000UL

对上面各项的说明

  • __CX51__ 是将当前编译环境配置为C51
  • __CONF_MCU_MODEL, 这里设置对应的MCU型号, 当前使用的型号为MCU_MODEL_STC8H3K32S2, 如果你的芯片不是这个, 需要修改成对应的型号, 具体的型号可以在FwLib_STC8/include/fw_conf.h中查找. 注: STC8G只列了大型号, 只需要填大型号即可.
  • __CONF_FOSC 是这个程序运行时将使用的振荡频率, 取决于你用STC-ISP烧录时会用什么频率, 在这里填入对应的数字, 最后的UL代表这个数字是无符号长整数

然后点击"3", 在弹出的对话框中, 选中FwLib_STC8/include 目录, 这里是配置封装库的头文件路径.

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第19张图片

配置完成后,

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第20张图片

再选中Output标签页, 在上面勾选 Create HEX File, 这一步是为了编译后生成用于烧录的hex文件

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第21张图片

上面完成后, 点击OK保存

10. 调整代码并编译

因为Windows下使用STC-ISP可以直接设置时钟频率, 所以代码中不需要对MCU时钟进行调整, 这里要打开样例的代码, 如下图所示, 将SYS_SetClock();这行注释掉, 或删掉, 然后保存文件

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第22张图片

点击"3"标识的按钮编译项目, 如果要完整编译, 按右边的按钮, 平时用左边的按钮就可以, 或者使用快捷键F7

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第23张图片

因为封装库中很多方法未使用, 编译会提示warning, 这些可以忽略, 只要Errors数量为0

11. 用STC-ISP烧录

在STC-ISP中选中对应的芯片信号, 点击"打开程序文件", 选中刚才生成的hex文件, 文件位置在项目的Objects目录下. 然后点击"下载/编程", 给芯片重新上电后, 就会下载并运行.

12. 观察串口输出

使用任意串口工具, 使用波特率115200连接对应的串口, 可以看到间隔1秒输出的"T40UString".

13. 运行其他用例

如果需要运行其他用例, 将刚才的用例文件从项目树中移除, 再按照前面的流程, 重新添加其他的用例文件就可以了.

STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)_第24张图片

也可以自行创建文件编写代码

问题和说明

警告"WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS"

出现这种错误是因为封装库中未使用的函数, 可以忽略, 如果不希望再显示这类的警告, 可以通过以下配置:

  1. 通过菜单点开Project -> Options for Target ...
  2. 切换到 BL51 Misc 标签页
  3. 在 Warnings, Disable Warning Numbers 中填入 16
  4. 点击 OK 保存

再运行, 就不会报 L16 的警告了

错误"ERROR L107: ADDRESS SPACE OVERFLOW"

出现这种错误, 是因为设置的内存空间不够了, 在 Keil 里面需要设置成 PDATA 或 XDATA, 通过以下配置:

  1. 通过菜单点开Project -> Options for Target ...
  2. 切换到 Target 标签页
  3. 在 Memory Model 中, 选择 Compact: variables in PDATA 或者 Large: variables in XDATA
  4. 点击 OK 保存

PDATA是256字节, XDATA的空间是最大的, 例如STC8H3K32S2有3K内存, XDATA的空间就是3K字节, 但是访问XDATA 比PDATA慢.

访问XDATA慢的原因: 1)需要通过MOVX访问, 2)地址是16bit因此准备地址也需要多使用一个时钟

结束

以上就是针对Keil5环境, 使用FwLib_STC8封装库进行环境配置和运行演示用例的说明, 如果有问题请留言

你可能感兴趣的:(STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解))