rt-thread:_001STM32F429IGT BSP前期准备

基于RT-THREAD STM32F429IGT6 BSP前期准备


硬件平台:野火STM32挑战者 MCU:STM32F429IGT6
开发工具:
  1. MDK Version:5.25
  2. VSCode
  3. env
  4. STM32CubeMX Version:5.2.1
  5. rt-thread源码 Version:4.0.1

工具获取

  • MDK获取链接
  • VSCode获取链接
  • env工具获取链接
  • STM32CubeMX获取链接
  • RT-Thread源码获取链接

几点说明

  1. 整个bsp的应用程序都是基于rt-thread设备驱动框架建立的,所以需要了解rt-thread设备驱动框架的请参考设备和驱动。
  2. 了解env工具的使用请参考env视频教程以及env用户手册。
  3. 建立BSP模版步骤比较多,但是整体并没有难度,只需要细心点、有耐心点就没有任何问题。
  4. BSP模版建好之后,以后就不用再建立了,所有的应用功能,我们都会在该模版下完成。一次建立,永久享用。

下面正式开始建立BSP模版

一、复制源码BSP模版

  • 第一步:
    从源码路径rt-thread\bsp\stm32\libraries\templates下复制文件夹stm32f4xx,粘贴至rt-thread\bsp\stm32目录下。
  • 第二步:
    把第一步复制过来的文件夹重新命名为stm32f429-hlg-v1.0。也可以命名为其他名字。
  • 第三步:
    stm32f429-hlg-v1.0\applications目录下新建两个文件夹bsp_incbsp_src,以及一个main.h文件;其中bsp_inc中未来放的是用户程序的所有头文件,对应的bsp_src里面放的当然是用户程序的所有源文件。文件main.h是用来管理所有的头文件的。最终该目录下的文件结构如下图所示:

rt-thread:_001STM32F429IGT BSP前期准备_第1张图片

图1.applications文件夹
  • 第四步:
  • 复制图1里面的SConscript文件粘贴至图1下的bsp_src文件内。并修改其内容为下图所示:
    rt-thread:_001STM32F429IGT BSP前期准备_第2张图片
    图2.bsp_src\SConscript文件

说明:主要是给env工具编译工程时的链接脚本添加用户程序的源文件及头文件路径

  • 第五步:
    修改applications下的SConscript文件内容如下图所示:
    rt-thread:_001STM32F429IGT BSP前期准备_第3张图片
    图3.applications\SConscript文件

说明:作用同上图

  • 第六步:
    修改applications下的main.h文件内容如下图所示:
    rt-thread:_001STM32F429IGT BSP前期准备_第4张图片
    图4.applications\main.h文件

说明:以后用户应用程序所有的头文件全部包含在这里面

二、STM32CubeMX生成配置代码

打开stm32f429-hlg-v1.0\board\CubeMX_Config目录下的CubeMX_Config.ioc工程。

  • 第一步:
    点击下图红框选项更改芯片型号为STM32F429IGTx
    rt-thread:_001STM32F429IGT BSP前期准备_第5张图片
    图5.STM32CubeMX更改MCU型号

依次点击下图红框选项进行更改:
rt-thread:_001STM32F429IGT BSP前期准备_第6张图片

图6.STM32CubeMX更改MCU型号

  • 第二步:

依次点击下图红色框选项,配置RCC
rt-thread:_001STM32F429IGT BSP前期准备_第7张图片

图7.STM32CubeMX配置RCC

  • 第三步:

依次点击下图红色框选项,配置SYS
rt-thread:_001STM32F429IGT BSP前期准备_第8张图片

图8.STM32CubeMX配置SYS

  • 第四步:

依次点击下图红色框选项,配置USART1
rt-thread:_001STM32F429IGT BSP前期准备_第9张图片

图9.STM32CubeMX配置USART1

说明:BSP模版的FinSH终端默认使用USART1,因此需要先使能该串口。当然也可以根据硬件情况更改为其他串口。

  • 第五步:
    依次点击下图红色框选项,配置MCU系统时钟。
    rt-thread:_001STM32F429IGT BSP前期准备_第10张图片
    图10.STM32CubeMX配置系统时钟

其中序号23分别为外部输入低速时钟、高速时钟,根据晶振实际参数填写。序号6可以直接填入系统支持的最大时钟值,STM32F429支持180MHz,所以此处填入180后直接回车,软件会自动计算各个参数。

  • 第六步:
    依次根据下图说明,配置工程选项。
    rt-thread:_001STM32F429IGT BSP前期准备_第11张图片

    图11.STM32CubeMX配置工程

  • 第七步:
    点击下图红框选项生成配置代码。
    rt-thread:_001STM32F429IGT BSP前期准备_第12张图片

    图12.STM32CubeMX生成配置代码

  • 第八步:
    打开stm32f429-hlg-v1.0\board\CubeMX_Config\Src路径下的main.c文件,复制该文件里面的void SystemClock_Config(void)函数的全部内容;替换掉stm32f429-hlg-v1.0\board路径下的board.c文件里面的void SystemClock_Config(void)函数的全部内容。该函数初始化了MCU系统的时钟,如果重新利用第五步方法更改了时钟,那么需要重新替换该函数。

  • 第九步:
    修改stm32f429-hlg-v1.0\board路径下的board.h文件。该文件里面定义了MCU的FLASH的起始、停止地址的宏以及大小的宏(STM32_FLASH_SIZE),RAM的起始、停止地址的宏以及大小的宏(STM32_SRAM_SIZE)。根据定义内容,我们只需要修改其大小就可以了。因为他们的起始地址操作系统里面的STM32F4模版已经给定,况且F4系列的起始地址都一样。而截至地址是根据起始地址和大小自动计算出来的。故我们根据不同的MCU型号只需要修改其FLASHRAM的大小即可。下图为STM32F429数据手册里的内存映射图,根据该图可知FLASHRAM的所有情况。

    由图知FLASH的大小为 0x2FFFFF Byte,即为
    2 × 1 6 5 B y t e = 2 × 2 20 B y t e = 2 M B 2\times16^5 Byte=2\times2^{20}Byte=2MB 2×165Byte=2×220Byte=2MB
    由图知RAM的大小为 0x2FFFFF Byte,即为
    3 × 1 6 4 B y t e = 3 × 64 × 2 10 B y t e = 192 K B 3\times16^4 Byte=3\times64\times2^{10}Byte=192KB 3×164Byte=3×64×210Byte=192KB
    rt-thread:_001STM32F429IGT BSP前期准备_第13张图片

    图13.STM32F429内存映射图

对应的修改board.h里面的STM32_FLASH_SIZESTM32_SRAM_SIZE如下图所示:
rt-thread:_001STM32F429IGT BSP前期准备_第14张图片

图14.borad.h修改

为 BSP 添加驱动时,STM32CubeMX 工具可以快速的完成使能外设配置管脚的工作。而外设初始化,中断配置,DMA配置等等则由 RT-Thread 提供的驱动文件来完成。也就是说,虽然 STM32CubeMX 生成了多个文件用来初始化外设,但 RT-Thread 只使用了 STM32CubeMX 生成的 stm32fxx_hal_msp.c 文件和 stm32fxx_hal_conf.h 文件。

上面的这段话在后面具体的BSP过程中就会理解。

三、修改Kconfig文件

打开stm32f429-hlg-v1.0\board路径下的Kconfig文件,该文件是使用env工具进行开启或者关闭一些功能的配置文件,根据该文件的配置情况,通过env工具开启或者关闭某些功能以后,操作系统会自动更新系统头文件rtconfig.h,该文件位于stm32f429-hlg-v1.0目录下。

"Hardware Drivers Config"(硬件驱动配置)配置里面主要包括以下三个配置项:

  1. "Onboard Peripheral Drivers"(板级外设驱动),顾名思义,这里面一般用来配置开发板上现有的外设;
  2. "On-chip Peripheral Drivers"(片上外设驱动),顾名思义,这里面一般用来配置MCU内部的外设;
  3. "Board extended module Drivers"(板级外扩模块的驱动),顾名思义,这里面一般用来配置外扩设备的.

需要修改的地方请看下图:
rt-thread:_001STM32F429IGT BSP前期准备_第15张图片

图15.Kconfig修改说明

其余的配置项里面的内容可以删掉,也可以保留,不影响。

修改后的Kconfig文件如下图所示:
rt-thread:_001STM32F429IGT BSP前期准备_第16张图片

图16.Kconfig修改后

说明:uart1指的是我们在UART设备里面使用串口设备的名字,就是说在这里我们用的USART1转串口功能,被注册为一个UART设备,该设备的名字是uart1

再在Kconfig文件后面增加一个模块,我这里命名为BSP module用来配置一些我们自己增加的功能,方便env工具配置。比如后面我们添加一个led灯的bsp,就可以通过在这个模块下增加对应的led宏,方便env开启或者关闭该bsp,这样在keil工程里就会自动添加或者移除led的相关文件。
rt-thread:_001STM32F429IGT BSP前期准备_第17张图片

图17.增加module

四、修改编译器链接脚本

编译器链接脚本位于stm32f429-hlg-v1.0\board\linker_scripts下,共有三个:

  • link.icf 为IAR的编译链接文件;
  • link.lds 为GCC的编译链接文件;
  • link.sct 为MDK的编译链接文件。

不管是哪一种编译链接,修改的都是MCU的内存情况,参考图13.STM32F429内存映射图进行修改:
link.icf修改情况如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第18张图片

图18.link.icf修改后

link.lds修改情况如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第19张图片

图19.link.lds修改后

link.sct修改情况如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第20张图片

图20.link.sct修改后

五、修改编译器的构建脚本

修改位于stm32f429-hlg-v1.0\board目录下的SConscript文件,该文件指定了各种编译器编译时使用的芯片的启动文件和芯片型号。该BSP的芯片启动文件位于stm32f429-hlg-v1.0\board\CubeMX_Config\MDK-ARM目录下,为startup_stm32f429xx.s

修改情况如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第21张图片

图21.SConscript修改后

六、修改工程模板

修改IARkeil工程模版配置的目的是方便后面每次重新生成工程以后,每次打开工程不需要重新配置。模版和工程都位于stm32f429-hlg-v1.0文件内。
关于工程和模板说明如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第22张图片

图22.stm32f429-hlg-v1.0文件夹内容说明

打开keil5模板template.uvprojx,更改芯片型号如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第23张图片

图23.芯片型号更改

更改下载方式如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第24张图片

图24.下载方式更改

说明: keil4和iar模版修改类似keil5。下载方式当然也可以选择其他方式,如Jlink等,

七、env工具配置

  • 第一步

stm32f429-hlg-v1.0目录下打开env工具(切记切记是在该目录下打开env,后面所有的env操作,都得在该目录下打开才行);输入menuconfig
回车进入Hardware Drivers Config下,可以看到如下图信息:
rt-thread:_001STM32F429IGT BSP前期准备_第25张图片

图25.Hardware Drivers Config

其中能够看到我们在前面添加的 BSP module 模块。

  • 第二步

    进入板级外设驱动配置目录,使能USB转串口功能,如下图所示:
    按空格键出现*表示开启,无时表示关闭。
    rt-thread:_001STM32F429IGT BSP前期准备_第26张图片

    图26.开启USB转串口板级外设驱动

然后按Esc键,返回至图25界面。

  • 第三步

进入片上外设驱动配置目录,开启我们在Kconfig配置里面添加的GPIO片上外设UART片上外设,如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第27张图片

图27.开启相关片上外设驱动

进一步进入UART外设下面,确定开启对应的UART口。如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第28张图片

图28.开启UART1

该片上外设默认被选中是因为我们在Kconfig文件里面,把该外设的默认配置方式设置为ydefault y),即是默认开启的。如果想手动开启,可以把默认方式设置为ndefault n)即可。

  • 第四步

    一直按Esc键直至退出界面,选择Yes退出env配置,如下图:
    rt-thread:_001STM32F429IGT BSP前期准备_第29张图片

    图29.退出env配置

这样我们刚刚配置相关选项在env里就保存好了。如果选得是No则放弃本次选中的配置。

八、env生成BSP模版工程

env里面输入scons --target=mdk5则生成keil5工程,输入scons --target=mdk4则生成keil4工程,输入scons --target=iar则生成iar工程。输入scons --target=vsc则更新VSCode的头文件路径,方便我们直接用VSCode来写代码。

切记: 一定要输入生成工程指令,不然前面所有的工作在工程里并不能自动实现。

我们使用keil5打开对应的版本工程,看到工程结构如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第30张图片

图30.keil5工程结构

九、BSP模版工程编译

到了这一步,就剩下编译了,前面的步骤到底对不对,编译一下就知道了。
编译有以下三种方法:

  1. 使用keil编译;
  2. VSCode的终端输入scons进行编译
  3. env里面输入scons进行编译

再次提醒: 一定要在stm32f429-hlg-v1.0目录下打开env工具。

  • keil打开工程编译,不是工程模板,请看图22。编译情况如下图:
    rt-thread:_001STM32F429IGT BSP前期准备_第31张图片

    图30.keil编译结果

  • env里面输入code .,这样就利用VSCode打开了工程。然后在teminal里面输入scons就可以开始编译工程了,编译结果如下图:
    rt-thread:_001STM32F429IGT BSP前期准备_第32张图片

    图31.VSCode编译结果

出现红框部分代表编译成功。

  • 使用env编译,在env里面输入scons,就可以开始编译,编译结果如下:
    rt-thread:_001STM32F429IGT BSP前期准备_第33张图片
    图32.env编译结果

出现这种结果其实是编译成功了,是重复编译而已。因为在上面使用了VSCodeteminal编译,同样用的scons指令,两个调用的编译环境其实是一样的,所以这里就是重复编译,也成功了。

十、BSP模版下载验证

然后我们在main.h里面写如下代码:

#ifndef __MAIN_H
#define __MAIN_H

#include 	/* 操作系统头文件 */
#include 	/* 操作系统设备头文件 */
#include 		/* 操作系统板级初始化头文件 */

/* 声明logo函数 */
static void bsp_show_logo(void);

#endif

然后我们在main.c里面写如下代码:

#include "main.h"

#define EXAMPLE_NAME	"V1.0-STM32F429IGT HLG_BSP RT-Thread"
#define EXAMPLE_DATE	"2019-6-12"
#define DEMO_VER		  "1.0"

/***************************************************************
*   函数:  int main(int argc, char *argv[])
*   参数:  int argc, char *argv[]
*   返回值:int 型  
*   功能:  主函数
*****************************************************************/
int main(int argc, char *argv[])
{ 
	
    return RT_EOK;
}

/***************************************************************
*   函数:  static void bsp_show_logo(void)
*   参数:  无
*   返回值:无  
*   功能:  获取MCU的唯一ID号,并且显示出来,再打印一些其他信息
*****************************************************************/
static void bsp_show_logo(void)
{
    rt_uint32_t U_ID0 = 0, U_ID1 = 0, U_ID2 = 0;

    U_ID0 = *(__IO rt_uint32_t *)(0x1FFF7A10);
    U_ID1 = *(__IO rt_uint32_t *)(0x1FFF7A10 + 0x04);
    U_ID2 = *(__IO rt_uint32_t *)(0x1FFF7A10 + 0x08);
    
    rt_kprintf("\n\r");
    rt_kprintf("**************************CPU相关信息**************************\n\r");
    rt_kprintf("* CPU: STM32F429IGT, LQFP176, CoreFrequency: %d MHz\r\n", SystemCoreClock/1000000);
    rt_kprintf("* UID = %08x %08x %08x\n\r", U_ID2, U_ID1, U_ID0);
    
    rt_kprintf("**************************例程相关信息*************************\n\r");
    rt_kprintf("* DemoName   	: %s\r\n", EXAMPLE_NAME);	
    rt_kprintf("* DemoVersion   : %s\r\n", DEMO_VER);		
    rt_kprintf("* DemoDate   	: %s\r\n", EXAMPLE_DATE);	
    rt_kprintf("* STM32CubeMX	: (STM32CubeMX FW_F4 V1.24.1)\r\n");
    rt_kprintf("* \r\n");	
    rt_kprintf("* QQ    		: 358445145 \r\n");
    rt_kprintf("* Email 		: [email protected] \r\n");
    rt_kprintf("*************************************************************\n\r");

}

/* 导出bsp_show_logo至FinSH终端 */
MSH_CMD_EXPORT(bsp_show_logo, show STM32F4IGTX logo);

编译下载之后,在终端里面输入help,或者按Tab键,可以看到暂时FinSH终端支持的指令。如下图:
rt-thread:_001STM32F429IGT BSP前期准备_第34张图片

图34.FinSH终端

其中红色框里面的是我们刚刚导出至终端的命令。

在终端里输入bsp_show_logo回车,我们将会看到如下信息:rt-thread:_001STM32F429IGT BSP前期准备_第35张图片

图35.FinSH终端logo信息

总结

到这里一个新的BSP模版就彻底的建立好了,后面我们添加的任何应用程序,无非就是在这个基础上增加一些文件而已,不用再次建立模版。最最最最大的好处是,以后我们把添加的任何应用程序,只要放入我们的bsp_src(用户源文件)和bsp_inc(用户头文件夹)文件夹里面,然后在stm32f429-hlg-v1.0\board下的Kconfig文件里设置好相应的宏,再在stm32f429-hlg-v1.0\applications下的SConscript里面添加该宏和对应的源文件,那么使用env可以非常方便的建立keil工程。简直不能再好用。

官网参考链接

RT-Thread官网
env用户手册
env构建工具
STM32 系列 BSP 制作教程

你可能感兴趣的:(操作系统:RT-Thread)