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.hqwc.cn/news/295021.html

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

相关文章

SwiftUI 趣谈之:绝不可能(Never)的 View!

概览 SwiftUI 的出现极大的解放了秃头码农们的生产力。SwiftUI 中众多原生和自定义视图对于我们创建精彩撩人的 App 功不可没! 不过,倘若小伙伴们略微留意过 SwiftUI 框架头文件里的源代码,就会发现里面嵌有一些奇怪 Never 类型&#xff0c…

一文掌握分布式锁:Mysql/Redis/Zookeeper实现

目录 一、项目准备spring项目数据库 二、传统锁演示超卖现象使用JVM锁解决超卖解决方案JVM失效场景 使用一个SQL解决超卖使用mysql悲观锁解决超卖使用mysql乐观锁解决超卖四种锁比较Redis乐观锁集成Redis超卖现象redis乐观锁解决超卖 三、分布式锁概述四、Redis分布式锁实现方案…

PyQt6 利用Pyinstaller打包发布程序

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计53条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

物联网产品设计,聊聊设备OTA的升级

物联网产品设计部分的OTA设备固件是一个非常重要的部分,能够实现升级用户服务、保障系统安全等功能。 在迅速变化和发展的物联网市场,新的产品需求不断涌现,因此对于智能硬件设备的更新需求就变得空前高涨,设备不再像传统设备一样…

数据分析基础之《numpy(5)—合并与分割》

了解即可,用panads 一、作用 实现数据的切分和合并,将数据进行切分合并处理 二、合并 1、numpy.hstack 水平拼接 # hstack 水平拼接 a np.array((1,2,3)) b np.array((2,3,4)) np.hstack((a, b))a np.array([[1], [2], [3]]) b np.array([[2], […

20231222给NanoPC-T4(RK3399)开发板的适配原厂Android10的挖掘机方案并跑通AP6398SV

20231222给NanoPC-T4(RK3399)开发板的适配原厂Android10的挖掘机方案并跑通AP6398SV 1、简略步骤:rootrootrootroot-X99-Turbo:~/3TB/3399-android10$ cat Rockchip_Android10.0_SDK_Release.tar.gz0* > Rockchip_Android10.0_SDK_Release.tar.gz rootrootrootro…

Spring Boot3通过GraalVM生成exe执行文件

一、安装GraalVM 1、官网:https://www.graalvm.org/downloads/ 2、配置环境变量 2.1、环境变量必须使用JAVA_HOME,否则会出现问题 2.2、在系统变量配置Path,%JAVA_HOME%\bin,注意必须放在顶部第一位 2.3、配置jdk的环境变量,在P…

高级算法设计与分析(四) -- 贪心算法

系列文章目录 高级算法设计与分析(一) -- 算法引论 高级算法设计与分析(二) -- 递归与分治策略 高级算法设计与分析(三) -- 动态规划 高级算法设计与分析(四) -- 贪心算法 高级…

python/matlab将数组以彩色图片的形式展现

python: plt.imshow可以将数组的值以图片的形式展示出来,数组的值对应着不同的颜色深浅。比如一个2X2的数组,图片里的小方块也会有2X2个。 案例1结果: 案例1代码: import numpy as np import matplotlib.pyplot as pltx np.ar…

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

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

k8s启动docker容器Error: Could not find or load main class ${start-class}报错

前行提要: 今天部署采集点服务(docker项目)发现报这个错误。 提出假设: 1,配置文件错误(工程需要配置的东西比较多) 之后开始一一排查,发现配置有问题,但是不是这个错误…

2023的AI工具集合,google和claude被禁用解决和edge的copilot

一、前言 AI工具集合 首先,OpenAI的ChatGPT以其深度学习模型和强大的语言处理能力引领了AI聊天机器人的潮流。自2022年11月30日上线以来,它创下了100万用户的注册记录,并被广泛应用于全球财富500强公司。为了实现盈利,OpenAI发布…