IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> rt-thread nano移植到新唐M031 -> 正文阅读

[嵌入式]rt-thread nano移植到新唐M031

习惯在rtos下写代码回不去祼机下大循环标志位的写法,几K内存也跑个RTOS,参照论坛一篇rt-thread nano移植的帖子,也做了一次rt-thread nano的适配到M031LE3AE芯片。finsh串口为UART1的PB6、PB7,芯片时钟为内部RC 48MHz。

一、在keil MDK安装相应的组件包,并配置加入工程中

在这里插入图片描述

二、加入新M0的硬件驱动库并加入头文件 路径

在这里插入图片描述

三、配置rtconfig.h文件

在这里插入图片描述

四、修改board.c及finsh_port.c文件完成BSP硬件对接

修改RT_HEAP_SIZE为合适的堆大小,不然没法编译

把retarget.c文件的HardFault_Handler函数注释掉,由rt-thread nano的HardFault_Handler接管
在这里插入图片描述
修改system_M031Serials.c的系统时钟为__HIRC

uint32_t SystemCoreClock  = __HIRC;              /*!< System Clock Frequency (Core Clock) */
uint32_t CyclesPerUs      = (__HIRC / 1000000);  /*!< Cycles per micro second             */
uint32_t PllClock         = __HIRC;              /*!< PLL Output Clock Frequency          */

依次按照#error设定的4个部分配置时钟和硬件初始化,串口初始化,串口输出,串口输入。
时钟初始化,复制SYS_Init(); 并在其中完善滴答定时器的启动与配置。
打开board.c添加系统初始化代码

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 */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);

    /* Enable HIRC clock (Internal RC 48 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

    /* Wait for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);

    /* Set core clock as 51MHz from PLL */
    CLK_SetCoreClock(FREQ_48MHZ);

    /* System Tick Configuration */
    CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HCLK,SystemCoreClock / RT_TICK_PER_SECOND);

    /* Enable UART clock */
    CLK_EnableModuleClock(UART1_MODULE);

    /* Select UART clock source from HIRC */
    CLK_SetModuleClock(UART1_MODULE, CLK_CLKSEL1_UART1SEL_HIRC, CLK_CLKDIV0_UART1(1));          

    /* Update System Core Clock */

    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */

    SystemCoreClockUpdate();

    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPL = (SYS->GPB_MFPL & ~(SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB7MFP_Msk))    |       \

                    (SYS_GPB_MFPL_PB7MFP_UART1_TXD | SYS_GPB_MFPL_PB6MFP_UART1_RXD);

    /* Lock protected registers */
    SYS_LockReg();
}

滴答定时器中断的内容:

/* systick 中断服务例程 */

void SysTick_Handler(void)
{
        rt_os_tick_callback();
}

其中内部的回调函数,rtt的board.c已经帮我们完成,只需要添加以上代码段即可,也可修改回调函数的名字为中断入口。

将系统初始化代码填入#error "TODO 1: OS Tick Configuration."后面,并注释掉该行,确保编译时候不再报错提示该位置。
串口初始化,按如下代码进行初始化

static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."

    /* Reset UART1 */
    SYS_ResetModule(UART1_RST);
    
    /* Configure UART1 and set UART1 baud rate */

    UART_Open(UART1, 115200);
    
    return 0;
}

串口输出功能
串口打印函数是调用rt-thread nano的rt_kprintf函数,

voidrt_hw_console_output(const char *str)
{
        //#error "TODO 3: Output the string 'str' through the uart."
        UART_Write(UART1,(uint8_t *)str,rt_strlen(str));        
}

串口输入功能

串口输入功能的配置在finsh_port.c

RT_WEAK char rt_hw_console_getchar(void)
{
    /* Note: the initial value of ch must < 0 */
    int ch = -1;
//#error "TODO 4: Read a char from the uart and assign it to 'ch'."
	if((UART1->FIFOSTS & UART_FIFOSTS_RXEMPTY_Msk) == 0)
	{
		return (UART1->DAT);
	}
	return ch;
}

完整board.c文件

/*
 * Copyright (c) 2006-2019, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2021-05-24                  the first version
 */

#include <rthw.h>
#include <rtthread.h>
#include <NuMicro.h>

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
/*
 * Please modify RT_HEAP_SIZE if you enable RT_USING_HEAP
 * the RT_HEAP_SIZE max value = (sram size - ZI size), 1024 means 1024 bytes
 */
#define RT_HEAP_SIZE (12*1024)
static rt_uint8_t rt_heap[RT_HEAP_SIZE];

RT_WEAK void *rt_heap_begin_get(void)
{
    return rt_heap;
}

RT_WEAK void *rt_heap_end_get(void)
{
    return rt_heap + RT_HEAP_SIZE;
}
#endif

void rt_os_tick_callback(void)
{
    rt_interrupt_enter();
    
    rt_tick_increase();

    rt_interrupt_leave();
}

void SysTick_Handler(void)
{
    rt_os_tick_callback();
}

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 */
    PF->MODE &= ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk);
    /* Enable HIRC clock (Internal RC 48 MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);
    /* Wait for HIRC clock ready */
    CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk);
    /* Set core clock as 51MHz from PLL */
    CLK_SetCoreClock(FREQ_51MHZ);
	/* System Tick Configuration */

	CLK_EnableSysTick(CLK_CLKSEL0_STCLKSEL_HCLK,SystemCoreClock / RT_TICK_PER_SECOND);
    /* Enable UART clock */
    CLK_EnableModuleClock(UART0_MODULE);
    /* Select UART clock source from HIRC */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HIRC, CLK_CLKDIV0_UART0(1));
    /* Update System Core Clock */
    /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
    SystemCoreClockUpdate();
    /* Set GPB multi-function pins for UART0 RXD and TXD */
    SYS->GPB_MFPH = (SYS->GPB_MFPH & ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk))    |       \

                    (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD);

    /* Lock protected registers */
    SYS_LockReg();
}

/**
 * This function will initial your board.
 */
void rt_hw_board_init(void)
{
//#error "TODO 1: OS Tick Configuration."
    /* 
     * TODO 1: OS Tick Configuration
     * Enable the hardware timer and call the rt_os_tick_callback function
     * periodically with the frequency RT_TICK_PER_SECOND. 
     */

    /* Call components board initial (use INIT_BOARD_EXPORT()) */
#ifdef RT_USING_COMPONENTS_INIT
    rt_components_board_init();
#endif

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
    rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
#endif
}

#ifdef RT_USING_CONSOLE

static int uart_init(void)
{
//#error "TODO 2: Enable the hardware uart and config baudrate."
    SYS_ResetModule(UART0_RST);
    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
    return 0;
}
INIT_BOARD_EXPORT(uart_init);

void rt_hw_console_output(const char *str)
{
//#error "TODO 3: Output the string 'str' through the uart."
    UART_Write(UART0,(uint8_t *)str,rt_strlen(str));        
}
#endif

五、测试代码

#include "stdio.h"
#include <NuMicro.h>
#include <rtthread.h>

//配置优先级,栈大小,时间片,设置不对没法运行的。

#define THREAD_PRIORITY         5

#define THREAD_STACK_SIZE       256

#define THREAD_TIMESLICE        10

void led(void *parameter)
{
    rt_kprintf("\n\nCPU @ %d Hz\n", SystemCoreClock);
    rt_kprintf("+-------------------------------------------------+\n");
    rt_kprintf("|    PB14(Output)  Sample Code     |\n");
    rt_kprintf("+-------------------------------------------------+\n\n");
    rt_kprintf("Hello RTT_NANO\n");

    while(1)

    {

        PB14=0;
        rt_thread_mdelay(2000);
        rt_kprintf("\nLED1 is ON\n");
        PB14=1;
        rt_thread_mdelay(2000);
        rt_kprintf("\nLED1 is OFF\n");      
    }
}

/* 导出到 msh 命令列表中 */

MSH_CMD_EXPORT(led, RT-Thread first led sample);

void led2(void *parameter)
{
    rt_kprintf("Hello RTT_NANO\n");

    while(1)
    {
        PB14=0;
        rt_thread_mdelay(3000);
        rt_kprintf("\nLED2 is ON\n");
        PB14=1;
        rt_thread_mdelay(3000);
        rt_kprintf("\nLED2 is OFF\n");         
    }
}

MSH_CMD_EXPORT(led2, RT-Thread second led sample);

int led_sample(void)
{
    static rt_thread_t tid = RT_NULL;
    static rt_thread_t tid2 = RT_NULL;

        /* 创建线程1 */

    tid = rt_thread_create("thread1",

                            led, RT_NULL,

                            THREAD_STACK_SIZE,

                            THREAD_PRIORITY, THREAD_TIMESLICE);

   

    if (tid != RT_NULL)      

        rt_thread_startup(tid);

        /* 创建线程2 */

    tid2 = rt_thread_create("thread2",

                            led2, RT_NULL,

                            THREAD_STACK_SIZE,

                            THREAD_PRIORITY, THREAD_TIMESLICE);

   

    if (tid2 != RT_NULL)      

        rt_thread_startup(tid2);               

                //该例子共用PB14端口,所以一并在创建线程时候初始化为输出模式

    GPIO_SetMode(PB, BIT14, GPIO_MODE_OUTPUT);               

    return 0;
}

MSH_CMD_EXPORT(led_sample, RT-Thread sample);

/*---------------------------------------------------------------------------------------------------------*/

/*  Main Function                                                                                          */

/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)

{
    led_sample();

    return 0;

}

六、rt-thread nano对新塘M0的适配还是很简单的,新建工程->添加组件->添加驱动库->屏蔽hard_fault_handler函数->按照错误提示修改系统时钟驱动接口->测试

在secureCRT打印不会换行还没找原因
在这里插入图片描述
只能在SSCOM下先用着
在这里插入图片描述

完整工程下载连接:https://download.csdn.net/download/dmjkun/85059255

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-04-01 23:35:27  更:2022-04-01 23:36:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:46:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码