STM32F429 Ubuntu16.04环境搭建教程简单版

2019-07-20 14:25发布

买原子哥的东西呢,国为他一直在MDK5上教学,1:MDK5收费的。2:因为MDK5是IDE,配置的东西你大多都看不见,对编译时了解的东西太少。
我买了板子后,就有了在ubuntu下搭建想法,因为免费,该有的GDB都有.我就做了一个简单的HAL库移植教程,到现在一共花了一个星期完成.
1:安装ubuntu16.04.2 64位系统,安装好后,要安装32位的补丁,因为我们编译要的是32位,这一步就不介绍了
2:安装好后,系统该打补丁的打,该更新的更,这一步也不多做介绍,因为教程太多了
3:安装STM32CubeMX 这个软件能生成makefile 以及链接脚本,软件运行环境JAVA,请阅读软件时面的README文件,里面有详细的说明,然后按照原子哥HAL开发指南里面的4.8节,一步一步配置系统时钟,RCC和LED0和LED1,配置好后,点击PROJECT-SETTINGS里面Project选项里面,Toolchain/IDE选择Makefile
4:安装代码编辑器我用的vscode,感觉比前辈Sublime text3好用很多,网址为https://code.visualstudio.com/  ,安装DEB包,也不多说了,直接打开就能安装的,然后就是要安装插件当你打开一个C语言工程的时候,vscode会提示你安装必要插件用做代码补全,下面是我用的插件

5:安装gcc-arm-none-eabi,这里不推荐大家用sudo apt install gcc-arm-none-eabi来安装,因为现在版本4.9里面的w_char 有2字节和4字节问题,编译出来很多这个警告,直接去官网
https://launchpad.net/gcc-arm-embedded/+download下载最新版5.4 然后解压 分配权限
sudo chmod 777 -R 这里是你解压的目录,arm-none-eabi-gcc位于目录里面的bin里面,可以进入目录然后执行arm-none-eabi-gcc -v 查看版本号是否输出5.4,然后就是配置环境变量,这个在ubuntu必须学会,非常重要,然后执行sudo vim /etc/environment 这个是配置用户环境变量在双引号里面添加/home/ohmygod/Downloads/gcc-arm-none-eabi/bin:  这个是我的决对路径,你们要改成你自己的。下面是我的

6:复制HAL库文件,这里就可以参照原子哥的教程了,原子哥的system目录也可以复制过来,我为了方便查看把system32f4xx.c这些文件和main放在了一起,你也可以不用放一起。HAL库可以整个目录都复制过来,反正在HAL库里面都能找到,具体怎么找,就要去Makefile里面去设置了。下面是我的目录树

上图中我在STM32CubeMX生成的makefile里面复制了两个文件,一个是Makefile,一个是STM32F429IGTx_FLASH.ld 链接脚本,放在目录最顶层,还有.s的启动汇编文件也放到这里,到这里文件复制就完成了。
7:配置makefile,在scoure里添加自己要编译的C文件,他前面还有patch 可以设置目录 好像我并没有用他,因为C文件前面我添加了路径,下面是我的部份,注意这三个C文件不要编译,里面有几个定义重复了。
stm32f4xx_hal_timebase_rtc_alarm_template.c
stm32f4xx_hal_timebase_rtc_wakeup_template.c

stm32f4xx_hal_timebase_tim_template.c  

然后配置编译器如下图把$(BINPATH)后面的/去掉,因为我们的编译器没那么多路径
编译器.png
然后配置头文件目录和c_define 宏定义,这里非常关键,MDK5在设置中原子哥也强调了全局宏定义的重要性
想要知道原因,打开stm32f4xx_hal_conf.h,去看看里面的条件编译。定义如下
include.png
在stm32f4xx_hal_conf.h中的98行下面自己定义一个#define HSE_VALUE    ((uint32_t)25000000) 如果不定义外部晶振大小,下面的条件编译会定义成8MHZ,原子哥用的25MHZ。
然后修改LDFLAGS在最后添加 -u _printf_float ,原因是printf使用浮点,在编译时要打开浮点。默认头闭的。如下图
printf.png
8:重定向_write 当然,有能力的人也可以重定向_read函数,int file对应着标准输入,标准输出,标准错误。大家看原子哥usart.c里面的重定向,是定义的fputc,这个在Linux下是行不通的,把原子哥的重定向删除,我用了两种方法,使用如下代码,一个是有HAL库一个是没有HAL库,没有HAL库使用了原子哥的发送方法,这样大家可以把printf重定向到任何地方了,LCD也好,哪里都行。printf重定向我在Google上找到的方法,送上原地址,
这是重定向方案:
https://electronics.stackexchange.com/questions/206113/how-do-i-use-the-printf-function-on-stm32
这是printf浮点打印方案
http://stackoverflow.com/questions/28334435/stm32-printf-float-variable
[mw_shl_code=applescript,true]#include "errno.h"
#include "unistd.h"
int _write(int file, char *data, int len)
{
   if ((file != STDOUT_FILENO) && (file != STDERR_FILENO))
   {
      errno = EBADF;
      return -1;
   }

   //这里由于使用了HAL库,所以我调用了HAL库提供的uart发送函数
   // arbitrary timeout 1000
/*    HAL_StatusTypeDef status =
      HAL_UART_Transmit(&UART1_Handler, (uint8_t*)data, len,1000);

   // return # of bytes written - as best we can tell
   return (status == HAL_OK ? len : 0);   */
//这下面是使用操作寄存器的方法发送,在没有hal库的时候就使用下面的来发送

   int i;
   for(i=0;i<len;i++)
   {
   while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
        USART1->DR =data;
   }
   return 0;   
}  [/mw_shl_code]
9:就是代码测试了把原子哥的LED.c LED.h两个文件复制到目录,前面已经说过 怎么添加编译源码和头文件了,我在main.c里面做了几个测试一个是printf浮点打印,一个是两个LED互斥点亮,如下图
C文件.png
然后 执行make,烧写 然后在终端执行sudo screen /dev/ttyUSB0 115200 来打开串口 设置115200 成功打印浮点.png
后记:烧写用的st-link 工具叫openocd ,然后debug用的arm-none-eabi-gdb,如果有兴趣我会再开一帖,来说怎么烧写和GDB,在线GDB非常方便,MKD5为什么配置没有这么多,因为他是IDE,集成的工具,很多不用你配置,他帮你弄好了,这就导致很多人都不知道配置原理
在这里附上我配置好的文件,但还是建议大家先自己配置,不对的时候再看看和我的哪里不对
nczywq@hotmail.com 附上我的邮箱,不懂的可以发邮件。
stm32f429.zip (7.95 MB, 下载次数: 1089) 2017-5-21 13:36 上传 点击文件名下载附件







友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。