Liteos移植_STM32_HAL库

0 开发环境

  • STM32CubeMX(HAL库)
  • keil 5
  • 正点原子探索者STM32F4ZET6
  • LiteOS-develop分支

1 STM32CubeMX创建工程

如果有自己的工程,直接从LiteOS源码获取开始

关于STM32CubeMX的安装,看我另一篇博客STM32CubeMX安装

工程配置

  1. 创建新工程

在这里插入图片描述

  1. 选择芯片【STM32F407ZET6】(根据自己的板子选),然后双击该芯片,进入配置页面

在这里插入图片描述

  1. RCC配置,时钟信号均来自外部晶振

在这里插入图片描述

  1. SYS配置

在这里插入图片描述

  1. GPIO配置

GPIO这里配置PF9,因为我的开发板上这个引脚接的是LED灯

这里根据原理图,设置默认高电平,推挽输出,命名为LED0

在这里插入图片描述

  1. 系统时钟设置

在这里插入图片描述

生成工程

  1. 设置工程名,选择存放位置

在这里插入图片描述

  1. 选择工程文件夹格式,【Advanced/Basic】,这里选择了Advanced,不勾选后面的框

在这里插入图片描述

二者的区别

在这里插入图片描述

  1. 选择编译器,【MDK】,版本默认即可

在这里插入图片描述)

  1. 这个界面的其他内容默认即可
  2. 在Code Generator界面,设置内容如下图

在这里插入图片描述)

  1. 点击GENERATE CODE,生成工程

在这里插入图片描述

测试工程

在keil中打开,编译运行,无错误、无警告,表示创建成功

在这里插入图片描述

2 LiteOS源码获取

  • 从官网Gitee仓库获取develop分支LiteOS: Huawei LiteOS开源代码官方仓库
  • 但是官方这个版本里面文件好像有变动,没有移植成功😖,我就找了野火提供的LiteOS源码,使用这个成功移植🎉
  • 下载地址:LiteOS-STM32移植文件
  • 这里提供的不是完全的仓库代码,只提供了移植所需要的文件

3 移植

在刚才创建的工程目录下创建LiteOS文件夹,将刚才下载的文件里面的四个文件夹拉到里面

在这里插入图片描述

arch文件夹

需要添加的文件都在arch\arm\arm-m路径下

  1. 使用keil,在Groups中添加LiteOS/arch分组

在这里插入图片描述

  1. 添加具体文件如下所示

在这里插入图片描述

arch\arm\arm-m\src 目录下的全部文件los_hw.clos_hw_tick.clos_hwi.c
arch\arm\arm-m\cortex-m4\keil 目录下的:(注:根据芯片内核选cortex-m文件夹)los_dispatch_keil.S

在添加文件时,需要将文件类型选择为所以类型

在这里插入图片描述

kernel文件夹

  1. 在Groups中添加LiteOS/kernel分组
  2. 添加具体文件如下所示【21个】

在这里插入图片描述

kernel\base\core 文件夹下全部.c文件los_priqueue.clos_swtmr.clos_sys.clos_task.clos_tick.clos_timeslice.c
kernel\base\ipc  文件夹下全部.c文件los_event.clos_mux.clos_queue.clos_sem.c
kernel\base\mem\bestfit_little 文件夹下全部.c文件los_heap.clos_memory.clos_membox.clos_memcheck.c
kernel\base\mem\common 文件夹下全部.c文件los_memstat.clos_slab.clos_slabmem.c	
kernel\base\misc 文件夹下全部.c文件los_misc.c
kernel\base\om 文件夹下全部.c文件los_err.c
kernel\extended\tickless 文件夹下全部.c文件los_tickless.c
kernel 文件夹下的 los_init.c

OS_CONFIG文件夹

  1. 创建LiteOS/config分组
  2. 只添加target_config.h文件

在这里插入图片描述

cmsis

  1. 创建LiteOS/cmsis分组
  2. 只添加tcmsis_liteos.c文件

在这里插入图片描述

在这里插入图片描述

添加头文件路径

![1222160759818.png&pos_id=img-3pSiVLZ9-1703237952742)

../LiteOS/arch/arm/arm-m/include
../LiteOS/kernel/include
../LiteOS/kernel/base/include
../LiteOS/kernel/extended/include
../LiteOS/OS_CONFIG
../LiteOS/cmsis
../LiteOS/cmsis/1.0
../LiteOS/cmsis/2.0
../LiteOS/cmsis/include

在这里插入图片描述

5 文件内容调整

target_config

下面所以操作均在target_config.h中进行

  1. 芯片型号,这里要根据你的开发板型号进行更改

在这里插入图片描述

  1. BOARD_SRAM_START_ADDR定义内存的起始地址,内存是 RAM(运行)内存,STM32 的 RAM起始地址是 0x20000000。如果不知道 RAM 的起始地址,可以在工程中查看

在这里插入图片描述

  1. BOARD_SRAM_SIZE_KB定义芯片 RAM 的大小,根据对应的芯片进行修改,比如STM32F103ZET6 的 RAM 是 64KB,那么 BOARD_SRAM_SIZE_KB 可以定义为不超过64K,当然一般不能定义到那么大的,因为工程本身也是使用了一些内存的,系统可管理的内存大小就要小一点,根据需要进行调整即可。

在这里插入图片描述

stm32f4xx it.c

这个文件需要根据不同的板子来找,一般都是stm32f?xx it.c【?是芯片型号】

屏蔽掉PendSV_HandlerSysTick_Handler

在这里插入图片描述

在设置里面勾选Use MicroLIB

在这里插入图片描述

6 测试移植

  1. 编译运行,没有错误,但是有7个警告,这警告都是文件最后一行未换行,没有影响

在这里插入图片描述

  1. 编写代码进行测试,将下面的代码替换整个main.c
/* USER CODE BEGIN Header */
/********************************************************************************* @file           : main.c* @brief          : Main program body******************************************************************************* @attention** Copyright (c) 2023 STMicroelectronics.* All rights reserved.** This software is licensed under terms that can be found in the LICENSE file* in the root directory of this software component.* If no LICENSE file comes with this software, it is provided AS-IS.********************************************************************************/
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "gpio.h"/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "los_sys.h"
#include "los_task.ph"
/* 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 *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
static UINT32 AppTaskCreate(void);
static UINT32 Creat_Test1_Task(void);static void Test1_Task(void);
/* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
UINT32 Test1_Task_Handle; // 定义任务 ID 变量/* USER CODE END 0 *//*** @brief  The application entry point.* @retval int*/
int main(void)
{/* USER CODE BEGIN 1 */UINT32 uwRet = LOS_OK;  //定义一个任务创建的返回值,默认为创建成功/* 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();/* USER CODE BEGIN 2 */uwRet = LOS_KernelInit();if (uwRet != LOS_OK){printf("LiteOS 核心初始化失败!失败代码0x%X\n",uwRet);return LOS_NOK;}uwRet = AppTaskCreate();if (uwRet != LOS_OK){printf("AppTaskCreate创建任务失败!失败代码0x%X\n",uwRet);return LOS_NOK;}/* 开启LiteOS任务调度 */LOS_Start();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* 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 RCC Oscillators according to the specified parameters* in the RCC_OscInitTypeDef structure.*/RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 8;RCC_OscInitStruct.PLL.PLLN = 336;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2;RCC_OscInitStruct.PLL.PLLQ = 4;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB buses 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 *//******************************************************************** @ 函数名  : AppTaskCreate* @ 功能说明: 任务创建,为了方便管理,所有的任务创建函数都可以放在这个函数里面* @ 参数    : 无  * @ 返回值  : 无*************************************************************/
static UINT32 AppTaskCreate(void)
{/* 定义一个返回类型变量,初始化为LOS_OK */UINT32 uwRet = LOS_OK;uwRet = Creat_Test1_Task();if (uwRet != LOS_OK){printf("Test1_Task任务创建失败!失败代码0x%X\n",uwRet);return uwRet;}return LOS_OK;
}// 创建任务
static UINT32 Creat_Test1_Task()
{//定义一个创建任务的返回类型,初始化为创建成功的返回值UINT32 uwRet = LOS_OK;			//定义一个用于创建任务的参数结构体TSK_INIT_PARAM_S task_init_param;	task_init_param.usTaskPrio = 3;	/* 任务优先级,数值越小,优先级越高 */task_init_param.pcName = "Test1_Task";/* 任务名 */task_init_param.pfnTaskEntry = (TSK_ENTRY_FUNC)Test1_Task;/* 任务函数入口 */task_init_param.uwStackSize = 1024;		/* 堆栈大小 */uwRet = LOS_TaskCreate(&Test1_Task_Handle, &task_init_param);/* 创建任务 */return uwRet;
}// 创建任务具体实现
static void Test1_Task(void)
{/* 任务都是一个无限循环,不能返回 */while(1){HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET);LOS_TaskDelay(500);HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET);LOS_TaskDelay(500);}
}
/* 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 */__disable_irq();while (1){}/* 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,ex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */
  1. 编译下载,等LED0闪烁

在这里插入图片描述

恭喜你移植LiteOS成功!🎉🎉🎉

移植成功代码模板:STM32F4移植LiteOS模板文件

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/240524.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第一次记录QPSK,BSPK,MPSK,QAM—MATLAB实现

最近有偶然的机会学习了一次QPSK防止以后忘记又得找资料,这里就详细的记录一下 基于 QPSK 的通信系统如图 1 所示,QPSK 调制是目前最常用的一种卫星数字和数 字集群信号调制方式,它具有较高的频谱利用率、较强的抗干扰性、在电路上实现也较为…

蓝牙物联网智能家居安防检测系统解决方案

随着科学技术的发展,我们的生活方式正在进行着翻天覆地的变化。互联网技术的实现推动了物联网新模式的出现改变着我们生活,使我们的社会生产生活变得更加的便利与人性化。借此现如今我们的生活方式更是向智能家居方向所发展,这一课题正在被相…

电脑组件整理(持续更新...)

1、*芯片 CPU(承担着负责的运算); 量大阵营: AMD | Intel i5 12400F 6核12线 7nm -- 1189元 r7 5700x 8核16线 7 nm -- 1500元; ARM采用的是RISC精简指令集计算、 主要应用于移动终端之中,类如手机&#xff0c…

了解树和学习二叉树

1.树 1.1 概念 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看 起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 注意:树形结构中…

Kafka核心参数(带完善)

客户端 api Kafka提供了以下两套客户端API HighLevel(重点)LowLevel HighLevel API封装了kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。 而LowLevel API则需要客户端自己管理Kafka的运行细节,Partition&#x…

Linux-Keepalived(VRRP协议)高可用集群搭建

Linux-Keepalived(VRRP协议)高可用集群搭建 一、VRRP简介1.1 什么是VRRP?1.2 keepalived是什么?1.3 keepalived工作原理 二、实操配置过程2.1 试验模型2.2. Keepalived监控和维护VRRP集群的步骤2.2.1 安装keepalived2.2.2 配置kee…

sql_lab之sqli中的head头注入,less18

报错注入中的head注入(less-18) 1.输入用户名和密码123 123显示登录错误 2.输入用户名和密码123’ 123显示登录错误 则证明不是普通报错注入,因为有用户名和密码框,如果不是普通报错注入则尝试head注入 3.用burp进行爆破&#x…

【已解决】在使用frp内网穿透访问VUE项目提示:Invalid Host/Origin header 解决方案

项目配置 在使用frp作为内网穿透的时候,配置了多端口穿透(也是第一次配置frp多端口),端口配置如下: 8079:vue项目的管理系统 8080:vue项目的前台系统 8082:普通的web项目 更高frp相关问题 &#x1f4…

4.3 C++对象模型和this指针

4.3 C对象模型和this指针 4.3.1 成员变量和成员函数分开存储 在C中&#xff0c;类内的成员变量和成员函数分开存储 只有非静态成员变量才属于类的对象上 #include <iostream>class Person { public:Person() {mA 0;} //非静态成员变量占对象空间int mA;//静态成员变量…

数据预处理:多重共线性_检测和解决办法

文章目录 1.多重共线性简介&#xff08;Collinearity and Multicollinearity&#xff09;1.1 多重共线性的后果1.2 处理多重共线性问题的方法 2. 设置2.1 导入库2.2 数据集特征波士顿房价BMI 数据集 2.3 导入数据 3. 相关矩阵3.1 聚类图 4. 方差膨胀因子4.1 两种多重共线性4.2 …

外卖托管运营专家邦火策划怎么样,为您的餐厅带来了什么不同?

在当今激烈竞争的餐饮市场&#xff0c;外卖托管运营正逐渐成为许多餐厅提升业绩的有效手段。邦火策划以其专业的服务和独特的策略&#xff0c;成为外卖托管运营领域的专家。让我们一同探究&#xff0c;选择邦火策划为您的餐厅带来了怎样的不同。 在邦火策划的引领下&#xff0…

【UML】第10篇 类图(属性、操作和接口)(2/3)

目录 3.3 类的属性&#xff08;Attribute&#xff09; 3.3.1 可见性&#xff08;Visibility&#xff09; 3.3.2 属性的名称 3.3.3 数据类型 3.3.4 初始值 3.3.5 属性字符串 3.4 类的操作&#xff08;Operations&#xff09; 3.4.1 参数表 3.4.2 返回类型 3.5 类的职责…

基于JavaWeb的个人健康信息管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本个人健康信息管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据…

data数据响应式

data数据响应式 所有在实例上挂载的属性&#xff0c;都可以在视图中直接使用 data中的数据&#xff0c;是经过“数据劫持”的&#xff0c;是“响应式数据” 响应式&#xff1a;修改数据&#xff0c;视图会自动更新 MV原理&#xff1a;其中一条线的原理&#xff0c;data响应式的…

Nessus详细安装-windows (保姆级教程)

Nessus描述 Nessus 是一款广泛使用的网络漏洞扫描工具。它由 Tenable Network Security 公司开发&#xff0c;旨在帮助组织评估其计算机系统和网络的安全性。 Nessus 可以执行自动化的漏洞扫描&#xff0c;通过扫描目标系统、识别和评估可能存在的安全漏洞和弱点。它可以检测…

DRF从入门到精通三(反序列化数据校验源码分析、断言Assert、DRF之请求、响应)

文章目录 一、反序列化数据校验源码分析二、断言Assert三、DRF之请求、响应Request类和Response类请求中的Request 能够解析前端传入的编码格式响应中的Response能够响应的编码格式 一、反序列化数据校验源码分析 反序列化数据校验&#xff0c;校验顺序为&#xff1a;先校验字段…

Go后端开发 -- Golang的语言特性

Go后端开发 – Golang的语言特性 文章目录 Go后端开发 -- Golang的语言特性一、Golang的优势1.部署极其简单&#xff1a;2.静态语言3.语言层面的并发4.强大的标准库5.简单易学6.运行效率对比 二、Golang的适用领域1.应用领域2.明星产品 三、Golang的不足 一、Golang的优势 1.部…

共享购:消费前沿的领导者

在当今这个信息化、互联网高速发展的时代&#xff0c;商业模式也在不断地创新和变革。共享购模式作为一种新型的商业模式&#xff0c;正逐渐受到广泛的关注和追捧。本文将深入探讨共享购模式的核心理念、优势以及如何应用在实际商业场景中&#xff0c;为读者揭示这一模式的巨大…

计算机组成原理综合5

A 按照题意&#xff0c;程序P执行的时钟周期数为1000080%11000020%1028000&#xff0c;程序P的平均CPI为28000/100002.8&#xff0c;计算机主频为1GHz&#xff0c;CPU执行时间为28000/(1G/s)28μs。 B A 符号位为1 首先将0.4375转化为二进制&#xff0c;0.250.1250.06250.43…

nodejs+vue+ElementUi资源互助共享平台的设计

后台&#xff1a;管理员功能有个人中心&#xff0c;用户管理&#xff0c;卖家管理&#xff0c;咨询师管理&#xff0c;萌宝信息管理&#xff0c;幼儿知识管理&#xff0c;保姆推荐管理&#xff0c;音频资源管理&#xff0c;二手商品管理&#xff0c;商品分类管理&#xff0c;资…