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

基于IAR和STM32的uCOS-II移植

[复制链接]
STMCU小助手 发布时间:2022-12-16 14:00
网上基于MDK的移植数不胜数,但是基于IAR的移植几乎没有,因为官方的例程就是基于IAR的,所以移植起来很简单,没人介绍,但还是得小心谨慎,一不小心就出错,对于新手来说,查找错误可不是那么容易的。IAR建立工程,这里就不介绍。

以下红色部分需要与MCU型号对应

(1)在官网下载适合自己STM32的uCOS-II库,连接如下,我用的MCU是STM32F103VCT6,属于大容量的,所以选择的库是STMicroelectronics STM32F103ZE。

(2)下载下来的是(.exe)文件,双击解压得到名称为Micrium的文件夹。

(3)在自己的工程中建立文件夹ucosii,里面包含3个子文件夹,分别是config,port,source,文件夹名称随意。

(4)将文件夹Micrium\Software\uCOS-II\Ports\ARM-Cortex-M3\Generic\IAR中的文件全部复制到port文件夹中。

   将文件夹Micrium\Software\uCOS-II\Source中的文件全部复制到source文件夹中。

   将文件夹Micrium\Software\EvalBoards\ST\STM3210E-EVAL\IAR\OS-Probe中的app_cfg.h和os_cfg.h复制到config文件夹中。

   (STM3210E-EVAL此目录根据STM型号而定,型号不相符是否有影响,未测试)

(5)为了防止修改错误,这里暂时可以将port和source这两个文件夹中的文件设置为只读,以后用的时候再取消。

(6)修改os_cfg.h中的第一个宏定义为#define OS_APP_HOOKS_EN    0  (取消钩子函数)。

(7)将启动程序startup_stm32f10x_hd.s中所有PendSV_Handler替换成OS_CPU_PendSVHandler,SysTick_Handler替换成OS_CPU_SysTickHandler。

注意:下面这种注释是错误的,会导致进入硬件错位中断,害的我浪费了好几天时间。

   PUBWEAK OS_CPU_PendSVHandlerendSV_Handler

        SECTION .text:CODE:REORDER(1)
OS_CPU_PendSVHandlerendSV_Handler
        B OS_CPU_PendSVHandlerendSV_Handler

        PUBWEAK OS_CPU_SysTickHandler;SysTick_Handler
        SECTION .text:CODE:REORDER(1)
OS_CPU_SysTickHandler;SysTick_Handler
        B OS_CPU_SysTickHandler;SysTick_Handler


(8)打开Micrium\Software\EvalBoards\ST\STM3210E-EVAL\IAR\BSP\bsp.c文件,复制函数CPU_INT32U  BSP_CPU_ClkFreq (void)和INT32U  OS_CPU_SysTickClkFreq (void)到main.c中。

   (注意将所有CPU_INT32U修改为INT32U,不然会报错)


(9)在main.c中创建任务。
  1. #include "ucos_ii.h"
  2. #include "os_cpu.h"
  3. #include "stm32f10x.h"

  4. #define STARTUP_TASK_PRIO               10
  5. #define STARTUP_TASK_STK_SIZE           64
  6. OS_STK startup_task_stk[STARTUP_TASK_STK_SIZE];

  7. //LED1任务
  8. //设置任务优先级
  9. #define LED1_TASK_PRIO       5
  10. //设置任务堆栈大小
  11. #define LED1_STK_SIZE       64
  12. //创建任务堆栈空间
  13. OS_STK LED1_TASK_STK[LED1_STK_SIZE];

  14. //LED2任务
  15. //设置任务优先级
  16. #define LED2_TASK_PRIO       6
  17. //设置任务堆栈大小
  18. #define LED2_STK_SIZE   64
  19. //创建任务堆栈空间
  20. OS_STK LED2_TASK_STK[LED2_STK_SIZE];

  21. void led1_task(void *p_arg);
  22. void led2_task(void *p_arg);

  23. INT32U  OS_CPU_SysTickClkFreq (void)
  24. {
  25.     INT32U  freq;
  26.    
  27.     RCC_ClocksTypeDef  rcc_clocks;

  28.     RCC_GetClocksFreq(&rcc_clocks);

  29.     freq = (INT32U)rcc_clocks.HCLK_Frequency;
  30.    
  31.     return (freq);
  32. }

  33. void LED_Init(void)
  34. {

  35. GPIO_InitTypeDef  GPIO_InitStructure;

  36. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE); //使能PB,PE端口时钟
  37. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //LED0-->PA.2 端口配置
  38. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  39. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
  40. GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.2
  41. GPIO_ResetBits(GPIOA,GPIO_Pin_2); //PA.2 输出高

  42. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;     //LED1-->PB.12 端口配置, 推挽输出
  43. GPIO_Init(GPIOB, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz
  44. GPIO_ResetBits(GPIOB,GPIO_Pin_12); //PB.12 输出高
  45. }

  46. static void startup_task(void *p_arg)
  47. {
  48.     INT8U err;
  49.     OS_CPU_SR cpu_sr=0;
  50.    
  51.     OS_CPU_SysTickInit();
  52.    
  53.     #if (OS_TASK_STAT_EN > 0)
  54.     OSStatInit();
  55.     #endif
  56.    
  57.     OS_ENTER_CRITICAL(); //进入临界区(无法被中断打断)
  58.    
  59.    
  60.   err = OSTaskCreate(led1_task, (void *)0,
  61.                        (OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1], LED1_TASK_PRIO);   
  62.   err = OSTaskCreate(led2_task, (void *)0,
  63.                        (OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1], LED2_TASK_PRIO);
  64.    
  65. OSTaskSuspend(STARTUP_TASK_PRIO); //挂起起始任务.
  66. OS_EXIT_CRITICAL(); //退出临界区(可以被中断打断)
  67.    
  68.     if (OS_ERR_NONE != err)
  69. while(1);
  70.    
  71.     OSTaskDel(OS_PRIO_SELF);
  72. }

  73. int main(void)
  74. {
  75.     LED_Init();
  76.     OSInit();
  77.     OSTaskCreate(startup_task, (void *)0,
  78.                  (OS_STK*)&startup_task_stk[STARTUP_TASK_STK_SIZE-1],
  79.                  STARTUP_TASK_PRIO);
  80.     OSStart();
  81.     return 0;
  82. }

  83. //LED1任务
  84. void led1_task(void *p_arg)
  85. {
  86. while(1)
  87. {
  88. GPIO_ResetBits(GPIOA,GPIO_Pin_2);
  89.         OSTimeDly(500);
  90. GPIO_SetBits(GPIOA,GPIO_Pin_2);
  91.         OSTimeDly(500);
  92. }
  93. }

  94. //LED2任务
  95. void led2_task(void *p_arg)
  96. {  
  97. while(1)
  98. {
  99. GPIO_ResetBits(GPIOB,GPIO_Pin_12);
  100.         OSTimeDly(500);
  101. GPIO_SetBits(GPIOB,GPIO_Pin_12);
  102.         OSTimeDly(500);
  103. }
  104. }

复制代码

————————————————
版权声明:鱼入大海_

收藏 评论0 发布时间:2022-12-16 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

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