0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

移植RT-Thread到灵动微MM32F5265开发板教程

安芯教育科技 来源:极术社区 2025-03-17 10:16 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

本文转载于极术社区

作者:曾是一颗薏米

前言

近期,笔者有幸获得灵动微 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 的虚拟串口来实现串口的交互。 简述实现的流程:

PC 通过 USB 连接板载的 MM32-LINK-OB;

板载的 MM32-LINK-OB 将 USB 数据转发成 SWD 接口信号和串口的 tx/rx 信号;

最终信号达到 Mini-F5265-OB 开发板,实现串口的交互和程序的烧写功能;

板载的 MM32-LINK-OB,连接如下图所示:

33704220-faea-11ef-9310-92fbcf53809c.png

Mini-F5265-OB 开发板,连接如下图所示:

33aad674-faea-11ef-9310-92fbcf53809c.png

因此,移植的第一步就是要用上虚拟串口。

通过查看上述的原理图可知虚拟串口用到 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 库等文件

从官方的提供的例程资料中找到 HAL_Lib 文件夹,将里面的头文件和源文件拷贝工程的 libraries/drivers 目录里面。

修改 libraries/drivers 的 mm32f5260.h,定义“USE_STDPERIPH_DRIVER”的宏。(注意官方提供的默认没有定义该宏,需要定义后才会编译标准外设驱动库)

在 libraries/drivers 目录创建 hal_common.h,并在里面包含"hal_conf.h",目的是在外面可以调到 hal 层的函数接口。

将官方提供的 core_starmc1.h 拷贝到工程的 libraries/libraries/CMSIS/Include 目录下,替换原来的 core_star.h。

将官方提供的 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_SERIAL
    extern 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_INIT
    rt_components_board_init();
#endif
}

移植效果

到此为止,基本上已经完成了移植工作。

编译,烧写,可以到 rt-thread 的打印:

33ef86d4-faea-11ef-9310-92fbcf53809c.png

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

总结

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

最后,感谢灵动微和极术社区提供的平台,也祝愿国产芯片越来越好。

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

转自 | 极术社区

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 处理器
    +关注

    关注

    68

    文章

    20148

    浏览量

    246925
  • 移植
    +关注

    关注

    1

    文章

    407

    浏览量

    29207
  • 串口
    +关注

    关注

    15

    文章

    1607

    浏览量

    81908
  • 开发板
    +关注

    关注

    25

    文章

    6121

    浏览量

    113139
  • RT-Thread
    +关注

    关注

    32

    文章

    1540

    浏览量

    44250
  • 灵动微
    +关注

    关注

    5

    文章

    176

    浏览量

    23150
  • MM32
    +关注

    关注

    1

    文章

    108

    浏览量

    1310

原文标题:开发板测评|移植 RT-Thread 到 MM32F5265,含调通串口+LED

文章出处:【微信号:Ithingedu,微信公众号:安芯教育科技】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    首搭RT-Thread程翧车控平台| RT-Thread程翧 S32K344 快速原型开发平台正式上市!| 产品动态

    在智能汽车迈向高集成与高安全的时代,VCU/ECU开发正面临效率与可靠性的双重考验。依赖单一硬件或拼凑软件方案的传统模式,已成为制约创新的瓶颈。为此,RT-Thread带来里程碑式的解决方案
    的头像 发表于 10-31 11:53 474次阅读
    首搭<b class='flag-5'>RT-Thread</b>程翧车控平台| <b class='flag-5'>RT-Thread</b>程翧 S32K344 快速原型<b class='flag-5'>开发</b>平台正式上市!| 产品动态

    移植最新版的rt-thread nano时程序进入entry就报错,为什么?

    我在移植最新版的rt-thread nano时发现程序只要一进去entry函数就直接跳到一个死循环里,我使用的编译器是armgcc10.2版本。然而我移植旧版的rt-thread na
    发表于 10-09 07:17

    如何移植rt-thread野火imx6ull开发板上?

    求助如何将rt-thread移植野火imx6ull(coretex-A7)开发板上,官方的bsp中没有imx6ull
    发表于 09-29 06:25

    2025年RT-Thread开发者巡回培训报名正式启动!

    亲爱的RT-Thread社区成员们:新程再启,共赴热爱!2025年RT-Thread开发者巡回培训正式启动报名!今年,我们选择了西安、武汉、北京、杭州、深圳、上海、成都这7座城市,为大家带来
    的头像 发表于 09-27 10:39 1128次阅读
    2025年<b class='flag-5'>RT-Thread</b><b class='flag-5'>开发</b>者巡回培训报名正式启动!

    使用RT-Thread studio 开发RT-Thread Nano项目的时候 串口的驱动是要自己写吗?

    刚入坑。使用RT-Thread studio 开发RT-Thread 标准项目的时候直接使用里边的串口uart_dev=rt_device
    发表于 09-26 08:14

    如何移植EtherCAT Igh--基于米尔RK3576开发板

    本文将介绍基于米尔电子MYD-LR3576开发板(米尔基于瑞芯RK3576开发板)的移植EtherCATIgh方案的
    的头像 发表于 09-26 08:04 9427次阅读
    如何<b class='flag-5'>移植</b>EtherCAT Igh--基于米尔RK3576<b class='flag-5'>开发板</b>

    RT-Thread studio报错怎么解决?

    rt-thread studio中创建k210项目,在创建项目时需要选择开发板,生成相关文件,配置什么的没有修改过,运行main.c,打印输出。编译就会出现如下报错。这两个文件倒是可以找到,但是将其复制PATH路径下也没有用。
    发表于 09-17 06:55

    RT-Thread生态再壮大!六大硬核新品,同步上线 | 产品动态

    六大好物上新!RT-Thread生态迎来重磅更新!从核心硬件强大工具,我们为您准备了6件全方位的开发利器:RT-ThreadART-PiII开发板
    的头像 发表于 09-12 18:49 892次阅读
    <b class='flag-5'>RT-Thread</b>生态再壮大!六大硬核新品,同步上线 | 产品动态

    明晚!基于RT-Thread 的 PID 控制实践,从驱动到算法监控,一次学会!| 问学直播

    RT-Thread简单PID控制实践》精彩直播!本次直播将基于RT-Thread实时操作系统与NXPFRDM-MCXA156开发板,围绕驱动配置、控制算法实现、远
    的头像 发表于 09-01 17:04 1085次阅读
    明晚!基于<b class='flag-5'>RT-Thread</b> 的 PID 控制实践,从驱动到算法<b class='flag-5'>到</b>监控,一次学会!| 问学直播

    恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植

    本篇还是以移植RT-Thread NanoMCUXpresso IDE为主,移植的代码可以在nxpic.org.cn论坛搜索
    的头像 发表于 08-21 09:49 6218次阅读
    恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的<b class='flag-5'>RT-Thread</b> Nano<b class='flag-5'>移植</b>

    RT-Thread联合瑞萨发起移植挑战赛,邀您共创开源生态!| 社区活动

    为丰富嵌入式开源生态,推动开源RT-ThreadRTOS在更多硬件平台的落地应用,RT-Thread团队携手全球领先的半导体解决方案商瑞萨电子,正式启动移植挑战赛!本次活动将针对瑞萨8款主流MCU
    的头像 发表于 08-08 10:36 882次阅读
    <b class='flag-5'>RT-Thread</b>联合瑞萨发起<b class='flag-5'>移植</b>挑战赛,邀您共创开源生态!| 社区活动

    开发板畅游网络:RT-Thread CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    本文通过在RT-Thread操作系统上,使用CherryUSB软件包作为USBHost协议栈,驱动AIR780E4GCat.1模块的RNDIS功能,并成功接入lwIP网络协议栈,最终在开发板上实现了
    的头像 发表于 07-02 17:04 2952次阅读
    让<b class='flag-5'>开发板</b>畅游网络:<b class='flag-5'>RT-Thread</b> CherryUSB 驱动 RNDIS 模块详解 | 技术集结

    《电子发烧友电子设计周报》聚焦硬科技领域核心价值 第4期:2025.03.17--2025.03.21

    : 1、Cadence推出Conformal AI Studio 2、英诺达推出RTL功耗优化工具 开发秘籍 、避坑指南与开发板项目: 1、移植RT-Thread
    发表于 03-21 17:58

    如何将RT-Thread移植NXP MCUXPressoIDE上

    RT-Thread默认支持的IDE只有IAR 和 Keil, 那如何将RT-Thread移植NXP MCUXPressoIDE上呢?本文内容比较简单但稍有琐碎,希望对有需要的小伙伴有
    的头像 发表于 02-13 10:37 2431次阅读
    如何将<b class='flag-5'>RT-Thread</b><b class='flag-5'>移植</b><b class='flag-5'>到</b>NXP MCUXPressoIDE上

    Deepseek上单片机?RT-Thread上跑通大语言模型

    前言单片机也能聊天?RT-Thread上跑通大语言模型在RT-Thread论坛上忽然看到了单片机和大模型对话的文章,想着春节期间看到大语言模型的热度持续攀升,恰巧手头有块RA8D1VisionBoard开发板,于是尝试着在Vis
    的头像 发表于 02-07 18:59 2364次阅读
    Deepseek上单片机?<b class='flag-5'>RT-Thread</b>上跑通大语言模型