【简介】
STM32CubeMx 中对RT-thread 是以软件包的形式来管理,我们只要在软件包管理界面安装即可将rt-thread 的nano 代码下载到软件包中。
下载后会将rt-thread 的代码下载到CubeMx的软件包目录下,本地的路径为“C:\Users\Administrator\STM32Cube\Repository\Packs\RealThread\X-CUBE-RT-Thread_Nano\4.1.1”,下载的软件包的bsp\_template\cubemx_config 路径下的board.c 对接了RT-thread 依赖STM32HAL 软件库的接口适配,其中包含板级的代码的适配。
/* * Copyright (c) 2006-2019, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-05-24 the first version */ #include <rthw.h> #include <rtthread.h> #include "main.h" #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) /* * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes */ #define RT_HEAP_SIZE (15*1024) static rt_uint8_t rt_heap[RT_HEAP_SIZE]; RT_WEAK void *rt_heap_begin_get(void) { return rt_heap; } RT_WEAK void *rt_heap_end_get(void) { return rt_heap + RT_HEAP_SIZE; } #endif void SysTick_Handler(void) { rt_interrupt_enter(); rt_tick_increase(); rt_interrupt_leave(); } #ifdef RT_USING_FINSH #include <finsh.h> static void reboot(uint8_t argc, char **argv) { rt_hw_cpu_reset(); } MSH_CMD_EXPORT(reboot, Reboot System); #endif /* RT_USING_FINSH */ /** * This function will initial your board. */ void rt_hw_board_init(void) { extern void SystemClock_Config(void); HAL_Init(); SystemClock_Config(); SystemCoreClockUpdate(); /* * 1: OS Tick Configuration * Enable the hardware timer and call the rt_os_tick_callback function * periodically with the frequency RT_TICK_PER_SECOND. */ HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/RT_TICK_PER_SECOND); /* Call components board initial (use INIT_BOARD_EXPORT()) */ #ifdef RT_USING_COMPONENTS_INIT rt_components_board_init(); #endif #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP) rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get()); #endif } #ifdef RT_USING_CONSOLE static UART_HandleTypeDef UartHandle; static int uart_init(void) { /* TODO: Please modify the UART port number according to your needs */ UartHandle.Instance = USART2; UartHandle.Init.BaudRate = 115200; UartHandle.Init.WordLength = UART_WORDLENGTH_8B; UartHandle.Init.StopBits = UART_STOPBITS_1; UartHandle.Init.Parity = UART_PARITY_NONE; UartHandle.Init.Mode = UART_MODE_TX_RX; UartHandle.Init.HwFlowCtl = UART_HWCONTROL_NONE; UartHandle.Init.OverSampling = UART_OVERSAMPLING_16; if (HAL_UART_Init(&UartHandle) != HAL_OK) { while (1); } return 0; } INIT_BOARD_EXPORT(uart_init); void rt_hw_console_output(const char *str) { rt_size_t i = 0, size = 0; char a = '\r'; __HAL_UNLOCK(&UartHandle); size = rt_strlen(str); for (i = 0; i < size; i++) { if (*(str + i) == '\n') { HAL_UART_Transmit(&UartHandle, (uint8_t *)&a, 1, 1); } HAL_UART_Transmit(&UartHandle, (uint8_t *)(str + i), 1, 1); } } #endif #ifdef RT_USING_FINSH char rt_hw_console_getchar(void) { /* Note: the initial value of ch must < 0 */ int ch = -1; if (__HAL_UART_GET_FLAG(&UartHandle, UART_FLAG_RXNE) != RESET) { ch = UartHandle.Instance->DR & 0xff; } else { rt_thread_mdelay(10); } return ch; } #endif
上述板级的串口默认使用的UART1,需要根据硬件实际情况修改,本地使用的为UART2 ,需要根据实际情况修改下。
rt_hw_board_init 函数会调用CUBEMX生成的HAL接口完成系统的初始化工作,我们不需要再在进行芯片的初始化处理了。
下载完软件包后,在CubeMx中使能RT-thread,并开启shell
因为RT-Thread 的调度时钟使用的systick,默认HAL库也是用此时中作为HAL库中的时间管理,我没需要修改HAL库使用的timebase 的时钟源,本地修改为TIM17.
代码编译运行rt-thread 已经按照预期的启动,串口可以输出、同时也可以输入命令来交互。
使用CubeMx 我们只需要修改配置即可完成RT-thread nano 的适配工作,使用起来还是很方便快捷的。