中级会员
 
- 积分
- 317
- 金钱
- 317
- 注册时间
- 2017-9-16
- 在线时间
- 80 小时
|
我们需要的工具主要有:
- 带有ARM后端的LLVM
- Clang
- Compiler-RT
- CMSIS以及对应驱动
- 其他工具
由于是裸机开发,因此对于C的标准库仅有有限的支持。以F7为例,目标平台是arm-none-eabi,使用硬浮点。具体选项我整理成了一个cmake的toolchain file,可以在这里查看
首先是使用CMake配置并交叉编译Compiler-RT,可以参考官方文档。在编译过程中,会需要一些标准库中assert.h,stdlib.h等,这里可以只给出声明,不给实现,使用的CMake选项主要有:
COMPILER_RT_OS_DIR="baremetal" COMPILER_RT_BUILD_BUILTINS=ON COMPILER_RT_BUILD_SANITIZERS=OFF COMPILER_RT_BUILD_XRAY=OFF COMPILER_RT_BUILD_LIBFUZZER=OFF COMPILER_RT_BUILD_PROFILE=OFF
构建完成后,可在lib/baremetal目录中找到libclang_rt.builtins-arm*.a,该文件的结尾与具体的目标有关。
之后便可以使用Clang对程序编译,链接后即可通过OpenOCD进行调试。
在VScode中,我们需要的主要插件是Cortex-Debug配合launch.json对开发板调试。launch.json主要内容为:
其中“servertype”与你使用的调试器有关,这里使用的是OpenOCD。"swoConfig"是配置ITM端口,使得单片机在使用SWD的情况下进行IO(即不使用串口,直接使用ST-Link或JLink就可以实现IO)。我们这里启用端口0。"cpuFrequency"与单片机频率一致,图片中的配置会将ITM的输出显示在控制台上。
"svdFile" 保存了单片机的各种外设信息,用于查看外设寄存器的状态
"executable"就是需要的可执行文件
相应的,单片机也要使能ITM的相关功能。
- #include "core_cm7.h"
- void ITM_Init(void) {
- ITM_LAR = ITM_LAR_ACCESS; // unlock
- ITM_TCR = 0x1; // global enable for ITM
- ITM_TPR = 0x1; // first 8 stim registers have unpriv access
- ITM_TER = 0xF; // enable 4 stim ports
- DEMCR = TRCENA; // global enable DWT and ITM
- }
复制代码 以上代码使能了单片机的ITM功能,配合ITM_SendChar函数即可实现字符输出。效果如下:
|
|