你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
STMCU小助手 发布时间:2022-9-4 16:54
1、基础工程建立
首先通过STM32CubeMX建立基础工程,首先开启RCC并将时钟配置到72M主频:

0d9a9d0cdf844058b67dcb56f0824717.png
27e99cb5ca624cfa946152e3d4268811.png

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

a139d6331f4740f182d61b46f26253ba.png

在配置个LED灯的IO:

7ce51f1027e440d9889cf6e2f4647a75.png

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

76ef1c75457e45f4881e20e9b4ce86d4.png

中断分组设置为4:

4628c0ec1aef4130972ed4e81954007b.png

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

55205bfb94604af794ba0184059c1c92.png

最后输出工程:

e7ca145b011c401fbb1f1f9c8ad5467c.png

f4da79b9a4ef44be9e97854af8767d77.png


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

2592cf885b784e149ee478576865d88b.png

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

eab01db0b60f4fa6bbf11c88a7fb93f2.png

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

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

如下图所示:

816423cfd5a64dcd8fcaca5858558f25.png

然后添加头文件包含:

dcc75905292b49749fbad7b3994cd752.png

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

457ead60999e4a288672a0bfe10bc0c3.png

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

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

02570946856a47bb8461afde46d08f04.png

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

2d9d30fc46f74af0a3fe6cad6a57037d.png

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

f777aac63d17478ca06343ed8d5964ff.png

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

e6c40ba7bc3541a58e32d230ebe505ee.png

  1. #ifdef RT_USING_CONSOLE
  2. void rt_hw_console_output(const char *str)
  3. {
  4.         HAL_UART_Transmit(&huart1, (uint8_t *)str, rt_strlen(str), 100);
  5. }
  6. #endif

  7. #ifdef RT_USING_FINSH
  8. char rt_hw_console_getchar(void)
  9. {
  10.     /* Note: the initial value of ch must < 0 */
  11.     int ch = -1;

  12.     if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET)
  13.     {
  14.         ch = huart1.Instance->DR & 0xff;
  15.     }
  16.     else
  17.     {
  18.         rt_thread_mdelay(10);
  19.     }
  20.     return ch;
  21. }
  22. #endif
复制代码


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

2299bd1ba3ca42c29ca97415b92d4bdb.png

最后编译运行就可以了:

db629f459d994599b234b959e2905323.png

3、添加finsh组件
将finsh源码和头文件包含加入工程:

5f49dba9a85148de9e58aec227a6b3f2.png

73fb4cf1fc304438b7b3a5057bd0d97c.png


在rtconfig.h中添加宏定义:

#define RT_USING_FINSH

f30d19f69311467fadd5aeb7fcb0f378.png

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

d6d943b3774c472f8eb3987682f37804.png

然后编译下载运行:

91e954d608d54757839743f95e0008cd.png

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

599c0380b0c642a5bfa09d5c7a77bdcb.png

————————————————
版权转载自:雍正不秃头


收藏 评论0 发布时间:2022-9-4 16:54

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版