WeAct - STM32H750VB 移植RT-thread

本文介绍如何在STM32H750VB上移植RT-Thread实时操作系统,包括环境准备、Keil工程配置、关键文件修改等内容。特别关注了时钟初始化、串口配置及内存使用等细节。

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

WeAct - STM32H750VB 移植RT-thread

环境准备

RTT 源码获取

Keil 工程

  • 正常运行的裸机工程
  • 或者可以选择 RTT 源码中的 BSP下已经适配的 工程

参考资料

RT-Thread 文档中心

移植工程搭建

RTT 源码

  1. RTT源码放置项目合适位置
    在这里插入图片描述
  2. 删除仓库的 git文件
  3. 删除BSP下不需要的,此处保留stm32 ,只保留以下几个文件夹
    在这里插入图片描述
    4.删减libraries 文件,删除多余的HAL文件夹(保留HAL_Drivers/STM32H7xx_HAL
    在这里插入图片描述
    5.拷贝BSP下的 demo中的 board文件夹/ rtconfig.h 到自己 keil 工程目录
    在这里插入图片描述
    6.以上步骤完成 rtt 的准备

Keil 工程修改

  • 添加RTT 所需.c 文件
    在这里插入图片描述
    2.添加头文件路径
    在这里插入图片描述

部分文件修改

stm32h7xx_it.c 修改
  • 注释所有中断服务函数,RTT context_rvds.S 该文件中已经完成的中断服务函数的实现,否则会导致重定义,并注释stm32h7xx_it.h 中断服务函数
board.c 修改
  • 将裸机工程下的,系统时钟初始化移植到board.c
  • 留意是否是运行在程序是否是跑在 外部flash(如果是,则需保证时钟初始化和 boot中的初始化一致)
    在这里插入图片描述
board.h 修改
#define STM32_FLASH_START_ADRESS     ((uint32_t)0x90000000)
#define STM32_FLASH_SIZE             (16 * 1024 * 1024)
#define STM32_FLASH_END_ADDRESS      ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE))

#define STM32_SRAM_SIZE           (512)
#define STM32_SRAM_END            (0x24000000 + STM32_SRAM_SIZE * 1024)

在这里插入图片描述

rtconfig.h 修改
  1. 空闲任务堆栈大小修改,测试发现默认 256 容易爆栈
 #define IDLE_THREAD_STACK_SIZE 1024
  1. 日志串口默认名,须留意一下,是否是自己想使用的串口号
#define RT_CONSOLE_DEVICE_NAME "uart4"
  1. 日志串口的使用,留意最后外设的配置宏,自己的工程默认是用的是UART4,则设置对应的 宏
#define BSP_USING_UART
#define BSP_USING_UART4
stm32h7xx_hal_msp.c 修改
  • demo 工程只是用了 UART,则修改串口的 初始化即可。
void HAL_UART_MspInit(UART_HandleTypeDef* huart)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(huart->Instance==UART4)
  {
  /* USER CODE BEGIN UART4_MspInit 0 */

  /* USER CODE END UART4_MspInit 0 */
    /* Peripheral clock enable */
    __HAL_RCC_UART4_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**UART4 GPIO Configuration
    PA1     ------> UART4_RX
    PA0     ------> UART4_TX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_1;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_0;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
    GPIO_InitStruct.Alternate = GPIO_AF8_UART4;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* UART4 interrupt Init */
    HAL_NVIC_SetPriority(UART4_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(UART4_IRQn);
  /* USER CODE BEGIN UART4_MspInit 1 */

  /* USER CODE END UART4_MspInit 1 */
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* huart)
{
  if(huart->Instance==UART4)
  {
  /* USER CODE BEGIN UART4_MspDeInit 0 */

  /* USER CODE END UART4_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_UART4_CLK_DISABLE();

    /**UART4 GPIO Configuration
    PI9     ------> UART4_RX
    PA0     ------> UART4_TX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_1);

    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0);

    /* UART4 interrupt DeInit */
    HAL_NVIC_DisableIRQ(UART4_IRQn);
  /* USER CODE BEGIN UART4_MspDeInit 1 */

  /* USER CODE END UART4_MspDeInit 1 */
  }
}
main.c 修改
  • 点亮Weact 灯
int main(void)
{
	// thread_sample();
    /* set LED0 pin mode to output */
    rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT);

    while (1)
    {
        rt_pin_write(LED0_PIN, PIN_HIGH);
        rt_thread_mdelay(500);
        rt_pin_write(LED0_PIN, PIN_LOW);
        rt_thread_mdelay(500);
    }
}

编译烧录

在这里插入图片描述

注意事项

  • 空闲任务堆栈大小 需要调整
  • 确认时钟初始化是否是一致(运行在 flash 的时候,留意之)
  • 修改设备大内存使用
  • stm32h7xx_hal_msp.c 需要实现一些 外设相关的引脚初始化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值