【Mini-F5265-OB开发板试用测评】RT-Thread的移植(调通串口+LED)

article/2025/9/7 20:32:49

前言

近期,笔者有幸获得灵动微MM32F5265开发板的体验资格。MM32F5260搭载了arm china "Star-MC1 内核"处理器,拥有高性能,主打家电和工业等高可靠性应用领域。

总结一下,有以下亮点:

  • 本土团队打造,完全自主可控,采用全国产化供应链;
  • 基于Armv8-M架构,带有L1 I-Cache & D-Cache,对比市面主流的M3/M4,有20%性能提升;
  • 通过I-Cache实现对flash的零延迟访问,拥有零延迟 AHB 总线矩阵,支持多并发总线;
  • 拥有信号间互联矩阵,可对多个事件进行逻辑组合,可实现较为复杂的功能;

移植

本次rt-thread的移植参考了 “Rice我叫加饭?” 的博文:
https://aijishu.com/a/1060000000347637

参考代码:
https://gitee.com/RiceChen0/mm32f5270\_rtt
(感谢原作者的付出)

这里我重点说一下不一样的地方:

1.打印重定向到虚拟串口

虽然Mini-F5265-OB开发板上没有板载CH340,但这也不影响交互功能,官方提供了一种新的途径:通过板载的MM32-LINK-OB的虚拟串口来实现串口的交互。

简述实现的流程:

  1. PC通过USB连接板载的MM32-LINK-OB;
  2. 板载的MM32-LINK-OB将USB数据转发成SWD接口信号和串口的tx/rx信号;
  3. 最终信号达到Mini-F5265-OB开发板,实现串口的交互和程序的烧写功能;

板载的MM32-LINK-OB,连接如下图所示:
在这里插入图片描述
Mini-F5265-OB开发板,连接如下图所示:
在这里插入图片描述

因此,移植的第一步就是要用上虚拟串口。
通过查看上述的原理图可知虚拟串口用到uart3。
修改drv_uart.h,添加uart3支持:

#if defined(BSP_USING_UART3)
#ifndef UART3_CONFIG
#define UART3_CONFIG                                \{                                               \.name           = "uart3",                  \.rx_gpiox       = GPIOC,                    \.rx_rcc_clock   = RCC_AHBPeriph_GPIOC,       \.rx_pin         = GPIO_Pin_11,              \.rx_gpio_af     = GPIO_AF_7,                \.tx_gpiox       = GPIOB,                    \.tx_rcc_clock   = RCC_AHBPeriph_GPIOC,      \.tx_pin         = GPIO_Pin_10,              \.tx_gpio_af     = GPIO_AF_7,                \.uart_rcc_clock = RCC_APB1Periph_UART3,     \.uartx          = UART3,                    \.irq_type       = UART3_IRQn,               \}
#endif /* UART3_CONFIG */
#endif /* BSP_USING_UART3 */

修改drv_uart.c,uart3使用的PC10和PC11需要初始化:

static int rt_hw_uart_gpio_init(struct mm32_uart_config *cfg)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_UART3, ENABLE);RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC, ENABLE);GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_7);GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_7);GPIO_StructInit(&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10;GPIO_InitStruct.GPIO_Speed = GPIO_Speed_High;GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF_PP;GPIO_Init(GPIOC, &GPIO_InitStruct);GPIO_StructInit(&GPIO_InitStruct);GPIO_InitStruct.GPIO_Pin  = GPIO_Pin_11;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;GPIO_Init(GPIOC, &GPIO_InitStruct);return RT_EOK;
}

修改drv_uart.c,实现mm32_uart_ops(由于篇幅原因,这里仅截取关键部分)

static rt_err_t mm32_control(struct rt_serial_device *serial,int                      cmd,void                     *arg)
{struct mm32_uart *uart;rt_ubase_t ctrl_arg = (rt_ubase_t)arg;RT_ASSERT(serial != RT_NULL);uart = rt_container_of(serial, struct mm32_uart, serial);switch (cmd){case RT_DEVICE_CTRL_SET_INT:{UART_ITConfig(uart->config->uartx, UART_IT_RX, ENABLE);NVIC_EnableIRQ(uart->config->irq_type);break;}case RT_DEVICE_CTRL_CLR_INT:{UART_ITConfig(uart->config->uartx, UART_IT_RX, DISABLE);NVIC_DisableIRQ(uart->config->irq_type);break;}}return 0;
}static int mm32_putc(struct rt_serial_device *serial, char c)
{struct mm32_uart *uart;RT_ASSERT(serial != RT_NULL);uart = rt_container_of(serial, struct mm32_uart, serial);UART_SendData(uart->config->uartx, (uint8_t)(c));while (RESET == UART_GetFlagStatus(uart->config->uartx, UART_FLAG_TXC)) {};return 1;
}static int mm32_getc(struct rt_serial_device *serial)
{struct mm32_uart *uart;int ch = -1;RT_ASSERT(serial != RT_NULL);uart = rt_container_of(serial, struct mm32_uart, serial);if(UART_GetFlagStatus(uart->config->uartx, UART_FLAG_RXAVL)){ch = UART_ReceiveData(uart->config->uartx);return ch;}return -1;
}static void uart_isr(struct rt_serial_device *serial)
{struct mm32_uart *uart;RT_ASSERT(serial != RT_NULL);uart = rt_container_of(serial, struct mm32_uart, serial);if(SET == UART_GetFlagStatus(uart->config->uartx, UART_IT_RX)){rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_IND);}
}void UART3_IRQHandler(void)
{rt_interrupt_enter();uart_isr(&(uart_obj[UART3_INDEX].serial));rt_interrupt_leave();
}

2.添加hal库等文件

  1. 从官方的提供的例程资料中找到HAL_Lib文件夹,将里面的头文件和源文件拷贝工程的libraries/drivers目录里面。
  2. 修改libraries/drivers的mm32f5260.h,定义“USE_STDPERIPH_DRIVER”的宏。(注意官方提供的默认没有定义该宏,需要定义后才会编译标准外设驱动库)
  3. 在libraries/drivers目录创建hal_common.h,并在里面包含"hal_conf.h",目的是在外面可以调到hal层的函数接口。
  4. 将官方提供的core_starmc1.h拷贝到工程的libraries/libraries/CMSIS/Include目录下,替换原来的core_star.h。
  5. 将官方提供的source文件夹里面的文件整理到libraries和mdk目录。

注:以上仅列出关键部分,其余详见代码仓库。

3.实现systisk

跟以往不同的是:本次使用的SDK里面已经实现了对系统时钟的初始化(system_mm32f5260.c),我们仅需实现systisk即可,代码如下:

void SysTick_Init(void)
{uint32_t reload = 0;SysTick->CTRL &= (uint32_t)0xFFFFFFFB;reload = CLOCK_SYSTICK_FREQ/RT_TICK_PER_SECOND;reload--;SysTick->CTRL |= SysTick_CTRL_TICKINT_Msk;SysTick->LOAD = reload;SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
}void SysTick_Handler(void)
{/* enter interrupt */rt_interrupt_enter();rt_tick_increase();/* leave interrupt */rt_interrupt_leave();
}void rt_hw_board_init()
{SysTick_Init();SystemClock_Config();#if defined(RT_USING_HEAP)rt_system_heap_init(HEAP_BEGIN, (void *)HEAP_END);
#endif#ifdef RT_USING_SERIALextern int rt_hw_uart_init(void);rt_hw_uart_init();
#endif#if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
#endif#ifdef RT_USING_COMPONENTS_INITrt_components_board_init();
#endif
}

移植效果

到此为止,基本上已经完成了移植工作。
编译,烧写,可以到rt-thread的打印:
在这里插入图片描述

查看开发板可看到LED2隔500ms闪烁一次。

总结

本次移植过程修改的地方不多,主要是因为SDK变动而做的修改。在此,可以看到灵动微在维护hal库做出的努力。毕竟hal层兼容性越强,可以吸收更多潜在用户,节省用户熟悉SDK的时间,这也是国产芯片替代的必经之路。
最后,感谢灵动微和极术社区提供的平台,也祝愿国产芯片越来越好。

仓库代码:
https://gitee.com/sakura96888/mm32f5260_rtt


http://www.hkcw.cn/article/VJqEMgLACw.shtml

相关文章

MySQL8.4组复制

https://dev.mysql.com/doc/refman/8.4/en/group-replication.html 1 什么是组复制 组复制主要解决了传统异步复制主机宕机时可能造成主从节点数据不一致问题MySQL Group Replication,简称MGR将原有的gtid复制功能进行可增强,支持单主模式和多主模式组复…

【笔记】Trae+Andrioid Studio+Kotlin开发安卓WebView应用

文章目录 简介依赖步骤AS(Andriod Studio)创建项目AS创建虚拟机TRAE CN 修改项目新增按键捕获功能 新增WebViewWebView加载本地资源在按键回调中向WebView注入JS代码 最终关键代码吐槽 简介 使用Trae配合Andriod Studio开发一个内嵌WebView的安卓应用, 在WebView中加载本地资源…

kibana解析Excel文件,生成mapping es导入Excel

一、Excel转为CSV格式 在线免费网站:EXCEL转CSV - 免费在线将EXCEL文件转换成CSV (cdkm.com) 二、登录kibana 点击左边菜单栏找到Machine Learning, 进入后上面菜单选择Data Visualizer,然后上穿转好的csv格式的Excel 点击导入输入建立的m…

4d毫米波雷达开源算法4DRadarSLAM运行

1.开源代码和论文 (1)论文名称: 4DRadarSLAM: A 4D Imaging Radar SLAM System for Large-scale Environments based on Pose Graph Optimization (2)开源代码国内下载地址 https://gitcode.com/gh_mirrors/4d/4DRada…

安卓手机照片在这个目录/storage/emulated/999/DCIM/Camera下的导出解决方案

这里写自定义目录标题 背景解决方案导出过程 导出的成功照片展示 背景 想导出手机的相册照片,发现部分照片无法导出 ,原因是在文件管理根本找不到这个目录/storage/emulated/999/DCIM/ 。 照片位置截图: 对应的安卓手机的文件管理截图如下 发现没有…

C++进阶--C++11(04)

文章目录 C进阶--C11(04)lambdalambda表达式语法捕捉列表lambda的应用lambda的原理 包装器functionbind 总结结语 很高兴和大家见面,给生活加点impetus!!开启今天的编程之路!! 今天我们进一步c…

动态设置微信小程序页面标题(navigationBarTitleText属性)

前言: 最近在公司进行小程序研发的时候,产品给出了一个动态加载页面标题的需求,经过调研之后将结果在这里与各位伙伴进行分享。 代码展示: 在.json文件中进行初始配置: { "usingComponents": {}, &q…

PostgreSQL数据库配置SSL操作说明书

背景: 因为postgresql或者mysql目前通过docker安装,只需要输入主机IP、用户名、密码即可访问成功,这样其实是不安全的,可能会通过一些手段获取到用户名密码导致数据被窃取。而ES、kafka等也是通过用户名/密码方式连接,…

基于python 将图像上同一行距离相近的矩形框融合

import os import cv2 import numpy as npdef get_files(path):""" 获取指定路径下所有文件名称 """files []for filename in os.listdir(path):if os.path.isfile(os.path.join(path, filename)):files.append(filename)return filesdef split…

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接:开始 下载nvm - nvm中文官网 情况:npm i 下载依赖缓慢,可能是node版本不对,可能node版本太高 可能得问题:使用nvm 下载低版本的node时,…

Opencv4 c++ 自用笔记 01 Mat类

Mat类 Mat类用来保存矩阵类型的数据,包括向量、矩阵、灰度、通道数。主要分为两部分,矩阵头和矩阵指针。 (单通道为灰度图像,3通道或4通道为彩色图像) 矩阵头中包含矩阵形状、存储方法、地址、引用次数等。矩阵指针…

Linux `|` 管道符与 `grep` 命令深度解析与高阶应用指南

Linux `|` 管道符与 `grep` 命令深度解析与高阶应用指南 一、核心机制深度解析1. 管道符 `|` 的底层原理2. grep 的匹配引擎二、高阶组合应用技巧1. 多级过滤管道2. 实时监控与告警3. 结构化数据处理三、企业级应用场景1. 安全审计系统2. 性能监控告警3. 日志关联分析四、性能优…

STP配置

由于我们演示的是STP 但是华为交换机默认的都是MSTP所以要换到STP以下是方法 STP mode ? 查看模式 STP mode stp 选择stp 换好了后配置交换机优先级 [SWA]stp priority 4096 Apr 15 2013 16:15:33-08:00 SWA DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5…

CentOS_7.9 2U物理服务器上部署系统简易操作步骤

近期单位网站革新,鉴于安全加固,计划将原有Windows环境更新到Linux-CentOS 7.9,这版本也没的说(绝)了(版)官方停止更新,但无论如何还是被sisi的牵挂着这一大批人,毕竟从接…

《仿盒马》app开发技术分享-- 订单详情页(端云一体)

开发准备 在之前的章节中我们实现了订单的提交,以及提交之后跳转到确认订单页面,在确认订单页面我们添加了一个入口,这个入口是查询订单,当我们点击入口时,我们需要跳转到一个新的界面,这个界面通过接收上…

C# 控制台程序获取用户输入数据验证 不合规返回重新提示输入

在 C# 控制台程序中实现输入验证并循环重试&#xff0c;可以通过以下方式实现高效且用户友好的交互。以下是包含多种验证场景的完整解决方案&#xff1a; 一、通用输入验证框架 public static T GetValidInput<T>(string prompt, Func<string, (bool IsValid, T Val…

Linux:shell脚本常用命令

一、设置主机名称 1、查看主机名称 2、用文件的方式更改主机名称 重启后&#xff1a; 3、 通过命令修改主机名 重启后&#xff1a; 二、网络管理命令 1、查看网卡 2、设置网卡 &#xff08;1&#xff09;网卡未被设置过时 &#xff08;2&#xff09;当网卡被设定&#xff0c…

2025年渗透测试面试题总结-匿名[校招]安全研究员(SAST方向)(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 匿名[校招]安全研究员(SAST方向) 一面问题回答框架 1. 自我介绍 2. 简历深挖&#xff08;漏洞挖掘&#x…

基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计

摘要 随着医疗信息化的不断推进以及“互联网医疗”模式的广泛普及&#xff0c;传统医院挂号流程中存在的排队时间长、资源分配不均等问题日益凸显&#xff0c;急需通过数字化手段加以解决。本研究设计并实现了一套基于Java、SpringBoot、Vue与UniAPP技术栈的医院预约挂号微信小…

制作一款打飞机游戏62:添加音效

添加音乐 今天&#xff0c;我们要添加音乐。 首先&#xff0c;打开包含音轨的文件夹&#xff0c;然后使用文本编辑器打开cowshrub文件。接着&#xff0c;打开捐赠卡&#xff0c;复制其中的音乐和音效数据&#xff0c;粘贴到cowshrub文件中&#xff0c;替换原有的音效块&#…