基于STM32使用HAL库手把手移植华为LiteOS系统

基于STM32使用HAL库手把手移植华为LiteOS系统



(一)说明

本章节实验工程源码下载:https://github.com/wowyyy/STM32_LiteOS_Demogit

华为LiteOS内核源码下载地址:https://github.com/LiteOS/LiteOS,选择develop分支下载。github

在这里插入图片描述


(二)裸机工程建立

使用STM32CubeMX建立裸机工程:less

这里我是用的芯片是STM32F103RBT6,时钟主频为72MHz,配置时钟树:函数

在这里插入图片描述

配置调试串口1:测试

在这里插入图片描述

配置两个LED灯:
在这里插入图片描述
url

因为LiteOS使用系统嘀嗒定时器看成心跳,HAL库也使用了这个定时器,因此咱们将HAL库的定时器改成其余,这里我该为了定时器4:spa

在这里插入图片描述
配置中断,这里我选择了组4,也就是所有为抢占优先级:
.net

在这里插入图片描述
取消掉如下两个中断服务函数的生成,由于ListOS已经实现了这两个函数:
3d

在这里插入图片描述
最后输出工程便可!
调试


(三)移植LiteOS

下载解压LiteOS,咱们须要的文件有:

  • LiteOS-develop\arch\arm\arm-m\cortex-m3\keil\los_dispatch_keil.S
    (注:由于我使用的是STM32F1系列是M3内核因此选择cortex-m3文件夹下的,若是是F4系列那么就是M4内核应该选择cortex-m4文件夹下的文件)
  • LiteOS-develop\arch\arm\arm-m\src目录下所有源文件
  • LiteOS-develop\kernel\base\core目录下所有源文件
  • LiteOS-develop\kernel\base\ipc目录下所有源文件
  • LiteOS-develop\kernel\base\mem\bestfit_little目录下所有源文件
  • LiteOS-develop\kernel\base\mem\common目录下所有源文件
  • LiteOS-develop\kernel\base\mem\membox目录下所有源文件
  • LiteOS-develop\kernel\base\misc目录下所有源文件
  • LiteOS-develop\kernel\base\om目录下所有源文件
  • LiteOS-develop\kernel\base\core目录下所有源文件
  • LiteOS-develop\kernel\base\core目录下所有源文件
  • LiteOS\kernel\extended\tickless目录下所有源文件
  • LiteOS\kernel\los_init.c
  • 拷贝示例工程下的OS_CONFIG目录下的头文件 (此目录是在示例工程LiteOS-develop\targets\STM32F103VET6_NB_GCC\OS_CONFIG中)

在Keil中添加源码,以下图所示:

在这里插入图片描述

添加头文件包含,以下图所示:
在这里插入图片描述

  • 修改OS_CONFIG/target_config.h文件,找到BOARD_SRAM_SIZE_KB宏,此宏定义了SRAM(内存)的大小,STM32F103RB是20K,因此此处改成20。

  • 修改宏LOSCFG_PLATFORM_HWI为NO。此宏控制着系统中断的管理方式,为NO表示系统中断不被系统管理,为YES表示系统接管中断。STM32的中断管理已经很好了不须要系统接管。


(四)系统运行测试

这里建立了三个任务:

  • led1灯间隔1m反转电平
  • led2灯间隔300ms反转电平
  • print每隔2s串口打印任务
int fputc(int ch, FILE* fp)
{ 
	while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != SET);
	huart1.Instance->DR = ch & 0XFF;
	return ch;
}

void* led1_task(UINT32 arg)
{ 
	for(;;)
	{ 
		HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
		LOS_TaskDelay(1000);
	}
}

void* led2_task(UINT32 arg)
{ 
	for(;;)
	{ 
		HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
		LOS_TaskDelay(300);
	}
}

void* print_task(UINT32 arg)
{ 
	for(;;)
	{ 
		PRINTK("Hello LiteOS !\r\n");
		LOS_TaskDelay(2000);
	}
}

UINT32 led1_task_handle;
UINT32 led2_task_handle;
UINT32 print_task_handle;

int main(void)
{ 
	TSK_INIT_PARAM_S task_param;
	
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART1_UART_Init();
		
	LOS_KernelInit();
	
	task_param.pcName = "led1_task";
	task_param.pfnTaskEntry = led1_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&led1_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create led1 task failed!\r\n");
	}
	
	task_param.pcName = "led2_task";
	task_param.pfnTaskEntry = led2_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&led2_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create led2 task failed!\r\n");
	}
	
	task_param.pcName = "print_task";
	task_param.pfnTaskEntry = print_task;
	task_param.uwStackSize = 512;
	task_param.usTaskPrio = 4;
	if(LOS_TaskCreate(&print_task_handle, &task_param) != LOS_OK)
	{ 
		PRINT_ERR("create print task failed!\r\n");
	}
	
	LOS_Start();
	
    for(;;)
	{ 
	}
}

ends…

相关文章
相关标签/搜索