[STM32H5] 【STM32 Nucleo-64测评】3、rt-thread stm32h533-st-nucleo BSP制作

[复制链接]
 楼主| sujingliang 发表于 2024-7-21 10:48 | 显示全部楼层 |阅读模式
<
本帖最后由 sujingliang 于 2024-7-21 11:13 编辑

一、准备工作
1、下载rt-thread env tools:
https://download-redirect.rt-thread.org/download/env_release/env-windows-v2.0.0.7z

2、下载rt-thread最新版:
https://www.rt-thread.org/download.html

1)https://github.com/RT-Thread/rt-thread
2)https://gitee.com/rtthread/rt-thread
git clone https://gitee.com/rtthread/rt-thread.git
3)https://pan.baidu.com/s/10_50j70OVGYrEWmm2X1qvQ
提取码:t22b   

3、制作BSP参考:
STM32 系列 BSP 制作教程https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/tutorial/make-bsp/stm32-bsp/STM32%E7%B3%BB%E5%88%97BSP%E5%88%B6%E4%BD%9C%E6%95%99%E7%A8%8B

二、BSP制作过程
1、复制stm32h503-st-nucleo目录到stm32h533-st-nucleo

目前rt-thread源码中,没有stm32h533-st-nucleo的bsp,但是有stm32h503-st-nucleo、stm32h563-st-nucleo,这两个BSP是stm32h533-st-nucleo的一个系列产品,可以做为制作stm32h533-st-nucleo BSP的模板。
进入:c:\rt-thread\bsp\stm32目录下,复制stm32h503-st-nucleo一份,改名stm32h533-st-nucleo

2、用STM32CubeMX建立一份stm32h533-st-nucleo最简单工程模板,只包括USART2,生成mdk工程。
其中stm32h5xx_hal_msp.c文件只有USART2初始化内容,为了用于rt-thread CMD shell
  1. void HAL_UART_MspInit(UART_HandleTypeDef* huart)
  2. {
  3.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  4.   RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
  5.   if(huart->Instance==USART2)
  6.   {
  7.   /* USER CODE BEGIN USART2_MspInit 0 */

  8.   /* USER CODE END USART2_MspInit 0 */

  9.   /** Initializes the peripherals clock
  10.   */
  11.     PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART2;
  12.     PeriphClkInitStruct.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
  13.     if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK)
  14.     {
  15.       Error_Handler();
  16.     }

  17.     /* Peripheral clock enable */
  18.     __HAL_RCC_USART2_CLK_ENABLE();

  19.     __HAL_RCC_GPIOA_CLK_ENABLE();
  20.     /**USART2 GPIO Configuration
  21.     PA2     ------> USART2_TX
  22.     PA3     ------> USART2_RX
  23.     */
  24.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  25.     GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
  26.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  27.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  28.     GPIO_InitStruct.Alternate = GPIO_AF7_USART2;
  29.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  30.   /* USER CODE BEGIN USART2_MspInit 1 */

  31.   /* USER CODE END USART2_MspInit 1 */

  32.   }

  33. }

  34. /**
  35. * [url=home.php?mod=space&uid=247401]@brief[/url] UART MSP De-Initialization
  36. * This function freeze the hardware resources used in this example
  37. * @param huart: UART handle pointer
  38. * @retval None
  39. */
  40. void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
  41. {
  42.   if(huart->Instance==USART2)
  43.   {
  44.   /* USER CODE BEGIN USART2_MspDeInit 0 */

  45.   /* USER CODE END USART2_MspDeInit 0 */
  46.     /* Peripheral clock disable */
  47.     __HAL_RCC_USART2_CLK_DISABLE();

  48.     /**USART2 GPIO Configuration
  49.     PA2     ------> USART2_TX
  50.     PA3     ------> USART2_RX
  51.     */
  52.     HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3);

  53.   /* USER CODE BEGIN USART2_MspDeInit 1 */

  54.   /* USER CODE END USART2_MspDeInit 1 */
  55.   }

  56. }
copy STM32CubeMX生成的
inc、Src目录和.mxproject、CubeMX_Config.ioc文件到C:\rt-thread\bsp\stm32\stm32h533-st-nucleo\board\CubeMX_Config覆盖原文件

3、修改board.c文件
文件目录:C:\rt-thread\bsp\stm32\stm32h533-st-nucleo\board
将文件中void SystemClock_Config(void)函数改成:

  1. void SystemClock_Config(void)
  2. {
  3.   RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  4.   RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  5.   /** Configure the main internal regulator output voltage
  6.   */
  7.   __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE3);

  8.   while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {}

  9.   /** Initializes the RCC Oscillators according to the specified parameters
  10.   * in the RCC_OscInitTypeDef structure.
  11.   */
  12.   RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;
  13.   RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  14.   RCC_OscInitStruct.HSIDiv = RCC_HSI_DIV2;
  15.   RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;
  16.   RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
  17.   if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  18.   {
  19.     Error_Handler();
  20.   }

  21.   /** Initializes the CPU, AHB and APB buses clocks
  22.   */
  23.   RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
  24.                               |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2
  25.                               |RCC_CLOCKTYPE_PCLK3;
  26.   RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSI;
  27.   RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  28.   RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
  29.   RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  30.   RCC_ClkInitStruct.APB3CLKDivider = RCC_HCLK_DIV1;

  31.   if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_1) != HAL_OK)
  32.   {
  33.     Error_Handler();
  34.   }

  35.   /** Configure the programming delay
  36.   */
  37.   __HAL_FLASH_SET_PROGRAM_DELAY(FLASH_PROGRAMMING_DELAY_0);
  38. }
4、修改board.h文件
文件目录:C:\rt-thread\bsp\stm32\stm32h533-st-nucleo\board
512k和208k
  1. #define STM32_FLASH_START_ADRESS       ((uint32_t)0x08000000)
  2. #define STM32_FLASH_SIZE               (512 * 1024)
  3. #define STM32_FLASH_END_ADDRESS        ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))

  4. #define STM32_SRAM1_SIZE               (208)
  5. #define STM32_SRAM1_START              (0x20000000)
  6. #define STM32_SRAM1_END                (STM32_SRAM1_START + STM32_SRAM1_SIZE * 1024)
4.1、修改link.sct文件目录:C:\rt-thread\bsp\stm32\stm32h533-st-nucleo\board\linker_scripts
0x00080000 和 0x00034000
  1. ; *************************************************************
  2. ; *** Scatter-Loading Description File generated by uVision ***
  3. ; *************************************************************

  4. LR_IROM1 0x08000000 0x00080000  {    ; load region size_region
  5.   ER_IROM1 0x08000000 0x00080000  {  ; load address = execution address
  6.    *.o (RESET, +First)
  7.    *(InRoot$Sections)
  8.    .ANY (+RO)
  9.    .ANY (+XO)
  10.   }
  11.   RW_IRAM1 0x20000000 0x00034000  {  ; RW data
  12.    .ANY (+RW +ZI)
  13.   }
  14. }



5、修改Kconfig文件

文件目录:C:\rt-thread\bsp\stm32\stm32h533-st-nucleo\board
只有保留GPIO和USART
  1. menu "Hardware Drivers Config"

  2. menu "Onboard Peripheral Drivers"

  3. endmenu

  4. menu "On-chip Peripheral Drivers"

  5.     config BSP_USING_GPIO
  6.         bool "Enable GPIO"
  7.         select RT_USING_PIN
  8.         default y

  9.     menuconfig BSP_USING_UART
  10.         bool "Enable UART"
  11.         default y
  12.         select RT_USING_SERIAL
  13.         if BSP_USING_UART
  14.             config BSP_USING_UART2
  15.                 bool "Enable UART2"
  16.                 default y

  17.         endif

  18.     source "$(BSP_DIR)/../libraries/HAL_Drivers/drivers/Kconfig"

  19. endmenu

  20. menu "Board extended module Drivers"

  21. endmenu

  22. endmenu
6、更新SDK
copy c:\STM32Cube_FW_H5_V1.3.0\Drivers下的内容CMSIS、STM32H5xx_HAL_Driver两个目录到C:\rt-thread\bsp\stm32\libraries\STM32H5xx_HAL,替换原来的两个目录。

7、menuconfig
在C:\rt-thread\bsp\stm32\stm32h533-st-nucleo目录下打开env tools
键入:
menuconfig
只设置GPIO和UART
rtthread1.gif

rtthread2.gif
退出保存。

8、修改template.uvprojx

template.uvprojx是KEIL模板文件,用KEIL打开,修改DEVICE为STM32H533RETx,保存。

env tools 下键入:
scons --target mdk5
生成keil工程文件project.uvprojx

9、keil打开project.uvprojx,编译烧录

三、运行效果
1、main.c
  1. #include <rtthread.h>
  2. #include <rtdevice.h>
  3. #include <board.h>

  4. /* defined the LED1 pin: PB0 */
  5. #define LED1_PIN    GET_PIN(A, 5)

  6. int main(void)
  7. {
  8.     int count = 1;
  9.         
  10.                 rt_kprintf("【STM32 Nucleo-64测评】3、rt-thread移植\r\n");
  11.                 rt_kprintf("1、GREEN LED闪烁\r\n");
  12.     /* set LED0 pin mode to output */
  13.     rt_pin_mode(LED1_PIN, PIN_MODE_OUTPUT);

  14.     while (count++)
  15.     {
  16.         rt_pin_write(LED1_PIN, PIN_HIGH);
  17.         rt_thread_mdelay(500);
  18.         rt_pin_write(LED1_PIN, PIN_LOW);
  19.         rt_thread_mdelay(500);
  20.     }

  21.     return RT_EOK;
  22. }
2、串口输出
rtthread3.gif
另外板载LED闪烁


四、总结
1、keil编译时,context_rvds.S以下内容报error,将1行、4行注释后,编译通过,类似的内容在context_rvds.S出现3次,都注释了。
  1. ;#if defined (__VFP_FP__) && !defined(__SOFTFP__)
  2.    TST     lr, #0x10                               ; if(!EXC_RETURN[4])
  3.    VSTMFDEQ  r1!, {d8 - d15}                       ; push FPU register s16~s31
  4. ;#endif
这段可能和浮点有关,注释后编译通过,有什么后果不太清楚。
2、 stm32xxx_hal_msp.c 中添加#include <drv_common.h>
STM32 的 HAL 库有一个 Error_Handler(); 函数用于记录 HAL 库错误的情况,这个函数由 STM32CubeMX 生成在 main.c 文件中。但是我们的 BSP 并不使用 STM32CubeMX 生成的 main.c 文件,因此我们需要手动定义这个函数。
这个函数已经由 RT-Thread 提供了缺省实现,定义在 STM32 BSP 中的 dev_common.c 中,如果没有特殊需要,可以直接使用该实现。因此,我们在 stm32xxx_hal_msp.c 文件中还需要手动加入一行头文件 #include <drv_common.h>。
3、上面的配置过程可能没有尽述,详细BSP配置最好参照官方《STM32 系列 BSP 制作教程》。








lulugl 发表于 2024-7-22 07:42 | 显示全部楼层
非常好的帖子!
kqh11a 发表于 2024-7-29 14:28 | 显示全部楼层
在 RT-Thread 源码中,stm32h503-st-nucleo 和 stm32h563-st-nucleo 的 BSP 作为模板进行修改是一个合理的步骤。确保复制和修改步骤如下:

进入 RT-Thread 源码目录中的 BSP 文件夹,例如 c:\rt-thread\bsp\stm32。
复制 stm32h503-st-nucleo 目录,并重命名为 stm32h533-st-nucleo。
申小林一号 发表于 2024-7-29 22:57 | 显示全部楼层
感谢分享
4c1l 发表于 2024-8-31 22:59 | 显示全部楼层
确保在每一步中都仔细检查配置文件和代码,以便成功适配新的开发板和芯片。
LOVEEVER 发表于 2024-9-13 17:15 | 显示全部楼层
非常不错的详细的制作过程
您需要登录后才可以回帖 登录 | 注册

本版积分规则

84

主题

146

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部