在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、下载标准库固件库

        固件库下载网站:https://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.htmlhttps://www.st.com.cn/zh/embedded-software/stm32-standard-peripheral-libraries.html

二、标准库文件解析

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文件中,使用了不正确的内联汇编指令导致的。具体来说,strexbstrexh指令要求目标寄存器和值寄存器不能相同。下面修复这个问题:


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

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐