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.rhkb.cn/news/224550.html

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

相关文章

ElasticSearch入门介绍和实战

目录 1.ElasticSearch简介 1.1 ElasticSearch(简称ES) 1.2 ElasticSearch与Lucene的关系 1.3 哪些公司在使用Elasticsearch 1.4 ES vs Solr比较 1.4.1 ES vs Solr 检索速度 2. Lucene全文检索框架 2.1 什么是全文检索 2.2 分词原理之倒排索引…

JavaScript进阶(事件+获取元素+操作元素)

目录 事件基础 事件组成 执行事件的步骤 获取元素 根据ID获取元素 根据标签名获取元素 获取ol中的小li 类选择器(html5新增的I9以上支持) 获取body和html 操作元素 innerText和innerHtml 表单标签 样式属性操作 操作元素总结 事件基础 事…

设计模式--桥接模式

实验9:桥接模式 本次实验属于模仿型实验,通过本次实验学生将掌握以下内容: 1、理解桥接模式的动机,掌握该模式的结构; 2、能够利用桥接模式解决实际问题。 [实验任务]:两个维度的桥接模式 用桥接模式…

MySql的mvcc原理

目录 一、什么是mvcc? 二、什么是当前读,快照读? 当前读 快照读 三、mvcc实现原理 版本链 undo日志 Undo log 的用途 Read View(读视图) Read View几个属性 五、RR、RC级别下生成时机 一、什么是mvcc? mvcc全称Multi-Version Concurrency Control,即…

华为HCIA认证H12-811题库新增

801、[单选题]178/832、在系统视图下键入什么命令可以切换到用户视图? A quit B souter C system-view D user-view 试题答案:A 试题解析:在系统视图下键入quit命令退出到用户视图。因此答案选A。 802、[单选题]“网络管理员在三层交换机上创建了V…

17个常用经典数据可视化图表与冷门图表

数据可视化是创建信息图形表示的过程。随着可视化技术的飞速发展,可以利用强大的可视化工具选择合适的数据可视化图表来展示数据。以下专业人士都应该知道的一些最重要的数据可视化图表。 常见数据可视化图表 饼图 饼图是最常见和最基本的数据可视化图表之一。饼图…

虚拟机的下载、安装(模拟出服务器)

下载 vmware workstation(收费的虚拟机) 下载vbox 网址:Oracle VM VirtualBox(免费的虚拟机) 以下选择一个下载即可,建议下载vbox,因为是免费的。安装的时候默认下一步即可(路径最好…

elasticsearch-py 8.x的一些优势

​ 早在 2022 年 2 月,当 Elasticsearch 8.0 发布时,Python 客户端也发布了 8.0 版本。它是对 7.x 客户端的部分重写,并带有许多不错的功能(如下所述),但也带有弃用警告和重大更改。今天,客户端的 7.17 版本仍然相对流行,每月下载量超过 100 万次,占 8.x 下载量的 ~50…

了解OAuth 2.0以及社交登录认证授权流程

1.前言 目前在写一个电商项目,可以通过手机号进行注册登录,为了方便用户使用本平台的系统,引入社交登录功能,这里使用的是gittee。 2.OAuth 2.0介绍 当谈到网络安全和身份验证时,OAuth 2.0(开放授权 2.0&a…

迪文屏开发保姆级教程5—表盘时钟和文本RTC显示

这篇文章要讲啥事呢? 本篇文章主要介绍了在DGBUS平台上使用表盘时钟和文本时钟RTC显示功能的方法。 文哥悄悄话: 官方开发指南PDF:(不方便下载的私聊我发给你) https://download.csdn.net/download/qq_21370051/8864…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来,2023的步伐也将远去。而博主的系列文章,也将从今天起,越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面,无论使用什么框架、组件或工具,皆可拿来用之。 那么…

Docker介绍、常用命令与操作

Docker介绍、常用命令与操作 学习前言为什么要学习DockerDocker里的必要基础概念常用命令与操作1、基础操作a、查看docker相关信息b、启动或者关闭docker 2、容器操作a、启动一个镜像i、后台运行ii、前台运行 b、容器运行情况查看c、日志查看d、容器删除 3、镜像操作a、镜像拉取…

“一篇长文教你进行全方位的使用appium“

随着移动应用的日益普及,移动应用的测试成为了软件开发的重要组成部分。Python,作为一种易于学习,功能强大的编程语言,特别适合进行这种测试。本文将详细介绍如何使用Python进行APP测试,并附带一个实例。 Python 和 A…

超分辨数据集:Set5 Set14 BSD100 Urban100 Manga109

DIV2K数据集官网上很好找到,但是网上流传的Set5 14 BSD100,Urban100 Manga109都是私人进行处理过的版本,各个处理方式都不同,为了统一方式写了这篇文章。 官方的DIV2K x2、x3、x4的LR图片使用下面matlab代码生成(已经经过测试最后…

Linux构建NFS远程共享存储和ftp配置

NFS架构 NFS介绍 文件系统级别共享(是NAS存储) --------- 已经做好了格式化,可以直接用。 速度慢比如:nfs,samba NFS:Network File System 网络文件系统,NFS 和其他文件系统一样,是在 Linux …

智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于卷积优化算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.卷积优化算法4.实验参数设定5.算法结果6.…

2022第十二届PostgreSQL中国技术大会-核心PPT资料下载

一、峰会简介 本次大会以“突破•进化•共赢 —— 安全可靠,共建与机遇”为主题,助力中国数据库基础软件可掌控、可研究、可发展、可生产,并推动数据库生态的繁荣与发展。大会为数据库从业者、数据库相关企业、数据库行业及整个IT产业带来崭…

OpenAI科学家Hyung Won Chung演讲精华版

文章目录 第一个观点:涌现第二个观点:如何扩大规模1、标记化2、嵌入3、计算4、评估(损失函数)5、反向传播 最近从Google跳槽到OpenAI的AI科学家 Hyung Won Chung 比较拗口,我就简称尚哥了 他最近做了一个技术演讲 …

STM32MP157D-DK1开发板Qt镜像构建

上篇介绍了STM32MP57-DK1开发板官方系统的烧录。那个系统包含Linux系统的基础功能,如果要进行Qt开发,还需要重新构建带有Qt功能的镜像 本篇就来介绍如何构建带有Qt功能的系统镜像,并在开发板中烧录构建的镜像。 1 Distribution包的构建 ST…

mySQL事务与存储引擎

目录 mySQL事务 1.事务的概念 2.事务的ACID特点 3.多客户端同时访问一个表时,出现的一致性问题 4.事务的隔离级别 5.事务的隔离级别作用范围 查询全局事务隔离级别 设置全局事务隔离级别 ​编辑查询会话事务隔离级别 设置会话事务隔离级别 6.事务控制语句…