二、从Micrium官网下载UCOSIII源码并添加文件到工程中

1. 到Micrium官网下载ucos源码程序(MDK版)

  • micrium网址:https://www.micrium.com/
  • 选择STM32F4xx
  • 下载示例工程
  • 此处需要账号,大家自己注册一下
  • 下载下来目录如下图所示:

2.在STM32CubeMX生成的工程中添加UCOS-III文件夹

2.1 在UCOS-III目录下创建文件夹,放置UCOSIII源码
  • 在STM32CubeMX工程STM32F429_UCOSIII_DEMO\UCOS-III\目录下创建 BSP 和 CONFIG目录
2.1.1 BSP目录填充

复制Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\BSP目录下的bsp.c 和 bsp.h到STM32CubeMX工程STM32F429_UCOSIII_DEMO\UCOS-III\BSP

2.1.2 CONFIG目录填充

复制Micrium_STM32F429II-SK_OS3\Micrium\Examples\ST\STM32F429II-SK\OS3目录下的8个文件到STM32CubeMX工程STM32F429_UCOSIII_DEMO\UCOS-III\CONFIG

2.1.3 复制源码到UCOS-III目录

复制\Micrium_STM32F429II-SK_OS3\Micrium\Software目录下的uC-CPU、uC-LIB、uCOS-III三个文件夹到STM32CubeMX工程STM32F429_UCOSIII_DEMO\UCOS-III目录下

2.1.4 文件添加完成

3.在MDK5工程中添加UCOS-III目录下的文件

3.1 在工程中添加分组文件夹

3.2 添加文件到分组
3.2.1 UC/OS_III-BSP
  • UCOS-III\BSP下所有文件添加到分组:UC/OS_III-BSP
3.2.2 UC/OS_III-CONFIG
  • UCOS-III\CONFIG下所有文件添加到分组:UC/OS_III-CONFIG
3.2.3 UC/OS_III-CPU
  • UCOS-III\uC-CPUUCOS-III\uC-CPU\ARM-Cortex-M4\RealView下所有文件添加到分组:UC/OS_III-CPU
3.2.4 UC/OS_III-LIB
  • UCOS-III\uC-LIBUCOS-III\uC-LIB\Ports\ARM-Cortex-M4\RealView下所有文件添加到分组:UC/OS_III-LIB
3.2.5 UC/OS_III-SOURCE
  • UCOS-III\uCOS-III\Source下所有文件添加到分组:UC/OS_III-SOURCE
3.2.6 UC/OS_III-PORTS
  • UCOS-III\uCOS-III\Ports\ARM-Cortex-M4\Generic\RealView下所有文件添加到分组:UC/OS_III-PORTS
3.3 添加依赖的头文件路径
  • 点击此处进行设置
  • 如图依次添加以下七个路径
  • 点击OK,编译,此处会报错,是正常的 我们还要修改几个文件

4.STM32CubeMX工程文件修改

4.1 启动文件修改

将启动文件中的PendSV_HandlerSysTick_Handler 修改为OS_CPU_PendSVHandlerOS_CPU_SysTickHandler

  • 修改前:

  • 修改后:

增加FPU运算支持

  • 修改前:
  • 修改后:
4.2 bsp.c 和 bsp.h修改
  • 将bsp.c的内容替换成以下代码
#define   BSP_MODULE
#include  <bsp.h>
#include  <os.h>#define  BSP_REG_DEM_CR                           (*(CPU_REG32 *)0xE000EDFC)
#define  BSP_REG_DWT_CR                           (*(CPU_REG32 *)0xE0001000)
#define  BSP_REG_DWT_CYCCNT                       (*(CPU_REG32 *)0xE0001004)
#define  BSP_REG_DBGMCU_CR                        (*(CPU_REG32 *)0xE0042004)#define  BSP_BIT_DEM_CR_TRCENA                    DEF_BIT_24
#define  BSP_BIT_DWT_CR_CYCCNTENA                 DEF_BIT_00CPU_INT32U  BSP_CPU_ClkFreq (void)
{return HAL_RCC_GetHCLKFreq();
}#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
void  CPU_TS_TmrInit (void)
{CPU_INT32U  fclk_freq;fclk_freq = BSP_CPU_ClkFreq();BSP_REG_DEM_CR     |= (CPU_INT32U)BSP_BIT_DEM_CR_TRCENA;    /* Enable Cortex-M4's DWT CYCCNT reg.                   */BSP_REG_DWT_CYCCNT  = (CPU_INT32U)0u;BSP_REG_DWT_CR     |= (CPU_INT32U)BSP_BIT_DWT_CR_CYCCNTENA;CPU_TS_TmrFreqSet((CPU_TS_TMR_FREQ)fclk_freq);
}
#endif#if (CPU_CFG_TS_TMR_EN == DEF_ENABLED)
CPU_TS_TMR  CPU_TS_TmrRd (void)
{CPU_TS_TMR  ts_tmr_cnts;ts_tmr_cnts = (CPU_TS_TMR)BSP_REG_DWT_CYCCNT;return (ts_tmr_cnts);
}
#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
  • 将bsp.h的内容替换成以下代码
#ifndef  BSP_PRESENT
#define  BSP_PRESENT#ifdef   BSP_MODULE
#define  BSP_EXT
#else
#define  BSP_EXT  extern
#endif#include <stdio.h>
#include <stdarg.h>
#include <cpu.h>
#include <cpu_core.h>
#include <lib_def.h>
#include <lib_ascii.h>//如果修改芯片,需要修改此包含的库文件名
#include "stm32l4xx_hal.h"#endif
4.3 再次编译,编译通过!

5.在main.c中创建usart1和led任务,测试是否移植成功

5.1 引入ucos头文件
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "includes.h"
/* USER CODE END Includes */
5.2 完整main.c代码
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:*                        opensource.org/licenses/BSD-3-Clause********************************************************************************/
/* USER CODE END Header *//* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "includes.h"
/* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD *//* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
//注意这里任务优先级从3开始,1和2分别被
//时钟节拍任务和定时器任务占用
//任务优先级
#define START_TASK_PRIO  3
//任务堆栈大小
#define START_STK_SIZE 512
//任务控制块
OS_TCB StartTaskTCB;
//任务堆栈
CPU_STK START_TASK_STK[START_STK_SIZE];
//任务函数
void start_task(void *p_arg);//任务优先级
#define LDE_TASK_PRIO  4
//任务堆栈大小
#define LDE_STK_SIZE 256
//任务控制块
OS_TCB LedTaskTCB;
//任务堆栈
CPU_STK LDE_TASK_STK[LDE_STK_SIZE];
//任务函数
void led_task(void *p_arg);//任务优先级
#define USART1_TASK_PRIO  4
//任务堆栈大小
#define USART1_STK_SIZE 256
//任务控制块
OS_TCB USART1TaskTCB;
//任务堆栈
CPU_STK USART1_TASK_STK[USART1_STK_SIZE];
//任务函数
void usart1_task(void *p_arg);
/* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */OS_ERR err;CPU_SR_ALLOC();/* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 *//*注意 硬件初始化放这里 不能正常运行 要要放到开始任务里面初始化*/OSInit(&err);     //初始化UCOSIIIOS_CRITICAL_ENTER();    //进入临界区//创建开始任务OSTaskCreate((OS_TCB*  )&StartTaskTCB, //任务控制块(CPU_CHAR* )"start task", //任务名字(OS_TASK_PTR )start_task, //任务函数(void* )0, //传递给函数的参数(OS_PRIO  )START_TASK_PRIO, //任务优先级(CPU_STK* )&START_TASK_STK[0], //任务堆栈基地址(CPU_STK_SIZE )START_STK_SIZE/10, //任务堆栈深度限位(CPU_STK_SIZE )START_STK_SIZE,  //任务堆栈大小(OS_MSG_QTY )0, //任务内部消息队列能接收的最大消息数目//为0时禁止接收消息(OS_TICK )0, //当使能时间片轮转时的时间片长度//为0时为默认长度(void* )0,        //用户补充存储区(OS_OPT  )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR* )&err);  //存放该函数错误时候的返回值OS_CRITICAL_EXIT();  //退出临界区OSStart(&err); //开启UCOSIII/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */
//  while (1)
//  {/* USER CODE END WHILE *//* USER CODE BEGIN 3 */
//
//      HAL_UART_Transmit(&huart1,TxData,20,0xffff);
//      HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_10);
//      HAL_Delay(500);
//
//  }/* USER CODE END 3 */
}/*** @brief System Clock Configuration* @retval None*/
void SystemClock_Config(void)
{RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};/** Configure the main internal regulator output voltage */__HAL_RCC_PWR_CLK_ENABLE();__HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1);/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI;RCC_OscInitStruct.HSIState = RCC_HSI_ON;RCC_OscInitStruct.HSICalibrationValue = RCC_HSICALIBRATION_DEFAULT;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSI;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 180;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Activate the Over-Drive mode */if (HAL_PWREx_EnableOverDrive() != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK){Error_Handler();}
}/* USER CODE BEGIN 4 */
//开始任务
void start_task(void *p_arg)
{OS_ERR err;CPU_SR_ALLOC();p_arg = p_arg;CPU_Init();#if OS_CFG_STAT_TASK_EN > 0uOSStatTaskCPUUsageInit(&err); //统计任务#endif#ifdef CPU_CFG_INT_DIS_MEAS_EN  //如果使能了测量中断关闭时间CPU_IntDisMeasMaxCurReset();#endif#if OS_CFG_SCHED_ROUND_ROBIN_EN //当使用时间片轮转的时候//使能时间片轮转段杜功能呢,时间片长度为1个系统时钟节拍,即1*5=5msOSSchedRoundRobinCfg(DEF_ENABLED,1,&err);#endifOS_CRITICAL_ENTER(); //临界区保护//创建LED_D2 任务OSTaskCreate((OS_TCB* )&LedTaskTCB,(CPU_CHAR* )"led_task",(OS_TASK_PTR )led_task,(void* )0,(OS_PRIO  )LDE_TASK_PRIO,(CPU_STK* )&LDE_TASK_STK[0], (CPU_STK_SIZE )LDE_STK_SIZE/10,(CPU_STK_SIZE )LDE_STK_SIZE, (OS_MSG_QTY )0,(OS_TICK )0,(void* )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR* )&err); OSTaskCreate((OS_TCB* )&USART1TaskTCB,(CPU_CHAR* )"USART1_task",(OS_TASK_PTR )usart1_task,(void* )0,(OS_PRIO  )USART1_TASK_PRIO,(CPU_STK* )&USART1_TASK_STK[0], (CPU_STK_SIZE )USART1_STK_SIZE/10,(CPU_STK_SIZE )USART1_STK_SIZE, (OS_MSG_QTY )0,(OS_TICK )0,(void* )0,(OS_OPT )OS_OPT_TASK_STK_CHK|OS_OPT_TASK_STK_CLR,(OS_ERR* )&err); OS_TaskSuspend((OS_TCB*)&StartTaskTCB,&err); //挂起开始任务OS_CRITICAL_EXIT();  //退出临界区
}//LDE任务函数
void led_task(void *p_arg)
{OS_ERR err;p_arg = p_arg;while(1){HAL_GPIO_TogglePin(GPIOH, GPIO_PIN_10);OSTimeDly(200, OS_OPT_TIME_DLY, &err);}
}//USART1任务函数
void usart1_task(void *p_arg)
{OS_ERR err;uint8_t TxData[20]= "usart1 transmit!\n";p_arg = p_arg;while(1){HAL_UART_Transmit(&huart1,TxData,20,0xffff);OSTimeDly(500, OS_OPT_TIME_DLY, &err);}
}
/* USER CODE END 4 *//*** @brief  This function is executed in case of error occurrence.* @retval None*/
void Error_Handler(void)
{/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */
}#ifdef  USE_FULL_ASSERT
/*** @brief  Reports the name of the source file and the source line number*         where the assert_param error has occurred.* @param  file: pointer to the source file name* @param  line: assert_param error line source number* @retval None*/
void assert_failed(uint8_t *file, uint32_t line)
{ /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
5.3 编译,下载,观察现象

  • LED正常闪烁,串口正常打印数据
移植成功!
  • 备注:我尝试过在潘多拉开发板STM32L475VET6移植UCOSIII,步骤一致;
  • 移植完成后可使用STM32CubeMX再次对工程进行配置,不会影响UCOSIII工程;
  • 源码下载:https://download.csdn.net/download/u014779536/12116472

STM32CubeMX创建F429/L475 HAL库工程并移植UCOSIII (二)(文末附源码)相关推荐

  1. Cubemx与HAL库系列教程|系统时钟配置详解及源码分析

    STM32时钟系统简介 STM32种类繁多,时钟系统也不尽相同,但基本的还是大差不差,今日小飞哥就F1系列的MCU简单聊一聊STM32的时钟系统 1.时钟种类介绍: 先来看一看时钟树图,包含了整个系统 ...

  2. 基于IAR-stm32裸板工程,完美移植RT-Thread Nano系统(附源码)

    开发环境:Window 10 64bit 开发工具:IAR Embedded Workbench 硬件:stm32f103c8t6 准备工作: 下载一份IAR的stm32裸机工程(包含标准库),参考博 ...

  3. 运用selenium库写淘宝抢购详解【3】(文末附带源码)

    #每日一更[3] 今天讲的是用selenium库写一个淘宝抢购程序,10.19亲测可用 1.淘宝抢购的思路和上一篇的思路类似,通过打开浏览器筛选浏览器内的标签,并点击来实现自动化 #下面来想一下思路 ...

  4. 基于Matlab创建跟踪场景、模拟目标运动和模拟雷达检测仿真(附源码)

    目录 一.模拟移动对象及其属性 1.1 创建具有移动目标的跟踪方案 1.2 可视化并运行跟踪方案 二.使用雷达传感器生成检测 2.1 对雷达传感器进行建模并模拟其检测 2.2 创建塔和雷达 2.3 为 ...

  5. Manim文档及源码笔记-CE文档-示例库3使用Manim绘图

    Manim文档及源码笔记-CE文档-示例库3使用Manim绘图 参考原文: Manim Community Edition Example Gallery 前言 笔记随想: 暂未发现官方中文版,自己实 ...

  6. keil添加hal库_Stm32CubeMX生成的hal库工程加入标准库的库函数的方法

    本帖最后由 seawind1986 于 2017-4-7 22:30 编辑 第一步用Stm32CubeMX创建一个工程并生成Keil MDK的工程,不多赘述. 001.jpg (127.92 KB, ...

  7. STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片

    STM32CubeMX | 基于STM32使用HAL库硬件SPI驱动WK2124一拖四SPI转四路串口芯片 STM32基础工程生成 首先使用STM32CUBEMX生成STM32的基础工程,配置时钟到7 ...

  8. STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC

    STM32CubeMX | 基于STM32使用HAL库实现USB组合设备之多路CDC 本博客完整代码下载地址:https://download.csdn.net/download/qq15347150 ...

  9. STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例)

    STM32CubeMX | STM32 F1系列HAL库低功耗STOP和STANDBY模式唤醒(RTC时钟唤醒+外部中断唤醒示例) 目录 STM32CubeMX | STM32 F1系列HAL库低功耗 ...

  10. STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程

    STM32G070RBT6基于STM32CubeMX创建ADC DMA多通道采样工程 -

最新文章

  1. cordova 安装ssl证书_cordova环境配置(android)
  2. 开始Windows Embedded Compact 7的第一个项目——虚拟机上的CEPC
  3. js高级编程_这位设计师用Processing把创意编程玩到了极致!
  4. suse linux 创建用户密码,suse linux上创建用户方式
  5. sliverlight3 学习 2, 布局
  6. Python下socket通信
  7. mysql 密码sa_重置MySQL root密码
  8. 扫描死链接的工具xenu
  9. 谷歌人机图像识别接口
  10. css less 不要作用到子对象_CSS的亲儿子,居然不是Less??
  11. 银行制定快捷支付限额原因
  12. 2007.5 同航驾驶培训公司网站
  13. cpu消耗 pytorch_PyTorch测试模型执行计算耗费的时间
  14. ppi 各代iphone_从iPhone 6到iPhone X:居然隐藏了这么多秘密
  15. 微信 html自动复制功能,怎样在网页中一键复制拷贝微信号跳转到微信
  16. 从零玩转HTML5+CSS3项目实战-跟着李南江学编程
  17. html单击图片效果显示,html点击文字显示图片
  18. 什么是数据库,什么是SQL,什么是MySQL
  19. 单片机是什么?在大学里学习单片机,对以后的就业会有帮助吗
  20. 2022-7-6 Leetcode 977.有序数组的平方

热门文章

  1. 招商证券港股通业务评测答案
  2. 灵剑问道服务器维护到几点,问道手游2020年12月31日维护公告_问道手游12月31日更新了什么_玩游戏网...
  3. C++标准模板(STL)- 算法 (std::adjacent_find)
  4. Google搜索技巧语法
  5. bootstrap黑色酷炫IT行业个人博客模板
  6. server r2 系统更新文件清理
  7. EVE LOM正式官宣杨洋成为品牌代言人
  8. 白帽专访丨大家好,我是阿杨,一个全职挖洞选手。
  9. 音视频数据处理入门:AAC音频码流解析
  10. USACO-Section3.2 Feed Ratios【克莱默法则】