如何用gcc+makefile改造STM32Keil项目

1、环境配置,本地需要安装gcc+make环境,将w64devkit中的bin路径放入环境变量
D:\download\storage\arm_gcc\w64devkit

然后再cmd中输入gcc -v和make -v测试gcc和make环境是否可以正常运行,如果有下面这种显示就说明gcc和make环境配置好了

2、获取芯片的启动文件文件和链接文件,stm32可以通过STM32CubeMX软件获取
打开软件后,点击File创建一个新项目

根据自己芯片的型号选择对应的芯片,双击进入工程,

因为我们是改造Keil项目,代码环境在keil已经写好,不需要通过该软件生成,我们只是通过该软件获取对应的.s和.ld文件所以这里只需要在Project Manager中和Project设置好项目路径和项目名,最重要的是Toolchain/IDE这里一定要选择Makefile,这样才会生成gcc项目

然后再点击Generate code就会自动生成项目,如果是第一次生成会比较慢需要下载对应的pack包,有时候会生成失败因为网络问题,有条件可以用梯子,没有条件多试几次。

3、然后去项目路径下打开cmd界面使用make命令就会编译生成对应的bin和elf文件,这个时候证明我们的makefile和.s以及.ld文件都可以正常使用,然后我们将.s、.ld、makefile移植到我们的新项目中

4、新建一个文件夹放入生成的makefile,.s,.ld文件

5、然后将Keil项目中的代码文件放入gcc项目下,keil中的project文件夹没有用可以直接删除

6、修改makefile文件,添加新项目中.c文件和.h文件的路径,主要修改C_SOURCES中的.c文件路径确保makefile可以编译所有的.c文件,然后修改C_INCLUDES下的目录路径,该路劲存放的是所有的.h文件(填写自己项目下.h文件的路径),注意每个目录都需(大写的i)要-I后面添加路径,-I是让makefile去指定的目录下寻找头文件,到这里基本环境就配置完成

7、可能用gcc编译的时候有一个文件core_m3.c文件无法编译通过,可以直接不编译这个文件即可,然后如果在keil中有定义宏需要再makefile中添加宏,到此环境就已经配置完成,然后在cmd中使用make命令就可以编译出bin和elf了

补充:core_m3.c无法编译的问题,修改core_m3.c中的代码

修改STM32的固件库V3.5的core_cm3.c文件:
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) );//yiming del 2012.04.09
   __ASM volatile ("strexb %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );//yiming add 2012.04.09
   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) );//yiming del 2012.04.09
   __ASM volatile ("strexh %0, %2, [%1]" : "=&r" (result) : "r" (addr), "r" (value) );//yiming add 2012.04.09
   return(result);
}

将__STREXB和__STREXH"=r"改为"=&r"

在编译就可以了。这里是参考该文章解决的

https://blog.csdn.net/guangod/article/details/96427017?app_version=6.4.6&csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%2296427017%22%2C%22source%22%3A%22qq_41922657%22%7D&utm_source=app

这里 Error: registers may not be the same -- `strexh r0,r0,[r1]'会报这个错误,这个错误网上看是说strexb 指令中的源寄存器和目标寄存器相同导致的

8、编译出来的elf还可以通过jlink工具使用gdb调试elf文件

 

posted @ 2023-11-16 16:28  lqxhgd  阅读(1078)  评论(0编辑  收藏  举报