STM32基于HAL库移植UCOS-III教程

uCOS-IIISTM32 开源的 RTOS 之一,对于嵌入式开发具备着重要的作用。在这里演示一下如何基于 STM32CubeMX 移植 uCOS-III

参考博客如下:

STM32F103C8T6移植uC/OS-III基于HAL库超完整详细过程
STM32移植ucos-III并实现多任务——HAL_stm32多任务并行处理

移植过程基本如下图所示:
image.png

建立工程

在这里使用 STM32CubeMX 建立工程,使用的芯片为:STM32F103ZET6。具体过程不多赘述,比较基础。
根据原理图和工程目的分配和配置串口即可。
image.png ^5056a9


下载 uCOS-III 源码

下载 uCOS-III 源码需要到官网进行下载:
官网
UCOSIII从官网(2021)下载

下载后的源码如图所示:
image.png


复制相关文件

我们在第一步中建立的工程中的文件夹内新建一个 uCOSIII 文件夹,并将下载的源码 中的 uC-CPU uC-LIB uCOS-III 复制到这个文件夹中。
image.png
然后我们在工程的 Core/Src 文件家中新建一个 OS 文件夹。
image.png
将下载的源码 uCOSIII\Micrium\Software\EvalBoards\Micrium\uC-Eval-STM32F107\uCOS-III 中的 9 个文件复制到前面建立的 OS 文件中
image.png

[!note]
app.c 文件其实也可以不用复制进去

然后再在 OS 文件夹中再新建三个空白文件:bsp.c bsp.h app.h

[!note]
如果前面没复制 app.c 这个文件的话,此时就可以不用创建 app.h 这个文件

image.png


配置 Keil 相关路径

打开 Keil 后添加如下分组,可根据个人喜好进行修改。
image.png
我们在 bsp 分组中添加我们自己在 Core/Src/OS 下创建的 bsp.cbsp.h 文件
image.png
uCOSIII-CPU 分组中添加 uCOSIII/uC-CPUARM-Cortex-M3/RealView 下的文件
image.png
uCOSIII_LIB 分组中添加 uCOSIII/uC-LIB 下的文件:
image.png
uCOSIII_Ports 分组下添加 uCOSIII/uCOS-III/Ports/ARM-Cortex-M3/Generic/RealView/ 下的文件
image.png
uCOSIII_Source 分组下添加 uCOSIII/uCOS-III/Source 下的文件:
image.png
OS_cfg 分组中添加 Core/Src/OS 文件夹下的文件:
image.png

[!note]
这里如果前面创建了 app.c app.h 文件就将其添加到 OS_cfg 分组内,如果不创建就如上图所示即可。

到此为止所有文件都已经添加完成了,现在配置一下头文件路径。我们将前面文件的路径添加到 Keil 里。
image.png


修改文件

在开始编程之前,我们还需要修改一下文件源代码。
首先是启动文件,我们需要修改如下的地方:

PendSV_Handler ---> OS_CPU_PendSVHandler
SysTick_Handler ---> OS_CPU_SysTickHandler

image.png
image.png

然后修改 lib_cfg.h 文件,将 ENABLE 修改为 DISABLE
image.png

然后再修改 app_cfg.h,如图所示的进行修改
image.png
image.png

然后再修改 includes.h,如果前面没创建 app.c app.h 文件的话就可以不用包括 app.h 的头文件
image.png

然后是将下列代码复制到 bsp.h 中:

// bsp.h
#ifndef  __BSP_H__
#define  __BSP_H__

#include "stm32f1xx_hal.h"

void BSP_Init(void);

#endif

再将下列代码复制到 bsp.c 中:

// bsp.c
#include "includes.h"

#define  DWT_CR      *(CPU_REG32 *)0xE0001000
#define  DWT_CYCCNT  *(CPU_REG32 *)0xE0001004
#define  DEM_CR      *(CPU_REG32 *)0xE000EDFC
#define  DBGMCU_CR   *(CPU_REG32 *)0xE0042004

#define  DEM_CR_TRCENA                   (1 << 24)
#define  DWT_CR_CYCCNTENA                (1 <<  0)

CPU_INT32U  BSP_CPU_ClkFreq (void)
{
    return HAL_RCC_GetHCLKFreq();
}

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();
	MX_GPIO_Init();
}


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


    DEM_CR         |= (CPU_INT32U)DEM_CR_TRCENA;                /* Enable Cortex-M3's DWT CYCCNT reg.                   */
    DWT_CYCCNT      = (CPU_INT32U)0u;
    DWT_CR         |= (CPU_INT32U)DWT_CR_CYCCNTENA;

    cpu_clk_freq_hz = BSP_CPU_ClkFreq();
    CPU_TS_TmrFreqSet(cpu_clk_freq_hz);
}
#endif


#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{
    return ((CPU_TS_TMR)DWT_CYCCNT);
}
#endif


#if (CPU_CFG_TS_32_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS32_to_uSec (CPU_TS32  ts_cnts)
{
	CPU_INT64U  ts_us;
  CPU_INT64U  fclk_freq;

 
  fclk_freq = BSP_CPU_ClkFreq();
  ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);

  return (ts_us);
}
#endif
 
 
#if (CPU_CFG_TS_64_EN == DEF_ENABLED)
CPU_INT64U  CPU_TS64_to_uSec (CPU_TS64  ts_cnts)
{
	CPU_INT64U  ts_us;
	CPU_INT64U  fclk_freq;


  fclk_freq = BSP_CPU_ClkFreq();
  ts_us     = ts_cnts / (fclk_freq / DEF_TIME_NBR_uS_PER_SEC);
	
  return (ts_us);
}
#endif

然后在 main.c 中添加 includes.h 的头文件引用后就可以开始编程了!

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值