你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】基于STM32使用HAL库手把手移植华为LiteOS系统并使用CMSIS接口API

[复制链接]
STMCU小助手 发布时间:2022-4-10 17:17
(一)说明

RXG}G82`GNEC0X@IS50%)8M.png

(二)裸机工程创建
使用STM32CubeMX创建裸机工程:

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

20201010162340339.png

配置调试串口1:

0_DEJT9$V~S7]`8RW~KT28V.png

配置两个LED灯:

20201010162500610.png

由于LiteOS使用系统嘀嗒定时器当作心跳,HAL库也使用了这个定时器,所以我们将HAL库的定时器改为其他,这里我该为了定时器4:

4NDQ]VQ(D`8CTV~}O5U52@T.png

配置中断,这里我选择了组4,也就是全部为抢占优先级:

FU1{NKL5WM3U]JB25~JDKKI.png

取消掉以下两个中断服务函数的生成,因为ListOS已经实现了这两个函数:

20201013094123969.png

最后输出工程即可!

(三)移植LiteOS
下载解压LiteOS,文件目录如下:



文件目录说明:
arch:这个文件夹与平台有关,我们这里的平台是ARM
components:这是一些组件,例如fatfs文件系统、mqtt协议栈等
kernel:内核文件
osdepends:CMSIS的API接口,如果系统需要使用CMSIS接口,那么需要移植这里面的文件
targets:各个不同平台的示例工程

我们需要的文件有:

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\kernel\extended\tickless目录下全部源文件
LiteOS\kernel\los_init.c
拷贝示例工程下的OS_CONFIG目录下的头文件 (此目录是在示例工程LiteOS-develop\targets\STM32F103VET6_NB_GCC\OS_CONFIG中)
在Keil中添加源码,如下图所示:

CMOEEK``}`{J182)RRE.png

添加头文件包含,如下图所示:

20210707111329848.png

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

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

(四)系统运行测试

1、原始LiteOS-API测试
这里创建了三个任务:
led1灯间隔1s反转电平
led2灯间隔300ms反转电平
print每隔2s串口打印任务

  1. int fputc(int ch, FILE* fp)
  2. {
  3.         while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TXE) != SET);
  4.         huart1.Instance->DR = ch & 0XFF;
  5.         return ch;
  6. }

  7. void* led1_task(UINT32 arg)
  8. {
  9.         for(;;)
  10.         {
  11.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  12.                 LOS_TaskDelay(1000);
  13.         }
  14. }

  15. void* led2_task(UINT32 arg)
  16. {
  17.         for(;;)
  18.         {
  19.                 HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin);
  20.                 LOS_TaskDelay(300);
  21.         }
  22. }

  23. void* print_task(UINT32 arg)
  24. {
  25.         for(;;)
  26.         {
  27.                 PRINTK("Hello LiteOS !\r\n");
  28.                 LOS_TaskDelay(2000);
  29.         }
  30. }

  31. UINT32 led1_task_handle;
  32. UINT32 led2_task_handle;
  33. UINT32 print_task_handle;

  34. int main(void)
  35. {
  36.         TSK_INIT_PARAM_S task_param;
  37.         
  38.     HAL_Init();
  39.     SystemClock_Config();
  40.     MX_GPIO_Init();
  41.     MX_USART1_UART_Init();
  42.                
  43.         LOS_KernelInit();
  44.         
  45.         task_param.pcName = "led1_task";
  46.         task_param.pfnTaskEntry = led1_task;
  47.         task_param.uwStackSize = 512;
  48.         task_param.usTaskPrio = 4;
  49.         if(LOS_TaskCreate(&led1_task_handle, &task_param) != LOS_OK)
  50.         {
  51.                 PRINT_ERR("create led1 task failed!\r\n");
  52.         }
  53.         
  54.         task_param.pcName = "led2_task";
  55.         task_param.pfnTaskEntry = led2_task;
  56.         task_param.uwStackSize = 512;
  57.         task_param.usTaskPrio = 4;
  58.         if(LOS_TaskCreate(&led2_task_handle, &task_param) != LOS_OK)
  59.         {
  60.                 PRINT_ERR("create led2 task failed!\r\n");
  61.         }
  62.         
  63.         task_param.pcName = "print_task";
  64.         task_param.pfnTaskEntry = print_task;
  65.         task_param.uwStackSize = 512;
  66.         task_param.usTaskPrio = 4;
  67.         if(LOS_TaskCreate(&print_task_handle, &task_param) != LOS_OK)
  68.         {
  69.                 PRINT_ERR("create print task failed!\r\n");
  70.         }
  71.         
  72.         LOS_Start();
  73.         
  74.     for(;;)
  75.         {
  76.         }
  77. }
复制代码

2、CMSIS-API测试
由于使用CMSIS接口,那么只需要包含头文件#include "cmsis_os.h"即可:

示例代码:

  1. osThreadId_t LED0TaskHandle;
  2. const osThreadAttr_t LED0Task_attributes = {
  3.   .name = "led0task",
  4.   .priority = (osPriority_t) osPriorityNormal,
  5.   .stack_size = 128 * 4
  6. };
  7. void LED0TaskEntry(void* arg);




  8. osThreadId_t LED1TaskHandle;
  9. const osThreadAttr_t LED1Task_attributes = {
  10.   .name = "led1task",
  11.   .priority = (osPriority_t) osPriorityNormal,
  12.   .stack_size = 128 * 4
  13. };
  14. void LED1TaskEntry(void* arg);





  15. int main(void)
  16. {
  17.         HAL_Init();
  18.         SystemClock_Config();
  19.         MX_GPIO_Init();
  20.         MX_USART1_UART_Init();
  21.         
  22.         // 初始化内核
  23.         osKernelInitialize();

  24.         // 创建LED0任务
  25.         LED0TaskHandle = osThreadNew(LED0TaskEntry, NULL, &LED0Task_attributes);
  26.         
  27.         // 创建LED1任务
  28.         LED1TaskHandle = osThreadNew(LED1TaskEntry, NULL, &LED1Task_attributes);
  29.         
  30.         // 启动内核调度
  31.         osKernelStart();
  32.         
  33.         while (1)
  34.         {
  35.         }
  36. }



  37. void LED0TaskEntry(void* arg)
  38. {
  39.         for(;;)
  40.         {
  41.                 HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
  42.                 osDelay(300);
  43.         }
  44. }

  45. void LED1TaskEntry(void* arg)
  46. {
  47.         for(;;)
  48.         {
  49.                 HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
  50.                 osDelay(1000);
  51.         }
  52. }
复制代码


ends…



收藏 评论0 发布时间:2022-4-10 17:17

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版