HC32F460 RT-Thread Nano版移植

news/2024/11/8 0:37:39/
最近项目需要使用华大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完成移植。

在这里插入图片描述


http://www.ppmy.cn/news/719649.html

相关文章

HC32L110(一) HC32L110 芯片介绍和Win10下DAP-Link, ST-Link, J-Link方式的烧录

目录 HC32L110(一) HC32L110芯片介绍和Win10下的烧录HC32L110(二) HC32L110在Ubuntu下的烧录HC32L110(三) HC32L110的GCC工具链和VSCode开发环境HC32L110(四) HC32L110的startup启动文件和ld连接脚本HC32L110(五) Ubuntu20.04 VSCode的Debug环境配置 前言 这个系列介绍一个比…

74HC595级联电路编程篇(三)

前面两篇文章已详细分析过74HC595的工作原理,接下来讲下用stm32去驱动两片74HC595控制16个LED实现流水灯效果。 这篇的代码是用IO模拟74HC595时序驱动的,下一篇文章,我们介绍下如何用SPI来驱动。直接贴上代码分析,代码很简单&…

RaspberryPi 4B 使用超声波传感器 HC-SR04 进行距离检测

由于超声波指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制,并且在测量…

超声波(HC-SR04)

超声波(HC-SR04) 1、 2、工作流程 ①单片机引脚触发Trig测距,给至少10us的高电平 ②模块自动发送8个40khz的方波,自动检测是否有信号返回 ③有信号返回,通过IO口输出高电平,并单片机ji’shu’an2高电平的…

关于两个HC05通讯的实际操作流程

市场上HC05模块有好几种,一般都是带有按键的。像下边这种(6只引脚的)(这个是从优信电子那搞过来的,他的模块的按键有点问题,不用摁照样能进入AT模式) 要使模块之间交互数据,必须要能…

74HC595实验

74HC595实验 实验现象 利用74HC595芯片实现LED流水灯的效果 理论学习 实现穿行数据转换为并行数据的控制模式 原理图 代码编写 #define latchpin 8 #define clockpin 12 #define datapin 11 //定义三个引脚 unsigned char table[8] {0x01,0x02,0x04,0x08,0x10,0x20,0x40…

hc sr04流程图_超声波测距模块工作原理_HC-SR04模块详解

超声波测距模块有好多种类型,目前比较常用的有URM37超声波传感器默认是232接口,可以调为TTL接口,URM05大功率超声波传感器测试距离能到10米,算是目前来说测试距离比较远的一款了,另外还有比较常用的国外的几款SRF系列的超声波模块,目前的超声波模块精度能到1cm。本文主要…

hc 05 蓝牙c语言程序,ATK-HC05 运用在STM32平台上的HC05蓝牙通信代码用C语言编写 - 下载 - 搜珍网...

1,ATK-HC05蓝牙串口模块/1,ATK-HC05蓝牙串口模块原理图/ATK-HC05-V11_SCH.pdf 1,ATK-HC05蓝牙串口模块/1,ATK-HC05蓝牙串口模块原理图/封装库/99SE/ATK-HC05-V1.3_PCB.lib 1,ATK-HC05蓝牙串口模块/1,ATK-HC…