STM32CubeMX创建F429HAL库工程并移植RT-Thread nano 3.1.3 & 添加FinSH控制台组件(文末附源码)

一、使用STM32CubeMX 5.5.0创建rt-thread nano工程

1.选择芯片,野火挑战者开发板芯片为STM32F429IGT6

在这里插入图片描述

2.设置PH10、PH11、PH12为推挽输出(用作验证)

在这里插入图片描述

3.设置USART1(用于移植FinSH组件)

在这里插入图片描述

4.添加RT-Thread nano 3.1.3 kernel

在这里插入图片描述
在这里插入图片描述

4.取消自动生成HardFault_Handler、PendSV_Handler、SysTick_Handler 代码

在这里插入图片描述

5.生成MDK工程文件

在这里插入图片描述
在这里插入图片描述

6.使用keil打开MDK工程,添加LED闪烁线程
6.1 引入头文件,初始化静态线程结构体和线程栈
#include <rtthread.h>
static struct rt_thread led_thread;
static char led_thread_stack[256];

在这里插入图片描述

6.2 编写线程入口函数
static void led_thread_entry(void *parameter)
{
	while(1)
	{
		HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_RESET);
		rt_thread_mdelay(500);
		HAL_GPIO_WritePin(GPIOH, GPIO_PIN_10, GPIO_PIN_SET);
		rt_thread_mdelay(500);
	}
}

在这里插入图片描述

6.3 初始化线程,并开始
int main(void)
{
  HAL_Init();
  MX_GPIO_Init();

  /* USER CODE BEGIN 2 */
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_8, GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOE, GPIO_PIN_9, GPIO_PIN_SET);
	rt_err_t rst;
	rst = rt_thread_init(&led_thread,
						"ledshine",
						led_thread_entry,
						RT_NULL,
						&led_thread_stack[0],
						sizeof(led_thread_stack),
						RT_THREAD_PRIORITY_MAX-2,
						20);
	if(rst == RT_EOK)
	{
		rt_thread_startup(&led_thread);
	}
}

在这里插入图片描述

7.此时编译会出错,还要移植FinSH组件

在这里插入图片描述

二、移植finsh组件

1. 修改main.h,目的是能够在board.c中初始化串口
  • 添加以下两行代码
extern UART_HandleTypeDef huart1;
extern void MX_USART1_UART_Init(void);

在这里插入图片描述

2. 修改board.c
2.1 在头部串口初始化添加声明
#include "main.h"
extern UART_HandleTypeDef huart1;
extern void MX_USART1_UART_Init(void);

在这里插入图片描述

2.2 在末尾添加两个函数
void rt_hw_console_output(const char *str)
{
        rt_size_t i = 0, size = 0;
        char a = '\r';
        
        __HAL_UNLOCK(&huart1);
        
        size = rt_strlen(str);
        for (i = 0; i < size; i++)
        {
        if (*(str + i) == '\n')
        {
                HAL_UART_Transmit(&huart1, (uint8_t *)&a, 1, 1);
        }
                HAL_UART_Transmit(&huart1, (uint8_t *)(str + i), 1, 1);
        }
}

char rt_hw_console_getchar(void)
{
        int ch = -1;
        if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
        {
        		//notice stm32f429 and stm32f475 is different
				//stm32l475:ch = huart1.Instance->RDR
				//stm32f429:ch = huart1.Instance->DR
                ch = huart1.Instance->DR & 0xff;
        }
        else
        {
                if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_ORE) != RESET)
                {
                        __HAL_UART_CLEAR_OREFLAG(&huart1);
                }
                rt_thread_mdelay(10);
        }
        return ch;
}

2.3 在rt_hw_board_init()中增加串口初始化函数MX_USART1_UART_Init()
void rt_hw_board_init()
{
    /* System Clock Update */
    SystemCoreClockUpdate();
    /* USART1 INIT */
	MX_USART1_UART_Init();
}
3. 移植成功

在这里插入图片描述

源码地址:https://download.csdn.net/download/u014779536/12116496

猜你喜欢

转载自blog.csdn.net/u014779536/article/details/104056436