電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1196|回復(fù): 0
收起左側(cè)

新唐新出單片機(jī)M0A23移植RT-Thread竟然這么容易,十分鐘搞定。

[復(fù)制鏈接]

578

主題

858

帖子

4821

積分

四級(jí)會(huì)員

Rank: 4

積分
4821
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-7-15 22:24:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
NuMicro M0A23 系列是基于 Arm Cortex -M0 內(nèi)核的 32 位微控制器。它的工作溫度范圍達(dá) -40°C 至 125°C,在小封裝中提供 CAN 功能,豐富的仿真外設(shè)及彈性的引腳分配功能。2.4V 至 5.5V 的工作電壓。NuMicro M0A23 系列針對(duì)工控和較高的工作溫度應(yīng)用,如雷達(dá),電池管理系統(tǒng) (BMS),汽車照明,車用控制及工控傳感器等應(yīng)用。

之前我發(fā)過一個(gè)帖,移植RTT到NUC029上的帖,這次拿到新的開發(fā)板,我們?cè)囋嚹芊褫p松移植RTT到這個(gè)M0A23開發(fā)板。
準(zhǔn)備工具 Keil V5,在pack里安裝RTOS,如下圖所示



接下來新建工程,工程目錄存放M0A23的Lib文件


然后按照RTE的創(chuàng)建工程方式,添加啟動(dòng)文件與RTT RTOS文件到工程


在工程創(chuàng)建目錄,添加USER文件和Lib文件


最后對(duì)工程配置進(jìn)行修改,因?yàn)橐胹tdio.h
所以在Target選項(xiàng)卡勾選Use MicroLIB,同時(shí)選中編譯器為V5版本


在C/C++選項(xiàng)卡設(shè)置頭文件路徑

.\Library\Device\Nuvoton\M0A21\Include;.\Library\StdDriver\inc;.\Library\CMSIS\Include
復(fù)制代碼在Linker選項(xiàng)卡設(shè)置Misc controls

--map --first='startup_M0A21.o(RESET)' --datacompressor=off --info=inline --entry Reset_Handler
復(fù)制代碼在調(diào)試器設(shè)置對(duì)應(yīng)的調(diào)試器,并選擇為自動(dòng)偵測(cè)模式



配置燒錄功能如下



基本配置到此完成,接下來進(jìn)行RTT移植修改。
在board.c文件中進(jìn)行時(shí)鐘與串口的初始化配置,同時(shí)別忘了將頭文件NUMicro.h包含進(jìn)來。
可以直接將M0A23的BSP中的模板配置復(fù)制來用即可

void SYS_Init(void)

{

    /* Unlock protected registers */

    SYS_UnlockReg();



    /* Enable HIRC clock (Internal RC 48MHz) */

    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);



    /* Wait for HIRC clock ready */

    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);



    /* Select HCLK clock source as HIRC and HCLK source divider as 1 */

    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));



    /* Enable UART0 clock */

    CLK_EnableModuleClock(UART0_MODULE);



    /* Switch UART0 clock source to HIRC */

    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));



    /* Update System Core Clock */

    SystemcoreClockUpdate();



    /* Set PB multi-function pins for UART0 RXD=PB.6 and TXD=PB.4 */

    SYS->GPB_MFP1 = (SYS->GPB_MFP1 & ~(SYS_GPB_MFP1_PB4MFP_Msk | SYS_GPB_MFP1_PB6MFP_Msk)) |          \

                          (SYS_GPB_MFP1_PB4MFP_UART0_TXD | SYS_GPB_MFP1_PB6MFP_UART0_RXD);



    /* Lock protected registers */

    SYS_LockReg();



                    UART_Open(UART0, 115200);

}
復(fù)制代碼然后在rt_hw_board_init()
中引用該初始化并刪除該函數(shù)中的時(shí)鐘更新函數(shù),因?yàn)槲覀円呀?jīng)在上面的函數(shù)完成了該操作。
接下來在該文件末尾添加

void rt_hw_console_output(const char *str)

{

          printf("%s",str);

}



char rt_hw_console_getchar(void)

{

return getchar();

}


復(fù)制代碼以實(shí)現(xiàn)串口打印與交互輸入。
然后我們發(fā)現(xiàn),工程的啟動(dòng)文件目錄有重定向文件,我們用庫函數(shù)中的進(jìn)行替換該文件。
然后找到
__asm int32_t HardFault_Handler(void)
該函數(shù),并注釋掉該函數(shù),因?yàn)镽TT中已經(jīng)實(shí)現(xiàn)了該函數(shù),不然就重復(fù)定義了。另外就是通過rtconfig.h啟用某些功能了,支持配置向?qū)J?br />

接下來保存工程,在main.c添加個(gè)簡單的代碼

#include <stdio.h>

#include "NuMicro.h"

#include <rtthread.h>



int main(void)

{

          return 0;

}
復(fù)制代碼

編譯,一次通過。

".\Objects\demo.axf" - 0 Error(s), 0 Warning(s).
復(fù)制代碼下載測(cè)試



這里提供工程供大家測(cè)試學(xué)習(xí)

M0A23_RTT.rar

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表