[原创] 【NUCLEO-WL55JC2测评5】移植RT-Thread到NUCLEO-WL55JC2

nich20xx   2020-7-9 06:16 楼主


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 框架结构如下图所示:

image.png

每一个 STM32 系列的 BSP 由三部分组成,分别是通用库、BSP 模板和特定开发板 BSP。

STM32WL BSP主要组成部分

项目 文件夹 说明
通用库 stm32/libraries
  1. 用于存放 HAL 库(STM32WLxx_HAL)
  2. 基于 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 的制作过程主要如下步骤:

  1. 在stm32/libraries增加STM32WL支持
    • 新增 STM32WLxx_HAL
    • 更新HAL_Drivers
      • STM32WL跟STM32L4比较接近,因此这部分可参考STM32L4
  2. 新建NUCLEO-WL55JC2 BSP
    • 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)
    • 配置工程
      • 当前 SetupSTM32CubeMX-6.99.1-D37 暂不支持C代码导出,当前需要手动修改

3.1 在stm32/libraries增加STM32WL支持

3.1.1 新增 STM32WLxx_HAL

  1. 在bsp\stm32\libraries 增加STM32WLxx_HAL及其相关驱动文件
    1. 在rt-thread/bsp/stm32/libraries 新建 STM32WLxx_HAL
    2. 拷贝下面2个文件到STM32WLxx_HAL
      • STM32Cube_FW_WL_V0.4.0\Drivers\STM32WLxx_HAL_Driver
      • STM32Cube_FW_WL_V0.4.0\Drivers\CMSIS
    3. 在STM32WLxx_HAL文件夹中增加SConsript文件
  2. 在bsp\stm32\libraries中的Kconfig增加 SOC_SERIES_STM32WL

3.1.2 更新HAL_Drivers

  1. 在bsp\stm32\libraries\HAL_Drivers的Kconfig增加 SOC_SERIES_STM32WL
    image.png
  2. 在bsp\stm32\libraries\HAL_Drivers的drv_config.h增加STM32WL支持

image.png

  1. 在bsp\stm32\libraries\HAL_Drivers\config 增加wl文件夹(直接复制STM32L4中的文件,然后在进行相应修改)
    • 在drv_xx.c、.drv_xx.h中,在所有出现 SOC_SERIES_STM32L4 的地方,同时增加 SOC_SERIES_STM32WL 的条件判断
    • 例如  image.png

3.2 新建NUCLEO-WL55JC2 BSP

在rt-thread\bsp\stm32\路径下,新建stm32wl55-st-nucleo (拷贝 stm32l476-st-nucleo)

3.2.1 修改工程构建相关文件(Kconfig\SConstruct\SConscript\链接脚本)

  1. 修改bsp\stm32\stm32wl55-st-nucleo\board\Kconfig,定义芯片型号SOC_STM32WL55JC,芯片系列为SOC_SERIES_STM32WL image.png
  2. 修改 bsp\stm32\stm32wl55-st-nucleo\board\SConstruct,这步很关键,决定工程实际导入的stm32 HAL库

image.png

  1. 修改bsp\stm32\stm32wl55-st-nucleo\board\SConscript,SConscript 脚本决定 MDK/IAR 工程的生成以及编译过程中要添加文件,SConscript脚本需要修改芯片型号以及芯片启动文件的地址,如下所示 11.png
  2. 修改bsp\stm32\stm32wl55-st-nucleo的template.uvprojx文件。template 文件是生成 MDK/IAR 工程的模板文件,通过修改该文件可以设置工程中使用的芯片型号以及下载方式等.

注:首次需要安装STM32WLxx_DFP

image.png

  1. 修改bsp\stm32\stm32wl55-st-nucleo\board\linker_scripts链接脚本文件,MDK 使用的链接脚本 link.sct如下所示

image.png

3.2.2 配置工程

3.2.2.1 修改board.h FLASH与SRAM大小

  1. 修改bsp\stm32\stm32wl55-st-nucleo\board\board.h文件,Flash与SRAM大小 image.png

3.2.2.2 修改SystemClock_Config

  1. 在 board.c 文件中存放了函数 SystemClock_Config(),这部分可以先参考TM32Cube_FW_WL_V0.4.0\Projects\NUCLEO-WL55JC\Applications来进一步修改

3.2.2.3 修改CubeMX_Config

由于当前CubeMX暂不完全支持STM32WL,因此当前CubeMX_Config中的部分文件需要手动修改

  1. 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 */
      }
    
    }

     

  2. ENV--> menuconfig中,配置Console/Finish使用LPUART1(NUCLEO-WL55JC2默认使用LPUART1连接到ST-LINKV3虚拟串口)

image.png

完成上述操作后,通过Scons工具,生成MDK工程,

3.3 测试验证

通过Micro USB连接NUCLO-WL55JC到PC,通过板载STLINKV3E下载代码到NUCLEO-WL55JC,然后通过串口来验证Finish是否OK。

image.png

4 参考

  • STM32Cube_FW_WL_V0.4.0
本帖最后由 nich20xx 于 2020-7-9 09:10 编辑

回复评论 (1)

怎么一会make menu一会keil的样子?好复杂。

默认摸鱼,再摸鱼。2022、9、28
点赞  2020-7-9 20:50
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复