日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

新唐M251 CORTEX-M23内核移植TencentOS tiny教程

發(fā)布時(shí)間:2024/3/13 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 新唐M251 CORTEX-M23内核移植TencentOS tiny教程 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

Cortex M23 移植TencentOS tiny

    • 準(zhǔn)備源碼和工具
    • 準(zhǔn)備硬件、軟件
    • 移植開始

準(zhǔn)備源碼和工具

TencentOS tiny的源碼地址在這: TencentOS tiny.
MDK軟件下載在這:MDK5.28 已有MDK請(qǐng)忽略
項(xiàng)目需要的資料我已經(jīng)上傳 M251_Sourse

準(zhǔn)備硬件、軟件

硬件:
1個(gè)新唐 Numaker_M251_252SD demo板,如果你有其他板子,只要是M251或者M(jìn)252都可以,可以正常下程序的
1個(gè)Nulink 用來下載程序的

軟件:
TencentOS tiny代碼包
我上傳的資料包里邊的Nu-Link_Keil_Driver 3.00.6909.exe一路安裝,提示是否需要加入軟件包的時(shí)候點(diǎn)確定即可
解壓M251_252_Series_BSP_CMSIS_V3.00.002.zip備用,以下是先把一個(gè)裸機(jī)工程的必須文件提取,如下
桌面新建一個(gè)文件夾名為Nuvoton Tos(隨意),然后新建如下幾個(gè)文件

TencentOS里邊新建三個(gè)文件夾 arch 、kernel、TOS_CONFIG這三個(gè)文件夾

然后先拷貝CMSIS文件,把M251_252_Series_BSP_CMSIS_V3.00.002圖中三個(gè)文件拷貝到工程的CMSIS下

到M251_252_Series_BSP_CMSIS_V3.00.002中復(fù)制圖中紅框內(nèi)的文件夾和文件到工程的STARTUP文件夾內(nèi)


然后進(jìn)入ARM文件夾內(nèi),復(fù)制startup_M251.s

然后把整個(gè)外設(shè)驅(qū)動(dòng)文件夾內(nèi)全部復(fù)制到工程的StdDriver內(nèi)

最后到TencentOS tiny的移植
進(jìn)入TencentOS tiny 文件夾 \TencentOS-tiny\arch\arm\arm-v7m\common 和
\TencentOS-tiny\arch\arm\arm-v7m\cortex-m0+\armcc
復(fù)制框中的文件夾到工程的TencentOS 的 arch內(nèi) 這些就是操作系統(tǒng)和內(nèi)核的接口文件


然后把 kernel內(nèi)的所有文件復(fù)制到工程的kernel內(nèi)這些就是實(shí)現(xiàn)操作系統(tǒng)的底層文件


TOS_CONFIG 文件夾內(nèi)的文件在 \TencentOS-tiny\board\TencentOS_tiny_EVB_MX\TOS-CONFIG
把它復(fù)制到工程的TOS_CONFIG 文件夾內(nèi)

這樣準(zhǔn)備工作就基本完成,接下來就是移植了

移植開始

打開MDK 新建一個(gè)工程 然后把工程保存到工程Project文件夾內(nèi),名字隨意取


接下來是選擇目標(biāo)單片機(jī),我這里是M251KG6AE,看你的板子是什么單片機(jī)就選什么單片機(jī)

然后勾選CMSIS的CORE

一個(gè)空工程模板就建好了,接下來要放入文件,添加對(duì)應(yīng)對(duì)應(yīng)文件夾內(nèi)的代碼

這是添加好的代碼 紅框內(nèi)的文件是在kernel 的 pm文件夾內(nèi),此時(shí)USER文件夾內(nèi)是空的,需要新建一個(gè)main.c文件

新建main.c 放入以下代碼,里面就是初始化系統(tǒng),選擇時(shí)鐘源,然后創(chuàng)建兩個(gè)任務(wù)

#include "stdio.h" #include "NuMicro.h" #include "tos.h"#define task1_size 512 //任務(wù)1堆棧大小 #define oled_size 1024k_task_t task1; //任務(wù)1結(jié)構(gòu)體 k_task_t oled_task; //顯示任務(wù)結(jié)構(gòu)體k_stack_t task1_stack[task1_size]; //任務(wù)1堆棧 k_stack_t oled_stack[oled_size]; //任務(wù)2的堆棧大小void SYS_Init(void) {/*---------------------------------------------------------------------------------------------------------*//* Init System Clock *//*---------------------------------------------------------------------------------------------------------*//* Unlock protected registers */SYS_UnlockReg();/* Set XT1_OUT(PF.2) and XT1_IN(PF.3) to input mode to prevent leakage */PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);/* Disable digital input path of analog pin XT1_OUT to prevent leakage */GPIO_DISABLE_DIGITAL_PATH(PF, BIT2 | BIT3);/* Enable, HXT clock */CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); /* Switch HCLK clock source to PLL */CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HXT, CLK_CLKDIV0_HCLK(1)); //這里選擇外部晶振,DEMO板子上的是32M/* Set the core clock freq*/CLK_SetCoreClock(FREQ_32MHZ); //這里是設(shè)定內(nèi)核的時(shí)鐘頻率,實(shí)測(cè)不能倍頻,只能小于或等于你的外部晶振的頻率 /* Enable UART module clock */CLK_EnableModuleClock(UART0_MODULE);/* Select UART module clock source as HIRC and UART module clock divider as 1 */CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));/*---------------------------------------------------------------------------------------------------------*//* Init I/O Multi-function *//*---------------------------------------------------------------------------------------------------------*/Uart0DefaultMPF();}void UART0_Init() {/*---------------------------------------------------------------------------------------------------------*//* Init UART *//*---------------------------------------------------------------------------------------------------------*//* Reset UART module */SYS_ResetModule(UART0_RST);/* Configure UART0 and set UART0 baud rate */UART_Open(UART0, 115200); }void task1_fun(void *Parameter) {while(1){printf("Task1 :移植CORTEX-M23成功\r\n"); PB14 =~ PB14; //板子上的LED燈tos_task_delay(1000); //延時(shí)1s}}//*OLED顯示任務(wù)函數(shù) void oled_display_task(void *Parameter) {k_err_t err;while(1){ printf("Task2 請(qǐng)歡呼雀躍,謝謝\r\n"); tos_task_delay(100); //100mS刷新 } }int main() {k_err_t err;/* Unlock protected registers */SYS_UnlockReg(); //解鎖時(shí)鐘保護(hù)寄存器/* Init System, peripheral clock and multi-function I/O */SYS_Init(); tos_knl_init(); //tos init 系統(tǒng)初始化是包含初始化滴答定時(shí)器,所以必須在時(shí)鐘保護(hù)寄存器解鎖后調(diào)用 /* Lock protected registers */SYS_LockReg(); //上鎖/* Init UART0 for printf */UART0_Init();GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT);err = tos_task_create(&task1,"Task1",task1_fun,NULL,2,task1_stack,task1_size,100);err = tos_task_create(&oled_task, //內(nèi)核任務(wù)的結(jié)構(gòu)體"display", //任務(wù)的名字的指針oled_display_task, //任務(wù)實(shí)體函數(shù)入口NULL, //傳遞給任務(wù)函數(shù)的參數(shù)2, //優(yōu)先級(jí) 數(shù)字越小優(yōu)先級(jí)越大oled_stack, //任務(wù)在運(yùn)行時(shí)使用的棧空間的起始地址oled_size, //任務(wù)堆棧大小100); //時(shí)間片輪轉(zhuǎn)機(jī)制下當(dāng)前任務(wù)的時(shí)間片大小。當(dāng)timeslice為0時(shí),任務(wù)調(diào)度時(shí)間片會(huì)被設(shè)置為默認(rèn)大小(TOS_CFG_CPU_TICK_PER_SECOND / 10),系統(tǒng)時(shí)鐘滴答(systick)數(shù) / 10。 if(err != K_ERR_NONE)printf("TenentOS creat task fail! code is %d\r\n",err);tos_knl_start(); //Start TOS TINY }

保存到工程文件夾Project內(nèi),然后再添加到MDK USER中即可

然后包含頭文件如圖:

接下來是修改核心文件,先構(gòu)建系統(tǒng)滴答定時(shí)器的中斷服務(wù)函數(shù)
在 system_M251.c 文件中包含Tos頭文件 在最下面添加中斷服務(wù)

修改串口的引腳,在該文件的最下面,我的demo板子是用的uart0,引腳對(duì)應(yīng)的是A0 A1,所以修改一下

void Uart0DefaultMPF(void) {/* Set GPB multi-function pins for UART0 RXD and TXD */// SYS->GPB_MFPH = (SYS->GPB_MFPH & ~SYS_GPB_MFPH_PB12MFP_Msk) | SYS_GPB_MFPH_PB12MFP_UART0_RXD;// SYS->GPB_MFPH = (SYS->GPB_MFPH & ~SYS_GPB_MFPH_PB13MFP_Msk) | SYS_GPB_MFPH_PB13MFP_UART0_TXD; SYS->GPA_MFPL = (SYS->GPA_MFPL & ~SYS_GPA_MFPL_PA0MFP_Msk) | SYS_GPA_MFPL_PA0MFP_UART0_RXD;SYS->GPA_MFPL = (SYS->GPA_MFPL & ~SYS_GPA_MFPL_PA1MFP_Msk) | SYS_GPA_MFPL_PA1MFP_UART0_TXD; }

然后在串口函數(shù)下面添加滴答定時(shí)器的中斷服務(wù)函數(shù)

//systick 中斷處理函數(shù) void SysTick_Handler(void) {if (tos_knl_is_running()){tos_knl_irq_enter();tos_tick_handler(); //系統(tǒng)的心跳tos_knl_irq_leave();} }

修改內(nèi)核頭文件:打開port_c.c文件,修改單片機(jī)內(nèi)核頭文件

然后修改tos_config文件

還有下面的設(shè)置系統(tǒng)的時(shí)鐘頻率的,這里要和單片機(jī)設(shè)定的內(nèi)核時(shí)鐘頻率移植,否則會(huì)出現(xiàn)時(shí)間不準(zhǔn)確的現(xiàn)象。

然后編譯


然后就下載到板子上,先選擇仿真器,并對(duì)仿真器進(jìn)行設(shè)置:

然后把USB-TTl,鏈接PA0 PA1,打開串口調(diào)試助手,設(shè)置115200波特率,打開串口,然后按一下板子上的復(fù)位鍵,即可看到串口打印任務(wù)1 和 任務(wù)2 ,任務(wù)1是每秒打印,任務(wù)2是100ms打印,然后板子上的LED燈每秒交替亮滅,說明系統(tǒng)正常跑

到這里,TencentOS tiny 移植新塘M251 cortex-M23內(nèi)核成功!

最后獻(xiàn)上代碼 點(diǎn)我

我也開始使用github了,代碼在gihub上也有
GITHUB

總結(jié)

以上是生活随笔為你收集整理的新唐M251 CORTEX-M23内核移植TencentOS tiny教程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。