目录

  • 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高精度实时时钟芯片

介绍

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. 创建项目目录

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

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"

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

  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封装库(图文详解)相关推荐

  1. Hadoop入门(二)——VMware虚拟网络设置+Windows10的IP地址配置+CentOS7静态IP设置(图文详解步骤2021)

    Hadoop入门(二)--VMware虚拟网络设置+Windows10的IP地址配置+CentOS7静态IP设置(图文详解步骤2021) 之前在上一篇文章中讲述了 CentOS7下载+VM上安装(手动 ...

  2. 电脑连接电视方法详解_查看电脑配置的几种方法(图文详解)

    很多朋友想要了解自己电脑详细的配置的时候,一般都是通过第三方的工具检测的.那么有没有其他更好的方法可以在win系统下查看电脑配置呢?今天我就给大家分享一下如何查看电脑配置. 查看电脑配置的几种方法图文 ...

  3. 前端中全部盒子靠左对齐_图文详解ul中li内容垂直居中和水平居中的方法

    在页面布局时,经常会用到li标签,它可用于列表,导航,选项卡等等,那你知道如何让ul中的li居中吗?这篇文章就和大家讲讲如何让ul中的li水平居中以及如何让li内容垂直居中.感兴趣的朋友继续往下看吧. ...

  4. PyCharm中使用Git/GitHub详细步骤(图文详解)

    环境:pycharm 2020.2,git 2.28,github账户,windows10 配置PyCharm中的Git: 启动PyCharm,点击[File]→[Settings]→[Version ...

  5. 怎样在项目中使用git以及github管理(图文详解流程讲解)

    Github新建项目 1.登录github,点击右上角新建仓库 2.输入仓库名以及描述等,点击Create resposity 3.新建仓库完成后,右边有个clone or download,复制SS ...

  6. java 线程 状态 图_Java线程中的生命周期和状态控制图文详解

    这篇文章主要介绍了Java线程的生命周期和状态控制,需要的朋友可以参考下 一.线程的生命周期 线程状态转换图: 1.新建状态 用new关键字和Thread类或其子类建立一个线程对象后,该线程对象就处于 ...

  7. 如何快速将文本中的tab更换成逗号(图文详解)

    不多说,直接上干货! 现有一份数据如下. 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点 ...

  8. python中range 函数_Python range()函数用法图文详解

    python内置range()函数的作用是什么?它能返回一系列连续增加的整数,它的工作方式类似于分片,可以生成一个列表对象.range函数大多数时常出现在for循环中,在for循环中可做为索引使用.其 ...

  9. 如何快速将文件中的空格更换成逗号(图文详解)

    不多说,直接上干货! 现有一份数据如下. 下载日志数据并分析 到搜狗实验室下载用户查询日志 1) 介绍 搜索引擎查询日志库设计为包括约1个月(2008年6月)Sogou搜索引擎部分网页查询需求及用户点 ...

最新文章

  1. 最佳DevOps工具获奖者:CloudBees Jenkins平台
  2. Java长存!12个Java长久占居主要地位的原因
  3. 皮一皮:下班的渴望...
  4. 一个算法对于某个输入的循环次数是可以事先估计出来的_结合各路博客的EM算法理解...
  5. python函数参数为类对象_将Cython类对象作为参数传递给C函数
  6. HDU - 4348To the moon——主席树+区间修改
  7. linux可配置哪些服务,linux操作系统下服务配置
  8. 服务器磁盘扩展卷时遭遇“There is not enough space available on the disk(s) to complete this operation.”错误...
  9. 在Android NDK下打印log
  10. 日志收集神器 Logstash,闪亮登场~
  11. 浙江工大学计算机学院保研,浙江工业大学计算机学院保研初试名单
  12. Python爬虫伪装,请求头User-Agent池,和代理IP池搭建使用
  13. 全国代收货款平台-快递鸟、菜鸟
  14. Linux|操作系统
  15. python牛顿法解非线性方程组_用牛顿迭代法解非线性方程组
  16. 【a-table表格内容移动表头不跟随移动的解决方案】
  17. 寻人风波——解决iphone4s无法接听的问题
  18. uniapp + uniCloud+unipay 实现微信小程序支付功能
  19. 我竟在一篇AI顶会论文里见到了小猪佩奇...
  20. 终生好习惯:早上白开水一杯——年轻漂亮一辈子

热门文章

  1. JAVA实现矩阵连乘
  2. win10可以联网,但显示无法连接到Internet
  3. wsl2显示无NVIDIA显卡驱动
  4. 关于exists的理解(一)
  5. 步之道︱适宜步行和不适宜步行的城市究竟什么样?
  6. 于四则运算的求导法则
  7. 如果今天是星期三,后天就是星期五;如果今天是星期六,后天就是星期一。我们用数字1到7对应星期一到星期日。给定某一天,请你输出那天的“后天”是星期几。
  8. 声明:声明:声明:声明
  9. 零基础创作专业wordpress网站05-将主页面设置为主页
  10. 人月神话之七 未雨绸缪