在MacOS下STM32标准库移植
在MAC OS中使用标准库开发STM32,移植STM32标准库,并在Mac OS下进行开发。
在Mac OS下只能使用HAL库开发SMT32?不,也可以是使用标准库,这节课教教大家怎么在Mac OS下移植标准库代码,同时可也以调试
一、准备
1、安装open-ocd
下载安装:brew install open-ocd
查看是否安装成功:open-ocd -v
有版本号这表示安装成功:

2、安装交叉编译器arm-none-eabi-gcc
下载安装 :brew install --cask gcc-arm-embedded
查看是否安装成功:arm-none-eabi-gcc -v
查看编译器版本时一定要有后面这个Arm GNU Toolchain的版本号才是安装成功,正常只要按照这个按照都会安装成功:
3、下载标准库固件库
二、标准库文件解析
STM32F10x_StdPeriph_Lib_V3.6.0 2/
├── _htmresc/ //STM的一些LOGO
├── Libraries/
│ ├── CMSIS/ // Cortex微控制器软件接口标准
│ └── STM32F10x_StdPeriph_Driver/ // 标准外设驱动
├── Project/
│ ├── STM32F10x_StdPeriph_Examples/ // 外设示例代码
│ └── STM32F10x_StdPeriph_Templates/ // 工程模板
└── Utilities/ // 评估板特定代码
三、移植工程
(一)创建工程模版

f103c8t6/
├── Core/ //存放核心文件
├── Fwlib/
│ ├── Inc/ // 存放标准库驱动的头文件
│ └── Src/ // 存放标准外设驱动的源文件
├── System/ //存放系统相关的文件
└── User/ // 存放main等一类文件
(二)添加文件
1、在Fwlib中添加头文件和源文件
将STM32F10x_StdPeriph_Lib_V3.6.0 2/Libraries/下的inc和inc中的文件分别复制到项目中的Fwlib/Inc和Fwlin/Src文件夹中:
2、Core中添加文件
将STM32F10x_StdPeriph_Lib_V3.6.0 2/Libraries/CMSIS/CM3/CoreSupport中的文件复制到Core中:
将STM32F10x_StdPeriph_Lib_V3.6.0 2/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x中的.h和.c文件也复制到Core中:
3、复制启动文件
因为我们使用的是GCC编译器所以选择启动文件是要用GCC的。
将STM32F10x_StdPeriph_Lib_V3.6.0 2/Libraries/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7文件夹下的startup_stm32f10x_md.s文件复制的项目顶层文件夹下:
4、添加配置和中断文件
进入STM32F10x_StdPeriph_Lib_V3.6.0 2/Project/STM32F10x_StdPeriph_Examples的任意一个示例工程,将其中的stm32f10x_it.c、stm32f10x_it.h、stm32f10x_conf.h复制到我们的User文件夹中:
然后再User文件夹中创建我们的main.c
4、链接文件和Makefile
这一部分建议使用STM32Fcubemx生成hal库使用的链接文件(直接使用)和Makefile(需要修改)然后修改。
下面我们修改Makefile文件:
- C_SOURCES和C_INCLUDES按照自己的添加:也可以想我这样
- C_DEFS宏定义:
- 启动文件
- 链接文件:
makefile修改完成
需要的文件都复制好了,现在可以编译测试了
(三)编译测试
使用make命令编译项目:
发现有两个错误,这两个个错误是由于在STM32标准外设库的core_cm3.c文件中,使用了不正确的内联汇编指令导致的。具体来说,strexb和strexh指令要求目标寄存器和值寄存器不能相同。下面修复这个问题:


uint32_t __STREXB(uint8_t value, uint8_t *addr)
{
uint32_t result=0;
//__ASM volatile ("strexb %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
//return(result);
__ASM volatile("strexb %0, %2, [%1]" : "=&r"(result) : "r"(addr),
"r"(value));
return (result);
}
uint32_t __STREXH(uint16_t value, uint16_t *addr)
{
uint32_t result=0;
//__ASM volatile ("strexh %0, %2, [%1]" : "=r" (result) : "r" (addr), "r" (value) );
//return(result);
__ASM volatile("strexh %0, %2, [%1]" : "=&r"(result) : "r"(addr),
"r"(value));
return (result);
}
再次编译可以正常编译:

调试和VScode设置参考我的这篇文章都是一样的道理:https://blog.csdn.net/weixin_45427512/article/details/147692806?spm=1001.2014.3001.5502
更多推荐













所有评论(0)