新葡京网址网站建设,宁波网站设计相信荣胜网络,网站上的广告位图片怎么做呢,苏州网站建设公司找哪家0 开发环境
STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支
1 STM32CubeMX创建工程 如果有自己的工程#xff0c;直接从LiteOS源码获取开始 关于STM32CubeMX的安装#xff0c;看我另一篇博客STM32CubeMX安装 工程配置
创建新工程 选择芯片【STM32F…0 开发环境
STM32CubeMX(HAL库)keil 5正点原子探索者STM32F4ZET6LiteOS-develop分支
1 STM32CubeMX创建工程 如果有自己的工程直接从LiteOS源码获取开始 关于STM32CubeMX的安装看我另一篇博客STM32CubeMX安装 工程配置
创建新工程 选择芯片【STM32F407ZET6】(根据自己的板子选)然后双击该芯片进入配置页面 RCC配置时钟信号均来自外部晶振 SYS配置 GPIO配置 GPIO这里配置PF9因为我的开发板上这个引脚接的是LED灯 这里根据原理图设置默认高电平推挽输出命名为LED0 系统时钟设置 生成工程
设置工程名选择存放位置 选择工程文件夹格式【Advanced/Basic】这里选择了Advanced不勾选后面的框 二者的区别 选择编译器【MDK】版本默认即可
)
这个界面的其他内容默认即可在Code Generator界面设置内容如下图
)
点击GENERATE CODE生成工程 测试工程
在keil中打开编译运行无错误、无警告表示创建成功 2 LiteOS源码获取
从官网Gitee仓库获取develop分支LiteOS: Huawei LiteOS开源代码官方仓库但是官方这个版本里面文件好像有变动没有移植成功我就找了野火提供的LiteOS源码使用这个成功移植下载地址LiteOS-STM32移植文件这里提供的不是完全的仓库代码只提供了移植所需要的文件
3 移植
在刚才创建的工程目录下创建LiteOS文件夹将刚才下载的文件里面的四个文件夹拉到里面 arch文件夹 需要添加的文件都在arch\arm\arm-m路径下 使用keil在Groups中添加LiteOS/arch分组 添加具体文件如下所示 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文件夹
在Groups中添加LiteOS/kernel分组添加具体文件如下所示【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.cOS_CONFIG文件夹
创建LiteOS/config分组只添加target_config.h文件 cmsis
创建LiteOS/cmsis分组只添加tcmsis_liteos.c文件 添加头文件路径 ../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/include5 文件内容调整
target_config 下面所以操作均在target_config.h中进行 芯片型号这里要根据你的开发板型号进行更改 BOARD_SRAM_START_ADDR定义内存的起始地址内存是 RAM运行内存STM32 的 RAM起始地址是 0x20000000。如果不知道 RAM 的起始地址可以在工程中查看 BOARD_SRAM_SIZE_KB定义芯片 RAM 的大小根据对应的芯片进行修改比如STM32F103ZET6 的 RAM 是 64KB那么 BOARD_SRAM_SIZE_KB 可以定义为不超过64K当然一般不能定义到那么大的因为工程本身也是使用了一些内存的系统可管理的内存大小就要小一点根据需要进行调整即可。 stm32f4xx it.c
这个文件需要根据不同的板子来找一般都是stm32f?xx it.c【?是芯片型号】
屏蔽掉PendSV_Handler和SysTick_Handler 在设置里面勾选Use MicroLIB 6 测试移植
编译运行没有错误但是有7个警告这警告都是文件最后一行未换行没有影响 编写代码进行测试将下面的代码替换整个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 */
编译下载等LED0闪烁 恭喜你移植LiteOS成功 移植成功代码模板STM32F4移植LiteOS模板文件