新建工程项目配置

Catalogue
  1. 1. 芯片依赖包
  2. 2. 创建工程文件结构
  3. 3. 添加工程内容
    1. 3.1. 寄存器容量
  4. 4. 配置编译内容输出
  5. 5. 配置基础库搜索路径
    1. 5.1. 头文件搜索
    2. 5.2. 重复定义
    3. 5.3. 配置编译选项宏定义
  6. 6. 更改main文件
  7. 7. tips
  8. 8. 问题反馈
    1. 8.1. 部分编译器宏定义不再支持
    2. 8.2. 标准库和串口库冲突
    3. 8.3. mircoLib 选项
  9. 9. 参考资料

芯片依赖包

创建工程文件结构

添加工程内容

  • USER (个人代码)
    • mian
    • 中断定义
    • 初始化时钟
  • HARDWARE (外设驱动FWLib进行调用函数)
  • 系统文件(system)
    • delay (延时)
    • sys (IO)
    • usart (串口)
  • CORE (固件核心和启动文件*.s)
  • FWLIB (STM提供的外设固件源文件和头文件)
  • README

寄存器容量

配置编译内容输出

配置基础库搜索路径

头文件搜索

重复定义

配置编译选项宏定义

  • STM32F10X_HD,USE_STDPERIPH_DRIVER

此处定义了两个宏,一个是STM32F10X_HD另一个是USE_STDPERIPH_DRIVER 使用后者可以调用main函数中的条件宏,使其包含硬件固件库,前者对于部分不同的外设选择和硬件匹配的函数

更改main文件

历史错误生成的中间文件会导致编译出现错误

tips

  • 勾选show include files dependencies,展示库间依赖

问题反馈

部分编译器宏定义不再支持

新版的Keil5.36采用了较队里老本本Keil5升级了编译器,将以前的Arm Compiler5(AC5)升级到了AC6

1
2
3
4
#pragma import(__use_no_semihosting)    



AC6较AC5的优势

  • 最为直观的感受就是编译速度提高了很多
  • 代码大小减少
  • 支持C ++ 14标准
  • 使用TrustZone for Armv8-M为设备创建安全和非安全代码
  • 兼容基于GCC创建的源代码,也就是GCC可以编译的源码它也能编译

缺陷的话可能需要迁移老版本库,部分正点原子等第三方修改的系统头文件和源文件无法正常加载,在相关函数可以忽略的情况下可以在Keil5中勾选对应的库同时删除自己工程可以解决部分问题,其余情况可以参考下面参考文献教程。迁移过于困难暂时将编译器调成的AC5即可

Pasted image 20220121151022

标准库和串口库冲突

标准库arm/include/stdio.h
STM32 usart.c
两者均定义了

1
2
3
4
5
6
7
8
9
10
11
// usart.c
struct __FILE
{
int handle;

};

// stdio.h
typedef struct __FILE FILE;


mircoLib 选项

在keil建立ARM的工程时

其中有一项是选 use MicroLIB
microlib 是缺省 C 库的备选库。 它旨在与需要装入到极少量内存中的深层嵌入式应用程序配合使用。 这些应用程序不在操作系统中运行。

microlib 进行了高度优化以使代码变得很小。 它的功能比缺省 C 库少,并且根本不具备某些 ISO C 特性。 某些库函数的运行速度也比较慢,例如,memcpy()

与缺省 C 库之间的差异

microlib 与缺省 C 库之间的主要差异是:

  • microlib 不符合 ISO C 库标准。 不支持某些 ISO 特性,并且其他特性具有的功能也较少。
  • microlib 不符合 IEEE 754 二进制浮点算法标准。
  • microlib 进行了高度优化以使代码变得很小。
  • 无法对区域设置进行配置。 缺省 C 区域设置是唯一可用的区域设置。
  • 不能将 main() 声明为使用参数,并且不能返回内容。
  • 不支持 stdio,但未缓冲的 stdinstdoutstderr 除外。
  • microlib 对 C99 函数提供有限的支持。
  • microlib 不支持操作系统函数。
  • microlib 不支持与位置无关的代码。
  • microlib 不提供互斥锁来防止非线程安全的代码。
  • microlib 不支持宽字符或多字节字符串。
  • 与 stdlib 不同,microlib 不支持可选择的单或双区内存模型。 microlib 只提供双区内存模型,即单独的堆栈和堆区。
  • 可以合理地将 microlib 与 --fpmode=std--fpmode=fast 配合使用。

microlib 中的函数负责:

  • 创建一个可在其中执行 C 程序的环境。 这包括:
    • 创建一个堆栈
    • 创建一个堆(如果需要)
    • 初始化程序所用的库的部分组成内容。
  • 调用 main() 以开始执行程序。

要使用 microlib 构建程序,必须使用命令行选项 :library_type=microlib。 根据需要,编译器、汇编程序或链接器可使用此选项处理不同的文件。 将此选项与链接器配合使用时,将覆盖所有其他选项。

参考资料

(38条消息) Keil MDK 编译器 AC5 和 AC6 优化选项重要内容和区别_strongerHuang-CSDN博客
(转)keil应用小贴士:Use MicroLIB是干什么的_Denniky_新浪博客 (sina.com.cn)