rt-thread驱动篇(01)---STM32F429板卡BSP制作

本文详细介绍了如何制作RT-Thread针对STM32的BSP,包括复制通用模板、使用CubeMX配置工程、修改链接脚本、更新board.c/h、Kconfig选项、构建脚本和工程模板,最后进行BSP验证。教程以STM32F429IGT6为例,适用于自定义开发板或类似硬件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、BSP框架

二、BSP制作

1、复制通用模板

 2、使用 CubeMX 工具配置工程 

 3、修改链接脚本

 4、修改board.c/h

 5、修改 Kconfig 选项

6、修改构建脚本

7、修改工程模板

8、重新生成工程

 三、BSP验证


前言

  1. RT-Thread针对STM32系列有一套通用的BSP制作方法,引入了CubeMX工具,用来对BSP中使用的外设引脚进行图形化配置;还提供了多系列的参考模板以及常见厂商的开发板的BSP工程
  2. 此次制作的BSP使用的板卡我司自己开发的板卡,不方便放上来,但是是仿的正点原子阿波罗开发板,外设都差不多,单片机型号为429IGT6,大家看的时候可以参考阿波罗开发板硬件
  3. 整个驱动篇的源码可以私聊我或是从这里下载

一、BSP框架

RT-Thread针对STM32系列通用的BSP

 每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP,下面的表格以 F1 系列 BSP 为例介绍这三个部分:

项目

文件夹

说明

通用库

stm32/libraries

用于存放 HAL 库以及基于 HAL 库的多系列通用外设驱动文件

F1 系列 BSP 工程模板

stm32/libraries/templates/stm32f10x

F1系列 BSP 模板,可以通过修改该模板制作更多 F1系列 BSP

特定开发板 BSP

stm32/stm32f103-atk-nano

在 BSP 模板的基础上修改而成

二、BSP制作

制作步骤:

  1. 复制通用模板
  2. 使用 CubeMX 工具配置工程
  3. 修改链接脚本
  4. 修改board.c/h
  5. 修改 Kconfig 选项
  6. 修改构建脚本
  7. 修改工程模板
  8. 重新生成工程

需要修改的文件:

项目

需要修改内容说明

CubeMX_Config (文件夹)

CubeMX 工程

linker_scripts (文件夹)

BSP特定的链接脚本

board/board.c/h

系统时钟、GPIO初始函数、芯片存储器大小

board/Kconfig

芯片型号、系列、外设资源

board/SConscript

芯片启动文件、目标芯片型号

1、复制通用模板

\bsp\stm32\libraries\templates文件夹下的 stm32f4xx BSP模板拷贝到\bsp\stm32目录下!!!!

 2、使用 CubeMX 工具配置工程 

打开 \board\CubeMX_Config 中的CubeMX_Config.ioc工程,根据所需要配置的硬件板卡进行如下修改:

(1)选择芯片为STM32F429IGTx

(2)打开外部时钟、设置下载方式、打开串口外设(注意只需要选择串口外设引脚即可,无需配置其他参数)

 (3)配置系统时钟:

 (4)设置项目名称,并在指定地址重新生成 CubeMX 工程:

 3、修改链接脚本

\board\linker_scripts 文件夹下分别存放了MDK、IAR、GCC三种编译器的链接脚本link.sct、link.icf、link.lds。我们使用的是IAR,所以需要修改link.icf文件

STM32F429IGT6的FLASH为1MByte;RAM大小分别256KByte,其中包含了64KByte的CCM data RAM(core coupled memory),而CCM在F4中只连接到了数据总线上,只能被CPU访问不能直接被DMA访问且只能存放数据,所以这里只使用了192KByte的SRAM1区。如果想使用CCM可参考:链接

 4、修改board.c/h

(1)将 \board\CubeMX_Config\Src\main.c 中CubeMX生成的系统时钟初始化函数 SystemClock_Config() 拷贝到 board.c

(2)修改board.h

 5、修改 Kconfig 选项

\board\Kconfig 中主要需要修改 芯片型号和系列、BSP的外设支持选项(基础工程仅需支持GPIO驱动和串口驱动即可)

 kconfig语句分析:

(1)config 语句表示一个配置选项的开始,紧跟着的 BSP_USING_COM7 是配置选项的名称,config 下面几行定义了该配置选项的属性。属性可以是该配置选项的 类型、输入提示、依赖关系、 默认值、帮助信息:

  1. bool 表示配置选项的类型,每个 config 菜单项都要有类型定义,变量有5种类型。

    (1)bool 布尔类型

    (2)tristate 三态类型

    (3)string 字符串

    (4)hex 十六进制

    (5)int 整型

  2. select 是反向依赖关系的意思,即当前配置选项被选中,则RT_USING_UART就会被选中
  3. default 表示配置选项的默认值,bool 类型的默认值可以是 y/n

(2)menu/endmenu 语句用于生成菜单

(3)if/endif 语句是一个条件判断

(4)menuconfig 语句表示带菜单的配置项

(5) depends on 表示依赖某个配置选项

(6)source 语句用于读取另一个文件中的 Kconfig 文件

在上述所以选项被选中后,会在rtconfig.h中生成如下宏:

#define SOC_STM32F429IG
#define SOC_SERIES_STM32F4
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN

#define BSP_USING_COM7
#define BSP_USING_UART
#define BSP_USING_UART7

#define BSP_USING_GPIO
#define RT_USING_PIN
#define RT_USING_SERIAL
#define BSP_UART7_RX_USING_DMA

6、修改构建脚本

\board\SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加的文件。在这一步中需要修改芯片型号以及芯片启动文件的地址,修改内容如下图所示:

 STM32F429xx 宏标识会在stm32f4xx.h中作为宏条件判断,包含目标芯片的头文件

7、修改工程模板

template 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式

8、重新生成工程

在 env 中输入 menuconfig 对工程进行配置,生成新的 rtconfig.h 文件。如下图所示:

 使用 env 中输入命令 scons --target=mdk5/mdk4/iar 重新生成MDK5/MDK4/IAR工程

 三、BSP验证

(1)BSP制作完成生成目标工程后,修改main.c中的 LED0_PIN 的引脚

/* defined the LED0 pin: PH2 */
#define LED0_PIN    GET_PIN(H, 2)

(2)使用 scons --dist 生成一个独立的BSP,此命令会在 BSP 目录下生成 dist 目录,dist中的工程可拷贝到任何目录下

 (3)连接shell使用com口(UART7),使用IAR编译下载到板卡,会打印出RTT信息

### STM32F103 RT-Thread 串口驱动及配置教程 要在STM32F103上使用RT-Thread实现串口通信,需完成以下几个方面的配置和开发工作: #### 1. 配置硬件资源 在启用UART2之前,需要确保GPIO端口被正确分配给UART功能。这通常涉及修改`board.h`文件并增加相应的宏定义来指定UART2的GPIO引脚。 ```c #define BSP_USING_UART2 #define UART2_TX_PIN GPIO_Pin_2 #define UART2_RX_PIN GPIO_Pin_3 ``` 上述代码片段展示了如何通过宏定义激活UART2以及为其分配具体的TX/RX引脚[^2]。 #### 2. 初始化外设 为了使能UART2的功能,在初始化阶段还需要调用特定函数以配置波特率、数据位数以及其他参数。这些操作一般位于`main.c`或者专门用于设备初始化的部分中执行。 ```c void uart_init(void){ USART_InitTypeDef USART_InitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2, ENABLE); USART_InitStructure.USART_BaudRate = 9600; USART_InitStructure.USART_WordLength = USART_WordLength_8b; USART_InitStructure.USART_StopBits = USART_StopBits_1; USART_InitStructure.USART_Parity = USART_Parity_No ; USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None; USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; USART_Init(USART2,&USART_InitStructure); } ``` 此段程序说明了基本的串口初始化过程,其中包含了设置波特率为9600bps的例子[^5]。 #### 3. 创建与管理线程 当完成了必要的硬件准备之后,则可以利用RT-Thread框架下的API去建立新的任务来进行数据收发处理。值得注意的是,每当新创建了一个线程以后都需要显式地调用一次`rt_thread_startup()`方法以便正式开始运行它[^4]。 ```c static void uart_task_entry(void *parameter) { while (1) { char ch = 'A'; /* 发送字符 */ rt_device_write(uart2_dev, -1, &ch, 1); rt_thread_mdelay(1000); // 每隔一秒发送一次 } } int main(void) { struct rt_device *uart2_dev; uart_init(); /* 打开串口设备 */ uart2_dev = rt_device_find("uart2"); if (!uart2_dev || RT_FALSE == rt_device_open(uart2_dev, RT_DEVICE_OFLAG_RDWR)) { LOG_E("Open device failed!"); return -1; } /* 启动发送任务 */ static struct rt_thread t; rt_thread_init(&t,"send",uart_task_entry,NULL,stack,STACK_SIZE,PRIORIYT,TICKS); rt_thread_startup(&t); return 0; } ``` 上面展示了一种典型的应用场景——周期性向另一端传输字母'A'的过程描述。 #### 4. 测试验证 最后一步就是借助专业的调试软件比如RT-Thread Studio自带的支持工具或者其他第三方解决方案连接目标板卡上的对应物理接口做实际测试检验整个流程是否正常运作起来[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值