华大HC32F460系列搭建FreeRTOS
0x10 准备工作下列的清单中描述了笔者发现了的需要使用的库与相关的资料
华大的最新ddl库
FreeRTOS最新库文件
华大最新的IDE支持包(如果需要IDE)
用户手册
0x11 华大的ddl库
华大的ddl库直接可以在官网1上面找到,截止当前完成的时间,ddl最新版本号为1.3.1。
而IDE支持包和用户手册都可以在下载界面下找到。
ddl库内在当前版本下有一个小BUG,可以直接修改,这个bug将在下文中提到。
0x21 FreeRTOS最新的文件
官网2上的最新库使用即可,但是需要注意的是,当前的FreeRTOS并没有使用到华大相关MCU的example,所以我们需要自己实现一个example。
0x20 环境配置笔者使用了keil进行配置。在IAR下的配置也是大同小异。可以参考实现。keil内集成了HC相关的部分调试相关的配置。IAR则需要在9+的版本下才会有很多的HC相关支持。
随后的实现仅需要选中CMSIS即可。这里可以选择只用lib而不用src,因为关于FPU的部分开关需要依赖的部分文件这里可能没有。
随后在内部的编译器设置下选择相关的头文件环境。这里的参数可能根据各种情况下的实际配置改变,还是需要因地制宜的添加或者是删除。
随后需要增加相关的标签
HC32F46x,USE_DEVICE_DRIVER_LIB,ARM_MATH_CM4
这里就是HC32F460相关的参数。其中ARM_MATH_CM4是正常情况下不需要使用的,但是如果使用了DSP相关的库源码,则需要使用这个宏标签。
到这里,基本上就可以完成当前的编译。
0x30 FreeRTOS加入
首先将其解压并放置在规定的位置。
这里需要注意的是,必须要将portable下的文件按照当前需要的型号与核心进行修改,笔者这里留下了M4相关的参数。
这里的FreeRTOSConfig.h的相关参数可以使用同为M4的STM32F407的芯片example,下面的笔记描述了一个已经实现了基本的实现的结构:
#define configUSE_PREEMPTION 1
#define configUSE_IDLE_HOOK 0
#define configUSE_TICK_HOOK 0
#define configCPU_CLOCK_HZ ( SystemCoreClock )
#define configTICK_RATE_HZ ( ( TickType_t ) 10*1000 ) //200,000k/10k = 20,000k
#define configMAX_PRIORITIES ( 5 )
#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 130 )
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 75 * 1024 ) )
#define configMAX_TASK_NAME_LEN ( 10 )
#define configUSE_TRACE_FACILITY 1
#define configUSE_16_BIT_TICKS 0
#define configIDLE_SHOULD_YIELD 1
#define configUSE_MUTEXES 1
#define configQUEUE_REGISTRY_SIZE 8
#define configCHECK_FOR_STACK_OVERFLOW0
#define configUSE_RECURSIVE_MUTEXES 1
#define configUSE_MALLOC_FAILED_HOOK 0
#define configUSE_APPLICATION_TASK_TAG 1
#define configUSE_COUNTING_SEMAPHORES 1
#define configGENERATE_RUN_TIME_STATS 0
随后在最后的几行宏定义修改完成:
/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names. */
#define vPortSVCHandler SVC_Handler//SVC_IrqHandler
#define xPortPendSVHandler PendSV_Handler//PendSV_IrqHandler
#define xPortSysTickHandler SysTick_Handler//SysTick_IrqHandler
这里还需要将hc32f46x_interrupts.c内部的相关接口去除。否则直接使用SVC_IrqHandler接口替换掉vPortSVCHandler也可以。
0x40 一个小问题
在合并两者的时候,笔者发现了一个小问题。修改完成后在这里稍稍记录一下:
在hc32f46x_clk.h中
/**
*******************************************************************************
** \briefThe system clock source.
**
******************************************************************************/
typedef enum en_clk_sys_source
{
ClkSysSrcHRC = 0u, ///< The system clock source is HRC.
ClkSysSrcMRC = 1u, ///< The system clock source is MRC.
ClkSysSrcLRC = 2u, ///< The system clock source is LRC.
ClkSysSrcXTAL = 3u, ///< The system clock source is XTAL.
ClkSysSrcXTAL32 = 4u, ///< The system clock source is XTAL32.
CLKSysSrcMPLL = 5u, ///< The system clock source is MPLL.
}en_clk_sys_source_t;
CLKSysSrcMPLL修改和上述的风格并未一致,可以选择修改成ClkSysSrcMPLL即可。
页:
[1]