打印
[DemoCode下载]

在NUC029SGE上移植RT-Thread Nano要点

[复制链接]
2993|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2020-7-30 13:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 gaoyang9992006 于 2020-8-3 11:21 编辑

首先贡献出我的代码和工程,经过修改,这个是一个简单的演示。同时移植了控制台与rt_kprintf MyRTT.rar (21.13 MB)

昨天我的半成品分享给网友,好像被发上来了,不过不完整。这个完整一点,也有待完善提高。
不过入门够用了。
主要个人要修改的文件有两个
board.crtconfig.h
记住了
可以将系统的时钟配置和串口初始化放到board.c
另外关于控制台移植与rt_kprintf移植也可以在这文件里完成。
/*
* Copyright (c) 2006-2019, RT-Thread Development Team
*
* SPDX-License-Identifier: Apache-2.0
*
* Change Logs:
* Date           Author       Notes
* 2017-07-24     Tanek        the first version
* 2018-11-12     Ernest Chen  modify copyright
*/
#include <stdio.h>
#include <stdint.h>
#include <rthw.h>
#include <rtthread.h>
//#include "uart.h"
#include "NUC029xGE.h"
#define PLL_CLOCK       72000000

#define _SCB_BASE       (0xE000E010UL)
#define _SYSTICK_CTRL   (*(rt_uint32_t *)(_SCB_BASE + 0x0))
#define _SYSTICK_LOAD   (*(rt_uint32_t *)(_SCB_BASE + 0x4))
#define _SYSTICK_VAL    (*(rt_uint32_t *)(_SCB_BASE + 0x8))
#define _SYSTICK_CALIB  (*(rt_uint32_t *)(_SCB_BASE + 0xC))
#define _SYSTICK_PRI    (*(rt_uint8_t  *)(0xE000ED23UL))

// Updates the variable SystemCoreClock and must be called
// whenever the core clock is changed during program execution.
extern void SystemCoreClockUpdate(void);

// Holds the system core clock, which is the system clock
// frequency supplied to the SysTick timer and the processor
// core clock.
extern uint32_t SystemCoreClock;

static uint32_t _SysTick_Config(rt_uint32_t ticks)
{
    if ((ticks - 1) > 0xFFFFFF)
    {
        return 1;
    }
   
    _SYSTICK_LOAD = ticks - 1;
    _SYSTICK_PRI = 0xFF;
    _SYSTICK_VAL  = 0;
    _SYSTICK_CTRL = 0x07;  
   
    return 0;
}

#if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
#define RT_HEAP_SIZE 1024
static uint32_t rt_heap[RT_HEAP_SIZE];     // heap default size: 4K(1024 * 4)
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
/*自己添加跟硬件有关的时钟初始化*/
static void rt_hw_system_init(void)
{
    /*---------------------------------------------------------------------------------------------------------*/
    /* Init System Clock                                                                                       */
    /*---------------------------------------------------------------------------------------------------------*/
    SYS_UnlockReg();

  /* Enable HIRC clock (Internal RC 22.1184MHz) */
    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 clock divider as 1 */
    CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

    /* Set core clock as PLL_CLOCK from PLL */
    CLK_SetCoreClock(PLL_CLOCK);
    /* Set SysTick clock source to HCLK source divide 2 */
    CLK_SetSysTickClockSrc(CLK_CLKSEL0_STCLKSEL_HCLK_DIV2);

    SYS_LockReg();
}
/*自己添加跟串口有关的时钟初始化*/
static void rt_hw_usart_init()
{
    /* Unlock protected registers */
    SYS_UnlockReg();

    /* Enable HXT clock (external XTAL 12MHz) */
    CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk);

    /* Wait for HXT clock ready */
    CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
  
    /* Enable UART module clock */
    CLK_EnableModuleClock(UART0_MODULE);

    /* Select UART module clock source as HXT and UART module clock divider as 1 */
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UARTSEL_HXT, CLK_CLKDIV0_UART(1));

    /*---------------------------------------------------------------------------------------------------------*/
    /* Init I/O Multi-function                                                                                 */
    /*---------------------------------------------------------------------------------------------------------*/

    /* Set multi-function pins for UART0 RXD and TXD */
    SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk);
    SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA3MFP_UART0_RXD | SYS_GPA_MFPL_PA2MFP_UART0_TXD);

    /* Lock protected registers */
    SYS_LockReg();
               
                    /* Reset UART0 */
    SYS_ResetModule(UART0_RST);

    /* Configure UART0 and set UART0 baud rate */
    UART_Open(UART0, 115200);
}

/**
* This function will initial your board.
*/
void rt_hw_board_init()
{
    /* Configure the system clock */
    rt_hw_system_init();

                /* System Clock Update */
    SystemCoreClockUpdate();
   
    /* System Tick Configuration */
    _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

        /* Initial usart deriver, and set console device */
                rt_hw_usart_init();        
        
    /* 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
}

void SysTick_Handler(void)
{
    /* enter interrupt */
    rt_interrupt_enter();

    rt_tick_increase();

    /* leave interrupt */
    rt_interrupt_leave();
}
/*自己添加对接串口控制台*/
void rt_hw_console_output(const char *str)
{
        printf("%s",str);
}

char rt_hw_console_getchar(void)
{
return getchar();
}
注意最后这两个,我直接用了stdio.h头文件里面的printf与getchar,非常方便。

时钟配置也要在这里完成,并被系统初始化函数调用,这样才好让OS时钟系统知道硬件时钟是配置成了什么。



使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2020-7-30 13:40 | 只看该作者
如果想定义多个程序,并通过MSH命令调用,那么可以这么做

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

/*---------------------------------------------------------------------------------------------------------*/
/*  Main Function                                                                                          */
/*---------------------------------------------------------------------------------------------------------*/
int32_t main(void)
{

return 0;
}
int led(void)
{
    printf("\n\nCPU [url=home.php?mod=space&uid=72445]@[/url] %d Hz\n", SystemCoreClock);
    printf("+-------------------------------------------------+\n");
    printf("|    PC.5(Output)  Sample Code     |\n");
    printf("+-------------------------------------------------+\n\n");

    /*-----------------------------------------------------------------------------------------------------*/
    /* GPIO Basic Mode Test --- Use Pin Data Input/Output to control GPIO pin                              */
    /*-----------------------------------------------------------------------------------------------------*/

    /* Configure PC.5 as Output mode*/
    GPIO_SetMode(PC, BIT5, GPIO_MODE_OUTPUT);

    /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
        rt_kprintf("Hello RTT_NANO\n");
//        while(1)
                {
                        PC5=0;
                        rt_thread_mdelay(2000);
                        printf("\nLED is ON\n");
                        PC5=1;
                        rt_thread_mdelay(2000);
                        printf("\nLED is OFF\n");       
                }
return 0;
}

MSH_CMD_EXPORT(led, RT-Thread first led sample);
RT-Thread 示例代码都通过 MSH_CMD_EXPORT 将示例初始函数导出到 msh 命令,可以在系统运行过程中,通过在控制台输入命令来启动。

使用特权

评论回复
板凳
幸福小强| | 2020-7-30 16:38 | 只看该作者
学习学习移植技术。

使用特权

评论回复
地板
yiyigirl2014| | 2020-7-30 20:33 | 只看该作者
我试试,原来不难啊, 多谢分享经验。

使用特权

评论回复
5
小灵通2018| | 2020-8-2 19:57 | 只看该作者
感谢分享。

使用特权

评论回复
6
traveo| | 2020-8-3 10:42 | 只看该作者
干货~~~~~~~

使用特权

评论回复
7
gaoyang9992006|  楼主 | 2020-8-3 11:23 | 只看该作者

终于遇到识货的了,多谢鼓励。。。。我准备好好学一下这个国产的RTOS,经过体验性能和上手感觉那是非常优秀的一个,听说马上要发布微内核的版本了,世界先进水平的嵌入式RTOS要诞生了,目前是我用过最好用的。支持的很全面,还有自己的开发工具和配套软件。

使用特权

评论回复
评论
gaoyang9992006 2020-8-10 15:28 回复TA
@traveo :微信平时不怎么用的,都是在论坛交流,可以论坛加好友。 
8
幸福小强| | 2020-8-3 19:22 | 只看该作者
终于学会了。

使用特权

评论回复
9
wanduzi| | 2020-8-3 19:44 | 只看该作者
真心不错的好贴,学会了, 没想到这么简单就移植了。

使用特权

评论回复
10
yiy| | 2020-8-3 20:36 | 只看该作者
楼主这只是演示了一个IO的操作,问一下楼主,如果搞PWM,该如何使用。

使用特权

评论回复
11
xinxianshi| | 2020-8-3 21:22 | 只看该作者
如果自己实现打印字符串的可以不可以。

使用特权

评论回复
12
21mengnan| | 2020-8-3 23:06 | 只看该作者
看完了,受益匪浅

使用特权

评论回复
13
wahahaheihei| | 2020-8-3 23:36 | 只看该作者
谢谢哦。下载看看。

使用特权

评论回复
14
643757107| | 2020-8-3 23:37 | 只看该作者
大佬这么一说,很容易学啊。

使用特权

评论回复
15
xixi2017| | 2020-8-4 20:03 | 只看该作者
比官方教程好懂。

使用特权

评论回复
16
yiyigirl2014| | 2020-8-4 22:02 | 只看该作者
多谢分享。。

使用特权

评论回复
17
jiekou001| | 2020-8-6 11:23 | 只看该作者
多谢分享,学习了。

使用特权

评论回复
18
xinxianshi| | 2020-8-11 22:58 | 只看该作者
学习学习。

使用特权

评论回复
19
wahahaheihei| | 2020-8-12 11:55 | 只看该作者
学习谢谢

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1896

主题

15631

帖子

198

粉丝