STM32CubeMX HAL库+STM32F407+uCOS-III移植

STM32CubeMX HAL库+STM32F407+uC/OS-III移植详细过程

前言

参考资料:

  • 官网资料:https://micrium.atlassian.net/wiki/spaces/osiiidoc/overview
  • 正点原子STM32F4 UCOS开发手册_v3.0.pdf
  • [野火]uCOS-III内核实现与应用开发实战指南https://doc.embedfire.com/rtos/ucos/zh/latest/application/porting_to_stm32.html

1. 获取uC/OS-III源码

获取源码可以通过官网下载:

https://weston-embedded.com/micrium-examples

同时可以在我的博客中下载(版本为3.04):

https://download.csdn.net/download/fhdghfuiahfsdifbs/18909773

源码目录如下:
STM32CubeMX HAL库+STM32F407+uCOS-III移植_第1张图片

2. 建立工程

使用STM32CubeMX自动生成,选择STM32F407VE芯片

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第2张图片

配置时钟为168MHz

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第3张图片

配置RCC、SYS

配置两个GPIO(LED)以及USART1,用于测试uC/OS-III移植效果

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第4张图片

设置并生成工程代码
STM32CubeMX HAL库+STM32F407+uCOS-III移植_第5张图片

生成后的代码框架如下:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第6张图片

3. 裸机代码测试

移植uC/OS-III之前先确保裸机代码能够正常运行

在main函数的循环中添加如下代码,其目的是使两个LED灯闪烁

HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_RESET);
HAL_Delay(500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_6|GPIO_PIN_7, GPIO_PIN_SET);
HAL_Delay(500);

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第7张图片

编译下载之后,能够看到LED闪烁,说明裸机程序运行没有问题,接下来开始移植uC/OS-III

4. 移植uC/OS-III

4.1 新建相关文件夹

源码目录如下:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第8张图片

首先在工程目录下新建一个文件夹,命名为UCOSIII,然后将uC-CPU、uC-LIB、uCOS-III三个文件夹复制到UCOSIII文件夹下,复制后的工程文件如下:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第9张图片

然后在UCOSIII文件夹下新建两个文件夹,分别为uCOS-CONFIG、uCOS-BSP,如下所示:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第10张图片

4.2 向uCOS-CONFIG中添加文件

UCOSIII 3.04\Micrium\Software\EvalBoards\ST\STM32F429II-SK\uCOS-III下的8个文件复制到uCOS-CONFIG中,如图所示:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第11张图片

4.3 向uCOS-BSP中添加文件

UCOSIII 3.04\Micrium\Software\EvalBoards\ST\STM32F429II-SK\BSP下的bsp.c和bsp.h复制到uCOS-BSP中,如图所示:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第12张图片

4.4 向工程中添加分组

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第13张图片

4.5 向各个分组添加文件

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第14张图片

注意:uCOS_LIB组当中,还需要添加\UCOSIII\uC-LIB\Ports\ARM-Cortex-M4\RealView目录下的lib_mem_a.asm文件

向各个分组添加文件后,还需要添加相应的头文件路径,如图所示:

STM32CubeMX HAL库+STM32F407+uCOS-III移植_第15张图片

4.6 修改文件
4.6.1 修改bsp.h和bsp.c

将bsp.c文件修改为如下内容:

#ifndef  __BSP_H__
#define  __BSP_H__

#include "stm32f4xx_hal.h"

void BSP_Init(void);

#endif

将bsp.c文件修改为如下内容:

#include "includes.h"

#define  BSP_REG_DEM_CR                           (*(CPU_REG32 *)0xE000EDFC)	//DEMCR寄存器
#define  BSP_REG_DWT_CR                           (*(CPU_REG32 *)0xE0001000)    //DWT控制寄存器
#define  BSP_REG_DWT_CYCCNT                       (*(CPU_REG32 *)0xE0001004)	//DWT时钟计数寄存器	
#define  BSP_REG_DBGMCU_CR                        (*(CPU_REG32 *)0xE0042004)

//DEMCR寄存器的第24位,如果要使用DWT ETM ITM和TPIU的话DEMCR寄存器的第24位置1
#define  BSP_BIT_DEM_CR_TRCENA                    DEF_BIT_24			

//DWTCR寄存器的第0位,当为1的时候使能CYCCNT计数器,使用CYCCNT之前应当先初始化
#define  BSP_BIT_DWT_CR_CYCCNTENA                 DEF_BIT_00

/*
*********************************************************************************************************
*                                            BSP_CPU_ClkFreq()
* Description : Read CPU registers to determine the CPU clock frequency of the chip.
* Argument(s) : none.
* Return(s)   : The CPU clock frequency, in Hz.
* Caller(s)   : Application.
* Note(s)     : none.
*********************************************************************************************************
*/
CPU_INT32U  BSP_CPU_ClkFreq (void)
{
   
    return HAL_RCC_GetHCLKFreq();//返回HCLK时钟频率
}

/*
*********************************************************************************************************
*                                            BSP_Tick_Init()
* Description : BSP_Tick_Init.
* Argument(s) : none.
* Return(s)   : none.
* Note(s)     : none.
*********************************************************************************************************
*/
void BSP_Tick_Init(void)
{
   
	CPU_INT32U cpu_clk_freq;
	CPU_INT32U cnts;
	cpu_clk_freq = BSP_CPU_ClkFreq();
	
	#if(OS_VERSION>=3000u)
		cnts = cpu_clk_freq/(CPU_INT32U)OSCfg_TickRate_Hz;
	#else
		cnts = cpu_clk_freq/(CPU_INT32U)OS_TICKS_PER_SEC;
	#endif
	OS_CPU_SysTickInit(cnts);
}

void BSP_Init(void)
{
   
	BSP_Tick_Init();//此函数会初始化OS系统时钟,如果移植了正点原子的delay文件,则与主函数中的delay_init(168)只需要调用一个即可
}

#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{
   
    CPU_INT32U  cpu_clk_freq_hz;

    BSP_REG_DEM_CR     |= (CPU_INT32U)BSP_BIT_DEM_CR_TRCENA; 	//使用DWT  /* Enable Cortex-M4's DWT CYCCNT reg.*/
    BSP_REG_DWT_CYCCNT  = (CPU_INT32U)0u;					 	//初始化CYCCNT寄存器
    BSP_REG_DWT_CR     |= (CPU_INT32U)BSP_BIT_DWT_CR_CYCCNTENA;	//开启CYCCNT

    cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    CPU_TS_TmrFreqSet(cpu_clk_freq_hz

你可能感兴趣的:(uC/OS-III,stm32)