一、使用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();
}