0
点赞
收藏
分享

微信扫一扫

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统


STM32CubeMX | STM32使用HAL库手动移植RTThread-Nano实时操作系统

目录

  • ​​STM32CubeMX | STM32使用HAL库手动移植RTThread-Nano实时操作系统​​
  • ​​1、基础工程建立​​
  • ​​2、移植rtthread-nano​​
  • ​​3、添加finsh组件​​

1、基础工程建立

首先通过STM32CubeMX建立基础工程,首先开启RCC并将时钟配置到72M主频:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_02


配置串口1用于调试打印:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_STM32_03

在配置个LED灯的IO:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_04

将HAL用到的系统滴答定时器切换成定时器7,因为SysTick定时器我们要给rtthread使用:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_05

中断分组设置为4:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_初始化_06

取消掉这三个函数的生成,因为rtthread已经把这三个函数生成好了:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_07


最后输出工程:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_初始化_08

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_STM32_09

2、移植rtthread-nano

从rtthread官网下载解压rtthread-nano源码并解压,我们移植需要以下文件:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_10


将上图文件拷贝到工程目录,如下图所示:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_11


需要将rtthread添加进工程的文件有:

  • libcpu\arm\cortex-m3\cpuport.c
  • libcpu\arm\cortex-m3\context_rvds.S
  • src目录下的所有文件
  • board.c

如下图所示:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_12

然后添加头文件包含:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_STM32_13

尝试初次编译,直接编译通过:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_STM32_14

接下来还需要修改一下源码,适配HAL库。

首先检查一下​​rtconfig.h​​配置文件的各项,在keil中打开可以切换为图像化配置,基本默认配置即可:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_15


然后适配时钟,打开​​board.c​​​文件,找到​​rt_hw_board_init​​函数,改为以下:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_16

接着在main.c文件中写一个外设初始化的函数chip_init,将CUBE生成的外设初始化函数中该函数内,用rtthread初始化列表的形式进行外设初始化:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_17


然后重定向rt_kprintf函数到串口1:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_#ifdef_18

#ifdef RT_USING_CONSOLE
void rt_hw_console_output(const char *str)
{
HAL_UART_Transmit(&huart1, (uint8_t *)str, rt_strlen(str), 100);
}
#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(&huart1, UART_FLAG_RXNE) != RESET)
{
ch = huart1.Instance->DR & 0xff;
}
else
{
rt_thread_mdelay(10);
}
return ch;
}
#endif

main函数中创建一个LED灯的任务:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_#ifdef_19

最后编译运行就可以了:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_20

3、添加finsh组件

将finsh源码和头文件包含加入工程:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_rtthread-nano_21

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_#ifdef_22

在​​rtconfig.h​​中添加宏定义:

#define RT_USING_FINSH

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_初始化_23

将mian函数中的打印屏蔽掉,要不然不方便finsh的使用:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_初始化_24

然后编译下载运行:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_#ifdef_25

注意xshell的设置,rtthread是用\n作为回车换行,而xshell默认为\r\n才是回车换行,所以xshell需要这么设置才能正常显示rtthread的打印:

STM32CubeMX | STM32F1系列使用HAL库手动移植RTThread-Nano实时操作系统_移植_26

ends…


举报

相关推荐

0 条评论