目录
- 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封装库存在的问题, 这个封装库在以下方面进行了改进
- 兼容SDCC和Keil C51
FwLib_STC12封装库只支持SDCC编译, 并且寄存器命名与官方不同, 使得基于FwLib_STC12的项目代码与其他Keil开发的项目代码无法兼容. 在FwLib_STC8的开发上, 采用了与官方库文件一致的命名, 并且增加了对Keil C51和SDCC的适配. 基于FwLib_STC8的项目, 可以在Linux下使用SDCC编译, 也可以在Windows下使用Keil C51环境进行编译. - 减小代码尺寸
FwLib_STC12封装库较多使用函数的方式对寄存器进行封装, 而函数与函数间的层级调用都会增加栈开支, 这样一方面8位MCU本来就不多的内存更加捉襟见肘, 另一方面增加了生成的固件尺寸. 在FwLib_STC8封装库中, 大量使用宏语句对寄存器操作进行封装, 并且控制方法间的层级调用深度, 有效节省了固件体积和堆栈占用.
以下介绍在Windows下Keil55开发环境的搭建
配置Keil5开发环境运行演示用例
前提
- 已经安装完成Keil5, 并配置好STC的插件, 如果未完成, 请自行搜索网上的教程和说明
- (可选)本机安装了Git并且可以在命令行下使用git命令
1. 创建项目目录
在文件浏览器中, 创建项目目录, 建议目录路径中不要有中文和空格, 例如本例使用路径
2. 创建Keil5项目
打开Keil5, 点击 Project -> New uVision Project, 在弹出的对话框中, 选择刚才创建的目录, 填入项目名称, 点击保存
3. 选择MCU型号
刚才的保存点击后, 会弹出MCU选择对话框, 在里面选择STC MCU Database,
在下面的列表中选择自己型号的那款, 点击OK保存. 如果没有完全匹配的型号, 则选择同样系列中, 内存数量一致的型号, 例如我使用的是STC8H3K32S2, 在列表中没有此项, 就选用同样是STC8H系列3K内存的STC8H3K64S4
会弹出一个对话框问是否复制STARTUP.A51, 点Yes
4. Keil5 项目结构
Keil5项目就已经创建完成, 这时候其实就已经可以添加官方的头文件, 直接用寄存器进行开发了
项目的目录结构为
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
方式二: 下载zip包后解压
访问这篇文章顶部的项目链接, 在页面上, 点击"克隆/下载" 下载ZIP, 并解压成目录
6. 将FwLib_STC8放入项目目录
将上一步得到的目录, 复制到Keil5项目的目录下, 复制完成后的项目目录结构如下
stc8h_demo/
|
│ STARTUP.A51
│ stc8h_test003.uvproj
├─FwLib_STC8
│ ├─demo
│ ├─include
│ └─src
├─Listings
└─Objects
在文件系统中的目录列表
7. 在Keil5中添加封装库库
通过菜单点开Project -> Manage -> Project Items, 或者直接从图标栏点击对应的图标,
打开文件管理对话框, 在Groups中增加一项, 名称"FwLib_STC8", 这个可以根据需要自己改成别的名称也可以, 点中这个新增加的Group, 在右侧那列点击下面的Add Files, 会弹出一个文件选择对话框
在文件选择对话框中浏览到FwLib_STC8\src, 全选全部c文件(可以使用Ctrl+A), 点Add, 然后点Close,
可以看到文件都已经添加进来了
8. 在Keil5中添加演示用例
保持上一步的窗口不动, 点击选中Source Group 1, 在右侧那列点击下面的Add Files, 会弹出一个文件选择对话框
浏览到 FwLib_STC8\demo\uart, 选中uart1_timer1_tx.c, 这是一个用定时器1做波特率时钟源的串口1测试样例
添加之后, 可以看到增加了对应的文件, 点击OK保存
可以看到, 刚才添加的文件都已经出现在项目树结构中
9. 在Keil5中对项目进行配置
直接对刚才的项目结构进行编译是不行的, 还需要配置一下环境变量, 通过菜单点开Project -> Options for Target ... , 或者直接从图标栏点击项目选项图标
打开选项对话框
如上图, 选中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 目录, 这里是配置封装库的头文件路径.
配置完成后,
再选中Output标签页, 在上面勾选 Create HEX File, 这一步是为了编译后生成用于烧录的hex文件
上面完成后, 点击OK保存
10. 调整代码并编译
因为Windows下使用STC-ISP可以直接设置时钟频率, 所以代码中不需要对MCU时钟进行调整, 这里要打开样例的代码, 如下图所示, 将SYS_SetClock();
这行注释掉, 或删掉, 然后保存文件
点击"3"标识的按钮编译项目, 如果要完整编译, 按右边的按钮, 平时用左边的按钮就可以, 或者使用快捷键F7
因为封装库中很多方法未使用, 编译会提示warning, 这些可以忽略, 只要Errors数量为0
11. 用STC-ISP烧录
在STC-ISP中选中对应的芯片信号, 点击"打开程序文件", 选中刚才生成的hex文件, 文件位置在项目的Objects目录下. 然后点击"下载/编程", 给芯片重新上电后, 就会下载并运行.
12. 观察串口输出
使用任意串口工具, 使用波特率115200连接对应的串口, 可以看到间隔1秒输出的"T40UString".
13. 运行其他用例
如果需要运行其他用例, 将刚才的用例文件从项目树中移除, 再按照前面的流程, 重新添加其他的用例文件就可以了.
也可以自行创建文件编写代码
问题和说明
警告"WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS"
出现这种错误是因为封装库中未使用的函数, 可以忽略, 如果不希望再显示这类的警告, 可以通过以下配置:
- 通过菜单点开Project -> Options for Target ...
- 切换到 BL51 Misc 标签页
- 在 Warnings, Disable Warning Numbers 中填入
16
- 点击 OK 保存
再运行, 就不会报 L16 的警告了
错误"ERROR L107: ADDRESS SPACE OVERFLOW"
出现这种错误, 是因为设置的内存空间不够了, 在 Keil 里面需要设置成 PDATA 或 XDATA, 通过以下配置:
- 通过菜单点开Project -> Options for Target ...
- 切换到 Target 标签页
- 在 Memory Model 中, 选择 Compact: variables in PDATA 或者 Large: variables in XDATA
- 点击 OK 保存
PDATA是256字节, XDATA的空间是最大的, 例如STC8H3K32S2有3K内存, XDATA的空间就是3K字节, 但是访问XDATA 比PDATA慢.
访问XDATA慢的原因: 1)需要通过MOVX访问, 2)地址是16bit因此准备地址也需要多使用一个时钟
结束
以上就是针对Keil5环境, 使用FwLib_STC8封装库进行环境配置和运行演示用例的说明, 如果有问题请留言