HT32F52352系列

该系列的Holtek单片机是一款基于ARM Cortex-M0+处理器内核的32-bit高性能低功耗单片机。Cortex-M0+是把嵌套向量中断控制器(NVIC)、系统节拍定时器(Systick Timer)和先进的调试支持紧紧结合在一起的新一代处理器内核。
该系列单片机可借助Flash加速器工作在高达48Mhz的频率下,以获得较大的频率。他提供128KB的嵌入式Flash存储器用作程序/数据存储,16KB的嵌入式SRAM存储器用作系统操作和应用程序运作。此系列单片机具有多种外设,如ADC、IIC、USART、UART、SPI、IIS、GPTM、MCTM、SCL、CRC-16/32、RTC、WDT、PDMA、EBI、USB2.0 FS、SW-DP(串行线调试端口)等。在唤醒延迟和功耗方面,几种省电模式提供了具有灵活性的较大优化方案,此举在低功耗应用方面尤为值得考虑。
以上这些特性使得该系列单片机可以广泛地适用于各种应用,如大型家用电器应用控制、电源监控、报警系统、消费类产品、手持式设备、数据记录应用、马达控制等。
官网:https://www.holtek.com.cn/web/guest/home
实时操作系统移植
RT-Thread Nano
RT-Thread Nano简介
RT-Thread Nano是一个极简版的硬实时内核,他是由C语言开发,采用面向对象的编程思维,具有良好的代码风格,是一款可裁剪的、抢占式实时多任务的RTOS。其内存资源占用极小,功能包括任务处理、软件定时器、信号量、邮箱和实时调度等相对完整的实时操作系统特性。适用于家电、消费类电子、医疗设备、工控等领域大量使用的32位ARM入门级MCU的场合。

图1.1 RT-Thread软件框图
上图是RT-Thread Nano的软件框图,包含支持的CPU架构与内核源码,还有可拆卸的FinSH组建。
支持架构:ARM:Cortex M0/M3/M4/M7等、RISC-V及其他。
功能:线程管理、线程间同步与通信、时钟管理、中断管理、内存管理。
移植步骤
1.准备一份裸机源码工程

2.下载RT-Thread Nano源码
RT-Thread官网下载网址:https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-nano/nano-port-iar/an0040-nano-port-iar

3.添加RT-Thread Nano到工程
(1)在裸机工程下新建文件夹rtthread文件夹
(2)把Nano源码中的include、libcpu、src文件夹复制到裸机工程新建的rtthread文件夹下

(3)把Nano源码文件夹rtthread/bsp 中的board.c和rtconfig.h两个文件复制到裸机工程新建的rtthread文件夹下

(4)打开裸机工程,新建rtthread文件夹,并在分组下添加源码:
添加工程下rtthread/src/文件夹所有文件到工程。
添加工程下rtthread/libcpu/文件夹中相应内核的CPU移植文件及上下文切换文件:cpuport.c以及context_iar.S。
添加rtthread/文件夹下的board.c。

4.添加头文件路径

5.适配RT-Thread Nano
中断和异常处理:
屏蔽工程中的异常处理函数HardFault_Handler()和悬挂处理函数PendSV_Handler()。

系统时钟配置:
需要在board.c中实现系统时钟配置。
解决报错问题:
需添加RTE-Components.h

/* RT-Thread config file */
#ifndef __RTTHREAD_CFG_H__
#define __RTTHREAD_CFG_H__
#include "RTE_Components.h"
#define RT_THREAD_PRIORITY_MAX 8
#define RT_TICK_PER_SECOND 1000
#define RT_ALIGN_SIZE 4
#define RT_NAME_MAX 16
#define RT_USING_COMPONENTS_INIT
#define RT_USING_USER_MAIN
#define RT_MAIN_THREAD_STACK_SIZE 612
#define RT_DEBUG
#define DBG_LEVEL DBG_LOG
//#define RT_DEBUG_INIT 1
#define RT_USING_OVERFLOW_CHECK
#define RT_USING_HOOK
#define RT_USING_IDLE_HOOK
#define RT_USING_TIMER_SOFT 1
#if RT_USING_TIMER_SOFT == 0
#undef RT_USING_TIMER_SOFT
#endif
#define RT_TIMER_THREAD_PRIO 4
#define RT_TIMER_THREAD_STACK_SIZE 1024
#define RT_TIMER_TICK_PER_SECOND 1000
#define RT_USING_SEMAPHORE
#define RT_USING_MUTEX
#define RT_USING_EVENT
#define RT_USING_MAILBOX
#define RT_USING_SIGNALS
#define RT_USING_MESSAGEQUEUE
#define RT_USING_HEAP
#define RT_USING_SMALL_MEM
#define RT_USING_TINY_SIZE
#define RT_USING_MEMPOOL
#define RT_USING_MEMHEAP
#define RT_USING_CONSOLE
#define RT_CONSOLEBUF_SIZE 128
#define RT_CONSOLE_DEVICE_NAME "uart0"
#if defined(RTE_FINSH_USING_MSH)
#define RT_USING_FINSH
#define FINSH_USING_MSH
#define FINSH_USING_MSH_ONLY
#define __FINSH_THREAD_PRIORITY 6
#define FINSH_THREAD_PRIORITY (RT_THREAD_PRIORITY_MAX / 8 * __FINSH_THREAD_PRIORITY + 1)
#define FINSH_THREAD_STACK_SIZE 600
#define FINSH_HISTORY_LINES 5
#define FINSH_USING_SYMTAB
#endif
#if defined(RTE_USING_DEVICE)
#define RT_USING_DEVICE
#endif
#endif

(1)


(2)


(3)


(4)


(5)


(6)


(7)


(8)


6.在Nano上添加UART控制台(实现打印)
实现串口初始化:


实现rt_hw_console_output:


7.在Nano上添加FinSH组件(实现命令输入)
RT-Thread FinSH是RT-Thread的命令组件(shell),提供一套供用户在命令行调用的操作接口,主要用于调试或查看系统信息。
添加FinSH源码到工程:
(1)复制Nano源码中components文件夹下的finsh文件夹到工程中。

(2)打开工程新建finsh分组,添加工程中finsh文件夹下的所有.c文件,并在工程中添加finsh文件夹的路径


(3)在rtconfig.h中使能#define RT_USING_FINSH宏定义

实现rt_hw_console_getchar
要实现FinSH组件功能:既可以打印也能输入命令进行调试,控制台已经实现了打印功能,现在还需要在board.c中对接控制台输入函数,实现字符输入:

