最近项目需要使用华大HC32F460跑RT-thread操作系统,因为考虑只需用到芯片容量也不大,项目也不是很复杂,无需使用RT-Thread Master版本中完整的组件和软件包等功能,只需最基本的内核部分就可以,所以选择了RT-thread Nano版本,话不多说作为一款完全由国内团队开发维护的嵌入式实时操作系(RTOS)官网上有很多相关资料,[RT-Thread Nano版说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/an0038-nano-introduction)我们直接进入HC32F460移植RTthread Nano。

Nano下载

可以直接去他们官网下载,[Nano下载链接](https://www.rt-thread.org/page/download.html)


解压后得到以上目录,简单做下说明。
bsp
示例代码,仅作参考。
components
nano版本只要是一些FINSH组件,移植基本无需改动,copy到我们工程下就行(后面可能会用到Finsh 控制台做一些调试打印)。
doc
该目录下主要一些官方相关文档说明。
include
相关头文件,需要加入到我们工程。
libcpu
cpu相关移植文件,我们移植主要需要关注的,下面会重点讲。
src
Nano 内核源码,基本无需改动,copy到我们工程下就行。
至此,RT-Thread Nano的准备工作已经完成,接下去我们开始移植到HC32F460开发板上去。

Nano移植

 1.这次我们开发使用的编译环境是keil,我们直接新建一个新工程,选择我们对应的MCU型号。


这里如果提示我们没有对应型号我们可以直接支持包下载链接,解压后直接在你keil安装目录点击安装即可。

然后点击软件运行组件中我们勾选CORE,然后确定,我们这里使用keil自带组件。

2.为了方便管理我按如下进行分组(实际可按个人编程习惯和风格,作为公司内部尽量都保持一致)。


这里简单说明下(主要还是分层思想):
app:到时放我们的应用程序。
api:这里我们会放一些对应驱动的api层接口。
drv:我们的底层驱动。
lib:放我们的官方驱动库函数。
startup:我们mcu相关启动文件。startup_hc32f460.s等。
rtos/cpu:RT-thread CPU一致相关文件。
rtos/scr:RT-thread 内核源码。
rtos/finsh:RT-thread finsh组件。
doc:readme文档主要记录版本变更等信息,方便日后查看。

3.我们按照上面分组添加对应源文件。
lib中官方库函数可以直接华大官方库文件下载链接](https://www.hdsc.com.cn/Category83-1487)下载,我们选择版本为2.2.0。



startup中添加启动文件,其中startup_hc32f460.s可以在官方example例程中直接拷贝使用。


rtos/cpu添加RTTcpu相关文件,cpuport和context_rvds(我们使用keil),这里注意因为我们华大HC32F460用的是M4内核,所以我们拷贝时注意要在cortex-m4目录下面。



rtos/scr添加RTT内核源码文件。


rtos/finsh 添加finsh组件相关源文件。


至此,我们把HC32F460库函数和RTT内核相关函数都已经添加到我们工程中,我们还需要添加下对应头文件路径和相关宏。但是编译发现缺少ddl_config.h文件(对华大设备驱动库可进行选择配置),我们可以直接拷贝官方例程中的直接到我们工程目录下即可。



再编译发现RTT部分也会报错缺少rtconfig.h文件,其实和上面类似,我们可以直接拷贝RTT内核源码官方例子中文件到我们指定工程目录,这里我们顺便把board.c也一同拷贝到我们指定的工程目录下,到时我们rrt一些底层驱动会在这里实现,然后rtconfig.h中打开finsh组件,记得别忘了添加头文件。




最后,想让RTT在我们开发板上能跑起来我们还要做最后一步,就是对board.c进行修改主要是时钟配置和增加提供RTT时基的中断服务函数(一般我们使用systick,1ms周期中断)。

//void rt_os_tick_callback(void)
//{//    rt_interrupt_enter();
//
//    rt_tick_increase();//    rt_interrupt_leave();
//}
/*==================================================================
* Function      :SysTick_Handler
* Description   :SysTick中断
* Input Para    :None
* Output Para   :None
* Return Value  :None
==================================================================*/
void SysTick_Handler(void)
{/* enter interrupt */rt_interrupt_enter();rt_tick_increase();/* leave interrupt */rt_interrupt_leave();
}
/*==================================================================
* Function  : DrvHrcInit
* Description   : 内部高速晶振初始化
* Input Para    :
* Output Para   :
* Return Value: 返回主频
==================================================================*/
uint32_t DrvHrcInit(void)
{en_clk_sys_source_t     enSysClkSrc;stc_clk_sysclk_cfg_t    stcSysClkCfg;stc_clk_xtal_cfg_t      stcXtalCfg;stc_clk_mpll_cfg_t      stcMpllCfg;MEM_ZERO_STRUCT(enSysClkSrc);MEM_ZERO_STRUCT(stcSysClkCfg);MEM_ZERO_STRUCT(stcXtalCfg);MEM_ZERO_STRUCT(stcMpllCfg);stcSysClkCfg.enHclkDiv = ClkSysclkDiv1;                                         // Max 168MHzstcSysClkCfg.enExclkDiv = ClkSysclkDiv2;                                        // Max 84MHzstcSysClkCfg.enPclk0Div = ClkSysclkDiv1;                                     // Max 168MHzstcSysClkCfg.enPclk1Div = ClkSysclkDiv2;                                      // Max 84MHzstcSysClkCfg.enPclk2Div = ClkSysclkDiv4;                                       // Max 60MHzstcSysClkCfg.enPclk3Div = ClkSysclkDiv4;                                       // Max 42MHzstcSysClkCfg.enPclk4Div = ClkSysclkDiv2;                                       // Max 84MHzCLK_SysClkConfig(&stcSysClkCfg);                                                ////16MHZstcMpllCfg.pllmDiv = 1;                                                           // 分频 1分频stcMpllCfg.plln = 21;                                                         // VCO  倍频系数 20~480stcMpllCfg.PllpDiv = 2;                                                         // MPLLP  系统主频为stcMpllCfg.PllqDiv = 2;                                                         // MPLLQstcMpllCfg.PllrDiv = 7;                                                            // MPLLR 用于USB时钟48MHZCLK_SetPllSource(ClkPllSrcHRC);                                                    //CLK_MpllConfig(&stcMpllCfg);EFM_Unlock();                                                                 /* flash read wait cycle setting */EFM_SetLatency(EFM_LATENCY_5);EFM_Lock();CLK_MpllCmd(Enable);                                                            /* Enable MPLL. */while(Set != CLK_GetFlagStatus(ClkFlagMPLLRdy));                             /* Wait MPLL ready. */CLK_SetSysClkSource(CLKSysSrcMPLL);                                               /* Switch system clock source to MPLL. */stc_sram_config_t   stcSramCfg;MEM_ZERO_STRUCT(stcSramCfg);stcSramCfg.u8SramIdx = Sram12Idx | Sram3Idx | SramRetIdx;stcSramCfg.enSramRC = SramCycle2;stcSramCfg.enSramWC = SramCycle2;SRAM_Init(&stcSramCfg);//    ReadResetCause();stc_clk_freq_t          stcClkFreq;                                             /* Check source and frequence. */CLK_GetClockFreq(&stcClkFreq);return stcClkFreq.sysclkFreq;
}
按上图修改时钟配置后编译,报错如下图,因为我们使用RTthread时,系统调度会用到这三个中断服务程序接口,RTT已经帮我们实现,我们需要把华大库自带的屏蔽掉就行。



重新编译,RTT基于HC32F460完成移植。

HC32F460 RT-Thread Nano版移植相关推荐

  1. RT Thread Free Modbus移植问题整理

    RT Thread Free Modbus移植问题整理 问题描述: 在读写寄存器中,写数据正常,只能读1个寄存器的值,多个值会异常. 在移植过程中发现串口(或RS485)数据接收长度异常. 一.环境描 ...

  2. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  3. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  4. 正点原子delay函数移植到rt thread操作系统(HAL库)

    正点原子教程中涉及到的操作系统只涉及了UCOS的教程,其中例程的system文件夹中的delay.c函数只是适配了UCOS. 下面将delay.c函数移植到rt thread中,使用的bsp是rt t ...

  5. rt_thread nano GD32F407移植

    rt_thread nano GD32F407移植 文章目录 rt_thread nano GD32F407移植 1.简介 2.RT-Thread Nano移植 移植目结构 移植步骤 添加文件 屏蔽中 ...

  6. RT Thread利用STM32CUBEMX和RT Thread studio来创建模板工程

    (1)RT Thread利用STM32CUBEMX来创建模板工程 1.参考文档: 基于 CubeMX 移植 RT-Thread Nano:RT-Thread 文档中心 注意:串口2必须使能异步模式(启 ...

  7. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  8. rt thread 使用FAL遇到fal_init() undefined reference

    rt thread FAL 0.5版,之前有没有不知道,遇到一个坑. 在main.cpp里面已经 #include <fal.h> fal_init() 编译报错,说 fal_init() ...

  9. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

最新文章

  1. SpringBatch学习一个Demo项目
  2. python3 打印对象的全部属性
  3. UA MATH566 统计理论7 一个例子:推导T检验
  4. 【Tools】git提示“warning: LF will be replaced by CRLF”的解决办法
  5. Xcode7 UI自动化测试详解 带demo UITests
  6. Win10 UWP开发中的重复性静态UI绘制小技巧 1
  7. 大学计算机上机实验指导与测试pdf,4大学计算机基础上机实验指导与习题--习题.pdf...
  8. Erik Dietrich:二十年的编程,教会我的五件事!
  9. VMware虚拟机中ubuntu的磁盘怎么扩容
  10. linux重启mysql的命令行_LINUX重启MYSQL的命令
  11. java executor spring_java - Spring TaskExecutor实现 - 堆栈内存溢出
  12. 新媒体营销渠道大盘点
  13. 缩放指数型线性单元(SELU)
  14. C语言常见问题(7):Remove this redundant cast
  15. 嵌入式系统移植课笔记1(学通)
  16. VS1005 HiRes 高清播放器方案
  17. 【JUC源码专题】Striped64 核心源码分析(JDK8)
  18. Linux命令-按照与使用(15)终端登陆前欢迎界面设置
  19. CAN/CANFD总线基础培训
  20. 前端的岗位以及初步了解

热门文章

  1. Openwrt_Widora: 一种定点FFT计算方法的实现
  2. Google排名不是简单的网页优化
  3. 显著性检测- HC模型
  4. 技术分享|交互设计七大定律(上篇)
  5. linux不能创建共享文件夹
  6. python编程—回文数判断
  7. Linux基础学习之Day7-6-Mount 挂载详解
  8. [数值计算-9]:一元非线性函数求导数(数值微分)- 解析法与迭代法Python法代码示例
  9. Word doc文件在未到英文单词末尾换行
  10. vue3组合式写法在方法中出发点击事件