本帖最后由 nich20xx 于 2020-7-9 09:10 编辑
1 前言
RT-Thread是一款功能强大、组件丰富的开源操作系统,结合STM32WL低功耗物联等特性,在STM32WL中运行RTOS有助于加速产品的开发与落地。
本文主要描述如何将RT-Thread移植到NUCLEO-WL55JC2开发板,新建一个基于RT-Thread的NUCLEO-WL55JC2 BSP。
本文主要内容包括:
- 新增STM32WL BSP
- 运行控制台finish
2 STM32 系列 BSP 流程
RT-Thread官方提供了非常详细的《STM32 系列 BSP 制作教程》
STM32 BSP 框架结构如下图所示:
每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP。
STM32WL BSP主要组成部分
|
项目 |
文件夹 |
说明 |
通用库 |
stm32/libraries |
- 用于存放 HAL 库(STM32WLxx_HAL)
- 基于 HAL 库的多系列通用外设驱动文件(HAL_Drivers)
|
STM32WL系列 BSP 工程模板
|
stm32/libraries/templates/stm32wlxx |
当前RT-thread暂未支持STM32WL
|
特定开发板 BSP |
stm32/nucleo-wl55jc2 |
主芯片 STM32WL55JC
|
3 STM32WL BSP制作
由于当前RT-Thread暂未支持STM32WL,因此跟《STM32 系列 BSP 制作教程》中方式略微有些不同。当前STM32WL BSP 的制作过程主要如下步骤:
- 在stm32/libraries增加STM32WL支持
- 新增 STM32WLxx_HAL
- 更新HAL_Drivers
- STM32WL跟STM32L4比较接近,因此这部分可参考STM32L4
- 新建NUCLEO-WL55JC2 BSP
- 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)
- 配置工程
- 当前 SetupSTM32CubeMX-6.99.1-D37 暂不支持C代码导出,当前需要手动修改
3.1 在stm32/libraries增加STM32WL支持
3.1.1 新增 STM32WLxx_HAL
- 在bsp\stm32\libraries 增加STM32WLxx_HAL及其相关驱动文件
- 在rt-thread/bsp/stm32/libraries 新建 STM32WLxx_HAL
- 拷贝下面2个文件到STM32WLxx_HAL
- STM32Cube_FW_WL_V0.4.0\Drivers\STM32WLxx_HAL_Driver
- STM32Cube_FW_WL_V0.4.0\Drivers\CMSIS
- 在STM32WLxx_HAL文件夹中增加SConsript文件
- 在bsp\stm32\libraries中的Kconfig增加 SOC_SERIES_STM32WL
3.1.2 更新HAL_Drivers
- 在bsp\stm32\libraries\HAL_Drivers的Kconfig增加 SOC_SERIES_STM32WL
- 在bsp\stm32\libraries\HAL_Drivers的drv_config.h增加STM32WL支持
- 在bsp\stm32\libraries\HAL_Drivers\config 增加wl文件夹(直接复制STM32L4中的文件,然后在进行相应修改)
- 在drv_xx.c、.drv_xx.h中,在所有出现 SOC_SERIES_STM32L4 的地方,同时增加 SOC_SERIES_STM32WL 的条件判断
- 例如
3.2 新建NUCLEO-WL55JC2 BSP
在rt-thread\bsp\stm32\路径下,新建stm32wl55-st-nucleo (拷贝 stm32l476-st-nucleo)
3.2.1 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)
- 修改bsp\stm32\stm32wl55-st-nucleo\board\Kconfig,定义芯片型号SOC_STM32WL55JC,芯片系列为SOC_SERIES_STM32WL
- 修改 bsp\stm32\stm32wl55-st-nucleo\board\SConstruct,这步很关键,决定工程实际导入的stm32 HAL库
- 修改bsp\stm32\stm32wl55-st-nucleo\board\SConscript,SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件,SConscript脚本需要修改芯片型号以及芯片启动文件的地址,如下所示
- 修改bsp\stm32\stm32wl55-st-nucleo的template.uvprojx文件。template 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式等.
注:首次需要安装STM32WLxx_DFP
- 修改bsp\stm32\stm32wl55-st-nucleo\board\linker_scripts链接脚本文件,MDK 使用的链接脚本 link.sct如下所示
3.2.2 配置工程
3.2.2.1 修改board.h FLASH与SRAM大小
- 修改bsp\stm32\stm32wl55-st-nucleo\board\board.h文件,Flash与SRAM大小
3.2.2.2 修改SystemClock_Config
- 在 board.c 文件中存放了函数 SystemClock_Config(),这部分可以先参考TM32Cube_FW_WL_V0.4.0\Projects\NUCLEO-WL55JC\Applications来进一步修改
3.2.2.3 修改CubeMX_Config
由于当前CubeMX暂不完全支持STM32WL,因此当前CubeMX_Config中的部分文件需要手动修改
- stm32wlxx_hal_msp.c增加LPUART1初始化
/**
* @brief UART MSP Initialization
* This function configures the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(huart->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspInit 0 */
/* USER CODE END LPUART1_MspInit 0 */
/* Peripheral clock enable */
__HAL_RCC_LPUART1_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
/**LPUART1 GPIO Configuration
PA3 ------> LPUART1_RX
PA2 ------> LPUART1_TX
*/
GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF8_LPUART1;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/* USER CODE BEGIN LPUART1_MspInit 1 */
/* USER CODE END LPUART1_MspInit 1 */
}
}
/**
* @brief UART MSP De-Initialization
* This function freeze the hardware resources used in this example
* @param huart: UART handle pointer
* @retval None
*/
void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
if(huart->Instance==LPUART1)
{
/* USER CODE BEGIN LPUART1_MspDeInit 0 */
/* USER CODE END LPUART1_MspDeInit 0 */
/* Peripheral clock disable */
__HAL_RCC_LPUART1_CLK_DISABLE();
/**LPUART1 GPIO Configuration
PA0 ------> LPUART1_RX
PA1 ------> LPUART1_TX
*/
HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);
/* USER CODE BEGIN LPUART1_MspDeInit 1 */
/* USER CODE END LPUART1_MspDeInit 1 */
}
}
- ENV--> menuconfig中,配置Console/Finish使用LPUART1(NUCLEO-WL55JC2默认使用LPUART1连接到ST-LINKV3虚拟串口)
完成上述操作后,通过Scons工具,生成MDK工程,
3.3 测试验证
通过Micro USB连接NUCLO-WL55JC到PC,通过板载STLINKV3E下载代码到NUCLEO-WL55JC,然后通过串口来验证Finish是否OK。
4 参考
- RT-Thread官方 STM32 系列 BSP 制作教程