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

【经验分享】如何将移植ucos到STM32F103开发板上-1

[复制链接]
xudongqiang 发布时间:2021-5-24 11:16
今天给大家分享一篇,如何将移植ucos到STM32F103开发板上,以及实现LED闪烁。6 R- O( i, l4 O( i

$ Z* C: J- a/ `( v" ]

5 b/ g9 ^" E* s6 b! @先到官方下载ucos源码) W( \" Y8 {3 ~8 }9 D3 \
具体步骤如下:
# _! r& Z; T* ]1.新建ucos工程,选择STM32F103VE,选择CMSIS下的CORE和Device下的Startup,以及Device下的StdPeriph Drivers下的Framework,RCC,和GPIO& Z0 d: p5 T4 \/ l9 K' \
2.工程中和实际目录中都新建几个目录,APP,UCOS,BSP,LIB,CPU,Output1 a0 u  X5 `) ~* |
3.工程上右键,Options,Output页签,Select Foldeer for Objects,进入Output目录,点击OK
1 Q/ N7 {; `. L1 f0 j/ m4.把Micrium\Software\uCOS-II\Source目录中的文件拷贝到UCOS目录下,并添加到工程中, l8 ?7 \0 {: m
5.工程Options中,C/C++页签,Include Paths,点击后面省略号可选择include目录,添加UCOS路径
0 q, `& [: L* ^/ K7 C, ^" f6.复制Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe目录下的文件app_cfg.h,os_cfg.h和includes.h到APP目录中,并在Include Paths中添加APP: i# e  w1 f6 u, c' M4 t+ F" o" V
7.复制Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\RealView目录下的所有文件到CPU目录,添加到工程和Include Path中
$ _. m: Y: `/ [+ t# v/ Y& j2 j8.工程Options中,C/C++页签,Defines中添加 USE_STDPERIPH_DRIVER
/ A  D' |: U9 T( r* j, C9.把RTE和RTE\Device\STM32F103VE添加进Include Paths中, @$ P9 D- b" ]8 }1 u4 S" P
10.修改os_cfg.h文件,#define OS_APP_HOOKS_EN           1为0  P9 W( g" x1 ^+ s4 G
11.BSP目录下新建BSP.c文件,添加内容如下:% \! ]1 U/ d5 _9 Q8 l
  • #include <BSP.h>
  • CPU_INT32U  BSP_CPU_ClkFreq (void)
  • {
  •         RCC_ClocksTypeDef  rcc_clocks;
  •         RCC_GetClocksFreq(&rcc_clocks);
  •         return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
  • }
  • INT32U  OS_CPU_SysTickClkFreq (void)
  • {
  •         INT32U  freq;
  •         freq = BSP_CPU_ClkFreq();
  •         return (freq);
  • }
  • ————————————————
  • 版权声明:本文为CSDN博主「zhqh100」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
  • 原文链接:https://blog.csdn.net/zhqh100/article/details/39895341
    - p* m2 H& Y2 f; b) F+ J; ?$ ~( t2 a

; s" a( }! c9 h& n9 |. ^& j2 ]- C复制代码
; T* N. a0 e: Z: H; o. J* A  a$ ]
12.复制Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\BSP目录下的bsp.h到 BSP目录中( n9 O" v9 H, Z
13.复制Micrium\Software\uC-CPU\ARM-Cortex-M3\RealView目录和Micrium\Software\uC-CPU目录下的所有文件到CPU目录下,并添加到工程和Include Path中: D6 u* Y" I8 V2 T! I
14.复制Micrium\Software\uC-LIB目录下的所有.h文件到LIB目录下,并添加到Include Path中2 E) ^' K  L4 U
15.注释掉bsp.h中的#include    <stm32f10x_lib.h>和#include    <lcd.h>
: p: X/ M; s) `& \  L6 L5 m( [8 [% W16.app_cfg.h文件中,修改为#define  APP_OS_PROBE_EN                         0
) O; ~1 I) s0 u: r6 \- f. V17.APP目录下新建app.c文件,内容为+ [8 p7 s6 z7 [
  • #include <includes.h>
  • int main(){
  •         OSInit();
  •         OSStart();
  •         return 0;
  • }* s2 L3 |  T6 C) R

7 v" i+ G; K" t) X- w& Y) O复制代码
( V6 j0 }, W2 E4 e+ {" _3 W
18.注释掉includes.h文件中的#include    <stm32f10x_lib.h>和#include    <lcd.h>6 f* Z. M# L# z

# I! g" T/ U4 I0 {5 Z' c( \  D尝试新建ucos任务:" l1 e7 k' V, A/ m  w& B6 e" y) m
  • #include <includes.h>
  • static void App_TaskStart(void *);
  • static void App_TaskCreate(void);
  • static  void Task_Led1(void* p_arg);
  • static  void Task_Led2(void* p_arg);
  • static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];
  • static  OS_STK Task_Led1Stk[Task_Led1_STK_SIZE];
  • static  OS_STK Task_Led2Stk[Task_Led2_STK_SIZE];
  • #define LED_LED1_ON()   GPIO_SetBits(GPIOB, GPIO_Pin_5 );                 //LED1  ÁÁ
  • #define LED_LED1_OFF()  GPIO_ResetBits(GPIOB, GPIO_Pin_5 );            //LED1  Ãð
  • #define LED_LED2_ON()   GPIO_SetBits(GPIOD, GPIO_Pin_6 );                 //LED2  ÁÁ
  • #define LED_LED2_OFF()  GPIO_ResetBits(GPIOD, GPIO_Pin_6 );            //LED2  Ãð
  • INT32U milsec1,milsec2;
  • int main(){
  •         CPU_IntDis();
  •         OSInit();
  •         BSP_Init();
  •         milsec1=100;
  •         milsec2=200;
  •         OSTaskCreate((void(*)(void *))App_TaskStart,
  •                                                         (void *)0,
  •                                                         (OS_STK *)&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
  •                                                         (INT8U)APP_TASK_START_PRIO);
  •         OSTimeSet(0);
  •         OSStart();
  •         return 0;
  • }
  • static void App_TaskStart(void * p_arg){
  •         (void)p_arg;
  •         OS_CPU_SysTickInit();
  •         App_TaskCreate();
  •         while(1){
  •                 OSTimeDlyHMSM(0,0,1,0);
  •         }
  • }
  • static void App_TaskCreate(void){
  •         OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],
  •                 Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0],
  •                 Task_Led1_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
  •         OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],
  •                 Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0],
  •                 Task_Led2_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);
  • }
  • static  void Task_Led1(void* p_arg)
  • {
  •    (void) p_arg;
  •    while (1)
  •    {
  •       LED_LED1_ON();
  •       OSTimeDlyHMSM(0, 0, 0, milsec1);
  •       LED_LED1_OFF();
  •       OSTimeDlyHMSM(0, 0, 0, milsec1);
  •    }
  • }
  • static  void Task_Led2(void* p_arg)
  • {
  •         (void) p_arg;
  •         while(1)
  •         {
  •       LED_LED2_ON();
  •       OSTimeDlyHMSM(0, 0, 0, milsec2);
  •       LED_LED2_OFF();
  •       OSTimeDlyHMSM(0, 0, 0, milsec2);
  •    }
  • }

  • + G8 n% o* Y% J1 X9 ]
* u! B- ^8 ?7 `2 I; H, U* H
复制代码

  i8 J  m* r% ~" A4 v0 HBSP.c文件增加如下方法:4 F: T( T' A2 a
  • void RCC_Configuration(void)
  • {
  •   SystemInit();
  • }
  • void GPIO_Configuration(void)
  • {
  •   GPIO_InitTypeDef GPIO_InitStructure;
  •   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB , ENABLE);
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                                 //LED1
  •   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  •   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  •   GPIO_Init(GPIOB, &GPIO_InitStructure);
  •   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;                                         //LED2, LED3
  •   GPIO_Init(GPIOD, &GPIO_InitStructure);
  • }
  • void BSP_Init(void)
  • {
  •   /* System Clocks Configuration --72M*/
  •   RCC_Configuration();
  •   GPIO_Configuration();
  • }

  • 6 h* ^$ @. y+ w
" P) _. Q# j$ d; }9 c2 D
复制代码

9 k0 P$ a" M  s' A另需要在app_cfg.h文件中添加:
; N1 ]& m9 z+ W
  • #define  APP_TASK_START_PRIO                               3
  • #define  Task_Led1_PRIO                                    7
  • #define  Task_Led2_PRIO                                    8
  • #define  APP_TASK_START_STK_SIZE                       128
  • #define  Task_Led1_STK_SIZE                                  128
  • #define  Task_Led2_STK_SIZE                                  128

  • 9 ]* [& H$ O  k# q9 U

- a& t1 E2 A# k3 x复制代码

7 h9 [3 J: }2 c1 V此时编译会发现,LED灯不闪烁,需要做如下修改:
/ ^; W( f, n3 G# I$ Q1.startup_stm32f10x_hd.s文件中,处理PendSV_Handler名称与os_cpu_a.asm文件中OS_CPU_PendSVHandler名称不匹配,需要把PendSV_Handler全部替换为OS_CPU_PendSVHandler' n! A6 N- s! I1 ]- d

8 j  Z0 z, j- ^& {" g' z
# |- `/ @5 g, ~  ]
2.复制Keil安装目录C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\1.0.5\Device\StdPeriph_Driver\templates下的stm32f10x_it.c和stm32f10x_it.h文件到APP目录下,去掉其只读属性,并添加到工程中,然后添加头文件:
5 w" _6 k2 e* Z7 E& b9 o* q, {
  • #include <includes.h>
    3 Q2 q! k* n9 c* g8 A) ~: d3 }7 q
1 \1 d0 g) ]- @1 i' f8 P. m
复制代码
7 D, W  q' E1 O) G4 n0 k
再修改SysTick_Handler函数如下:
* f6 B8 d8 U5 a8 u: u$ }1 b5 B5 _
  • void SysTick_Handler(void)
  • {
  •         OS_CPU_SR  cpu_sr;
  •         OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断/* Tell uC/OS-II that we are starting an ISR*/
  •         OSIntNesting++;           //OSSemPost(NMEA_MBOX);
  •         OS_EXIT_CRITICAL();          //恢复全局中断标志
  •         OSTimeTick();     /* Call uC/OS-II's OSTimeTick(),在os_core.c文件里定义,主要判断延时的任务是否计时到*/
  •         OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换
  • }

  • 3 c  {6 x+ R: g; N

$ M) r" n% }9 b0 }2 w5 s! L+ q, b1 I复制代码

$ a- ?& H! J( [; u: P& S+ ^3 T大家可以试一试!
赞 收藏 评论0 发布时间:2021-5-24 11:16

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版