星际国际娱乐平台: [DemoCode下载] 在NUC029SGE上移植RT-Thread Nano要点

江山VR彩票百家乐计划群大全
1850|16
楼主
本帖最后由 gaoyang9992006 于 2020-8-3 11:21 编辑

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

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

  18. #define _SCB_BASE       (0xE000E010UL)
  19. #define _SYSTICK_CTRL   (*(rt_uint32_t *)(_SCB_BASE + 0x0))
  20. #define _SYSTICK_LOAD   (*(rt_uint32_t *)(_SCB_BASE + 0x4))
  21. #define _SYSTICK_VAL    (*(rt_uint32_t *)(_SCB_BASE + 0x8))
  22. #define _SYSTICK_CALIB  (*(rt_uint32_t *)(_SCB_BASE + 0xC))
  23. #define _SYSTICK_PRI    (*(rt_uint8_t  *)(0xE000ED23UL))

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

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

  31. static uint32_t _SysTick_Config(rt_uint32_t ticks)
  32. {
  33.     if ((ticks - 1) > 0xFFFFFF)
  34.     {
  35.         return 1;
  36.     }
  37.    
  38.     _SYSTICK_LOAD = ticks - 1;
  39.     _SYSTICK_PRI = 0xFF;
  40.     _SYSTICK_VAL  = 0;
  41.     _SYSTICK_CTRL = 0x07;  
  42.    
  43.     return 0;
  44. }

  45. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  46. #define RT_HEAP_SIZE 1024
  47. static uint32_t rt_heap[RT_HEAP_SIZE];     // heap default size: 4K(1024 * 4)
  48. RT_WEAK void *rt_heap_begin_get(void)
  49. {
  50.     return rt_heap;
  51. }

  52. RT_WEAK void *rt_heap_end_get(void)
  53. {
  54.     return rt_heap + RT_HEAP_SIZE;
  55. }
  56. #endif
  57. /*自己添加跟硬件有关的时钟初始化*/
  58. static void rt_hw_system_init(void)
  59. {
  60.     /*---------------------------------------------------------------------------------------------------------*/
  61.     /* Init System Clock                                                                                       */
  62.     /*---------------------------------------------------------------------------------------------------------*/
  63.     SYS_UnlockReg();

  64.   /* Enable HIRC clock (Internal RC 22.1184MHz) */
  65.     CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk);

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

  68.     /* Select HCLK clock source as HIRC and HCLK clock divider as 1 */
  69.     CLK_SetHCLK(CLK_CLKSEL0_HCLKSEL_HIRC, CLK_CLKDIV0_HCLK(1));

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

  74.     SYS_LockReg();
  75. }
  76. /*自己添加跟串口有关的时钟初始化*/
  77. static void rt_hw_usart_init()
  78. {
  79.     /* Unlock protected registers */
  80.     SYS_UnlockReg();

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

  83.     /* Wait for HXT clock ready */
  84.     CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk);
  85.   
  86.     /* Enable UART module clock */
  87.     CLK_EnableModuleClock(UART0_MODULE);

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

  90.     /*---------------------------------------------------------------------------------------------------------*/
  91.     /* Init I/O Multi-function                                                                                 */
  92.     /*---------------------------------------------------------------------------------------------------------*/

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

  96.     /* Lock protected registers */
  97.     SYS_LockReg();
  98.                
  99.                     /* Reset UART0 */
  100.     SYS_ResetModule(UART0_RST);

  101.     /* Configure UART0 and set UART0 baud rate */
  102.     UART_Open(UART0, 115200);
  103. }

  104. /**
  105. * This function will initial your board.
  106. */
  107. void rt_hw_board_init()
  108. {
  109.     /* Configure the system clock */
  110.     rt_hw_system_init();

  111.                 /* System Clock Update */
  112.     SystemCoreClockUpdate();
  113.    
  114.     /* System Tick Configuration */
  115.     _SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);

  116.         /* Initial usart deriver, and set console device */
  117.                 rt_hw_usart_init();        
  118.         
  119.     /* Call components board initial (use INIT_BOARD_EXPORT()) */
  120. #ifdef RT_USING_COMPONENTS_INIT
  121.     rt_components_board_init();
  122. #endif

  123. #if defined(RT_USING_USER_MAIN) && defined(RT_USING_HEAP)
  124.     rt_system_heap_init(rt_heap_begin_get(), rt_heap_end_get());
  125. #endif
  126. }

  127. void SysTick_Handler(void)
  128. {
  129.     /* enter interrupt */
  130.     rt_interrupt_enter();

  131.     rt_tick_increase();

  132.     /* leave interrupt */
  133.     rt_interrupt_leave();
  134. }
  135. /*自己添加对接串口控制台*/
  136. void rt_hw_console_output(const char *str)
  137. {
  138.         printf("%s",str);
  139. }

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

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



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

  1. #include "stdio.h"
  2. #include "NUC029xGE.h"
  3. #include <rtthread.h>

  4. /*---------------------------------------------------------------------------------------------------------*/
  5. /*  Main Function                                                                                          */
  6. /*---------------------------------------------------------------------------------------------------------*/
  7. int32_t main(void)
  8. {

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

  17.     /*-----------------------------------------------------------------------------------------------------*/
  18.     /* GPIO Basic Mode Test --- Use Pin Data Input/Output to control GPIO pin                              */
  19.     /*-----------------------------------------------------------------------------------------------------*/

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

  22.     /* Use Pin Data Input/Output Control to pull specified I/O or get I/O pin status */
  23.         rt_kprintf("Hello RTT_NANO\n");
  24. //        while(1)
  25.                 {
  26.                         PC5=0;
  27.                         rt_thread_mdelay(2000);
  28.                         printf("\nLED is ON\n");
  29.                         PC5=1;
  30.                         rt_thread_mdelay(2000);
  31.                         printf("\nLED is OFF\n");       
  32.                 }
  33. return 0;
  34. }

  35. MSH_CMD_EXPORT(led, RT-Thread first led sample);
复制代码
RT-Thread 示例代码都通过 MSH_CMD_EXPORT 将示例初始函数导出到 msh 命令,可以在系统运行过程中,通过在控制台输入命令来启动。
板凳
| 2020-7-30 16:38 | 只看该作者
学习学习移植技术。
地板
| 2020-7-30 20:33 | 只看该作者
我试试,星际国际娱乐平台:原来不难啊, 多谢分享经验。
5
| 2020-8-2 19:57 | 只看该作者
感谢分享。
6
| 2020-8-3 10:42 | 只看该作者
干货~~~~~~~
7
 楼主 | 2020-8-3 11:23 | 只看该作者

终于遇到识货的了,多谢鼓励。。。。我准备好好学一下这个国产的RTOS,经过体验性能和上手感觉那是非常优秀的一个,听说马上要发布微内核的版本了,世界先进水平的嵌入式RTOS要诞生了,目前是我用过最好用的。支持的很全面,还有自己的开发工具和配套软件。
8
| 2020-8-3 19:22 | 只看该作者
终于学会了。
9
| 2020-8-3 19:44 | 只看该作者
真心不错的好贴,学会了, 没想到这么简单就移植了。
10
| 2020-8-3 20:36 | 只看该作者
楼主这只是演示了一个IO的操作,问一下楼主,如果搞PWM,该如何使用。
11
| 2020-8-3 21:22 | 只看该作者
如果自己实现打印字符串的可以不可以。
12
| 2020-8-3 23:06 | 只看该作者
看完了,受益匪浅
13
| 2020-8-3 23:36 | 只看该作者
谢谢哦。下载看看。
14
| 2020-8-3 23:37 | 只看该作者
大佬这么一说,很容易学啊。
15
| 2020-8-4 20:03 | 只看该作者
比官方教程好懂。
16
| 2020-8-4 22:02 | 只看该作者
多谢分享。。
17
| 2020-8-6 11:23 | 只看该作者
多谢分享,学习了。
扫描二维码,随时随地手机跟帖
您需要登录后才可以回帖 登录 | 注册

本版积分规则

我要发帖 投诉建议 创建版块 申请版主

快速回复

您需要登录后才可以回帖
登录 | 注册
高级模式

论坛热帖

江山VR彩票百家乐计划群大全 永利游戏开户直营 返回顶部 返回列表
菲律宾申博太阳城现金网(官网)官网 皇家IM申博开奖 澳门八佰伴 半价网上娱乐场 皇冠彩票官方直营网 申请开户20元体验金登入
亚洲城娱乐官网 ds太阳城现金直营官方网 菲律宾申博在线客服现金网登入 老葡京注册网址 金沙开户网址网站
bet365平台注册 大丰收娱乐场 美高梅开户网站 女神国际VR赛车彩票 千亿国际娱乐886
网上电子游戏厅下载 EB易博游戏大厅平台 www.44msc.com hb亮瞎你先生登入 菲律宾申博直属官网电子游戏登入官网