本文轉載于極術社區
作者:曾是一顆薏米
前言
近期,筆者有幸獲得靈動微 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,連接如下圖所示:

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 庫等文件
從官方的提供的例程資料中找到 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 的打印:

查看開發板可看到 LED2 隔 500ms 閃爍一次。
總結
本次移植過程修改的地方不多,主要是因為 SDK 變動而做的修改。在此,可以看到靈動微在維護 hal 庫做出的努力。畢竟 hal 層兼容性越強,可以吸收更多潛在用戶,節省用戶熟悉 SDK 的時間,這也是國產芯片替代的必經之路。
最后,感謝靈動微和極術社區提供的平臺,也祝愿國產芯片越來越好。
倉庫代碼: https://gitee.com/sakura96888/mm32f5260_rtt
轉自 | 極術社區
-
處理器
+關注
關注
68文章
20250瀏覽量
252209 -
移植
+關注
關注
1文章
414瀏覽量
29390 -
串口
+關注
關注
15文章
1618瀏覽量
82809 -
開發板
+關注
關注
26文章
6289瀏覽量
118049 -
RT-Thread
+關注
關注
32文章
1613瀏覽量
44823 -
靈動微
+關注
關注
5文章
176瀏覽量
23226 -
MM32
+關注
關注
1文章
108瀏覽量
1392
原文標題:開發板測評|移植 RT-Thread 到 MM32F5265,含調通串口+LED
文章出處:【微信號:Ithingedu,微信公眾號:安芯教育科技】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
恩智浦亮相RT-Thread 20周年開發者大會
給開發者的RT-Thread大會「實在」指南:技術、開發板與真誠的見面禮
首搭RT-Thread程翧車控平臺| RT-Thread程翧 S32K344 快速原型開發平臺正式上市!| 產品動態
移植最新版的rt-thread nano時程序進入到entry就報錯,為什么?
如何移植rt-thread到野火imx6ull開發板上?
2025年RT-Thread開發者巡回培訓報名正式啟動!
使用RT-Thread studio 開發RT-Thread Nano項目的時候 串口的驅動是要自己寫嗎?
RT-Thread studio報錯怎么解決?
RT-Thread生態再壯大!六大硬核新品,同步上線 | 產品動態
明晚!基于RT-Thread 的 PID 控制實踐,從驅動到算法到監控,一次學會!| 問學直播
恩智浦MCU教程 基于MCUXpresso和FRDM-MCXA346的RT-Thread Nano移植
RT-Thread聯合瑞薩發起移植挑戰賽,邀您共創開源生態!| 社區活動
讓開發板暢游網絡:RT-Thread CherryUSB 驅動 RNDIS 模塊詳解 | 技術集結
移植RT-Thread到靈動微MM32F5265開發板教程
評論