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

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

[复制链接]
STMCU-管管 发布时间:2021-5-21 11:19
今天给大家分享一篇,如何将移植ucos到STM32F103开发板上,以及实现LED闪烁。
( Z1 x5 M$ ]6 @4 ]# \% [$ w$ x# {) J. \: V

  |+ ~7 S: W2 |% I; |0 f/ {' e先到官方下载ucos源码
2 u+ m- R# k* b8 O8 v5 d# R( n具体步骤如下:/ F! o6 @7 r# F- K7 y$ A0 y
1.新建ucos工程,选择STM32F103VE,选择CMSIS下的CORE和Device下的Startup,以及Device下的StdPeriph Drivers下的Framework,RCC,和GPIO1 S) l- S0 E( [: j" |1 @# m" B  n% Z5 _
2.工程中和实际目录中都新建几个目录,APP,UCOS,BSP,LIB,CPU,Output
3 F; o' `4 J% I% \) D3.工程上右键,Options,Output页签,Select Foldeer for Objects,进入Output目录,点击OK& N- P: S- E9 x1 ]# a, L. p8 S
4.把Micrium\Software\uCOS-II\Source目录中的文件拷贝到UCOS目录下,并添加到工程中
; h! W7 g* C6 t% X# u5.工程Options中,C/C++页签,Include Paths,点击后面省略号可选择include目录,添加UCOS路径
$ U% n! L  c1 R" N# Y9 ^4 X6.复制Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\OS-Probe目录下的文件app_cfg.h,os_cfg.h和includes.h到APP目录中,并在Include Paths中添加APP3 J: i) R! W/ C! B- a& p
7.复制Micrium\Software\uCOS-II\Ports\arm-cortex-m3\Generic\RealView目录下的所有文件到CPU目录,添加到工程和Include Path中! N0 R. q& M( H/ y
8.工程Options中,C/C++页签,Defines中添加 USE_STDPERIPH_DRIVER5 L5 h5 b# Q  g0 N2 q5 _2 w: e
9.把RTE和RTE\Device\STM32F103VE添加进Include Paths中! E% k  |8 f% p8 _  [8 c. u
10.修改os_cfg.h文件,#define OS_APP_HOOKS_EN           1为0
) X- Y' `2 h6 ?11.BSP目录下新建BSP.c文件,添加内容如下:
2 N, Q' Q8 Y2 V5 C3 B' C( F
  1. #include <BSP.h>
    ) c* a: G: O8 u1 ~3 S# E9 {9 d
  2. # Y' K2 u; @. k- B; `
  3. CPU_INT32U  BSP_CPU_ClkFreq (void)) o; o- l4 Q! |2 E. \
  4. {
    3 e2 N- j: n9 f! Q4 u1 K
  5.         RCC_ClocksTypeDef  rcc_clocks;$ {! z% r- T9 j- `4 ^
  6.         RCC_GetClocksFreq(&rcc_clocks);4 \0 Z( H+ h6 X% h
  7.         return ((CPU_INT32U)rcc_clocks.HCLK_Frequency);
    % K6 |1 j9 a4 v
  8. }* L0 I2 N; ?9 X8 p/ J

  9. - w1 Y% X9 n  Y/ t
  10. INT32U  OS_CPU_SysTickClkFreq (void)
    4 G% p7 Q6 p+ z% @5 b" p  A! H' L
  11. {0 Z3 m3 P# L$ y6 B4 K
  12.         INT32U  freq;
    $ {. S$ k# M6 l; h
  13.         freq = BSP_CPU_ClkFreq();7 [" Z# m6 I4 h- u& z
  14.         return (freq);. Q3 |) E: Y" B
  15. }
    . Y8 R" h* X8 ]; f. P" u$ }
  16. ————————————————$ Z* N3 Y7 n$ B2 K- @+ i$ L
  17. 版权声明:本文为CSDN博主「zhqh100」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。+ F, s: Y3 k* a! O& c% K* x8 g
  18. 原文链接:https://blog.csdn.net/zhqh100/article/details/39895341
复制代码
12.复制Micrium\Software\EvalBoards\ST\STM3210B-EVAL\RVMDK\BSP目录下的bsp.h到 BSP目录中
7 B1 m1 d0 `- Z1 G$ U13.复制Micrium\Software\uC-CPU\ARM-Cortex-M3\RealView目录和Micrium\Software\uC-CPU目录下的所有文件到CPU目录下,并添加到工程和Include Path中
, A& |4 L: M3 @/ U( z) p' W3 z14.复制Micrium\Software\uC-LIB目录下的所有.h文件到LIB目录下,并添加到Include Path中
4 P3 T2 s3 T% n# U$ E15.注释掉bsp.h中的#include    <stm32f10x_lib.h>和#include    <lcd.h> 4 y3 F% T3 a# _% W' ~0 d
16.app_cfg.h文件中,修改为#define  APP_OS_PROBE_EN                         0 6 w: u2 N1 ?' O0 m! z3 U6 u
17.APP目录下新建app.c文件,内容为 : F) n$ Y) w* u4 t
  1. #include <includes.h>  i! s5 \$ V# b+ V% H# f3 |

  2. * h+ `% i9 @( t0 r( N
  3. int main(){3 o" r( n  F7 I" W8 _
  4.         OSInit();$ B5 k* I. \) y6 m% i. n1 u# R
  5.         OSStart();
    1 ]' H6 D' l: d, V6 X4 V
  6.         return 0;$ h* k2 b4 e; Z- W' X5 R% c
  7. }
复制代码
18.注释掉includes.h文件中的#include    <stm32f10x_lib.h>和#include    <lcd.h>
$ A, f1 W: U  k6 A5 X8 j3 C# H& a  L. I' u* t
尝试新建ucos任务:
8 @' |* \; h1 @7 w+ W% D) j
  1. #include <includes.h>. Y1 F' U9 b$ i# J: e. k: v

  2. " q: z9 T5 |6 [) _; @" N0 D
  3. static void App_TaskStart(void *);  o$ j" H  r. n( n& F5 }4 ]9 V. M
  4. static void App_TaskCreate(void);3 x, s, q( e: e7 {, E5 J1 \+ e
  5. static  void Task_Led1(void* p_arg);" J% r$ E+ N  R3 `
  6. static  void Task_Led2(void* p_arg);/ E9 a8 j! K! n1 |5 ^

  7. ' q' N+ C# |: O$ x" s& l
  8. static OS_STK App_TaskStartStk[APP_TASK_START_STK_SIZE];
    ) Q" o+ G2 \0 V" c: b7 |
  9. 5 C* l) z) m8 T9 ]. e$ L& l) [
  10. static  OS_STK Task_Led1Stk[Task_Led1_STK_SIZE];
    3 ?6 T- W5 g8 u: N6 O0 J% C
  11. static  OS_STK Task_Led2Stk[Task_Led2_STK_SIZE];
    + b8 c$ L! {: q7 U
  12. 0 v9 o8 a* {, C2 u* ~
  13. #define LED_LED1_ON()   GPIO_SetBits(GPIOB, GPIO_Pin_5 );                 //LED1  ÁÁ! r- \2 U- S) x: D
  14. #define LED_LED1_OFF()  GPIO_ResetBits(GPIOB, GPIO_Pin_5 );            //LED1  Ãð( `# s4 f& k* G8 }2 h
  15. # G4 o$ Y& k) A; C& _2 f1 b
  16. #define LED_LED2_ON()   GPIO_SetBits(GPIOD, GPIO_Pin_6 );                 //LED2  ÁÁ
    ( l4 o3 Z2 X6 \  p, W! v
  17. #define LED_LED2_OFF()  GPIO_ResetBits(GPIOD, GPIO_Pin_6 );            //LED2  Ãð4 q0 x+ ]; o9 T$ I" d  V
  18. 8 b$ k7 f5 Z: ~5 k* F* [% W; A
  19. INT32U milsec1,milsec2;6 W2 R9 R: P3 d* n$ }6 L
  20. + w6 _- |% M0 ^  C0 c1 b' x2 {
  21. int main(){% C' L! o9 |* K( U4 R( X* z- l) d
  22.         CPU_IntDis();
    4 p. s; V% H* U; A  ~- I0 I

  23. ) E2 {' n: B( t, T( W
  24.         OSInit();. K) {5 X3 v# L; x6 B* z5 ~$ ]
  25.         BSP_Init();
    ! W  `4 A& ]# f8 t  D  O& q
  26.        
    3 E, h- |# f( K6 p4 v) {6 [& k1 _3 C. w
  27.         milsec1=100;
    . S' e7 E) I; _: \, B" B
  28.         milsec2=200;
    7 S, B/ ~/ U# R) w7 i9 [
  29.        
    ! U, u# }2 z( X+ a3 w  Q
  30.         OSTaskCreate((void(*)(void *))App_TaskStart,
    $ v, d: x. H8 \) k7 V& P
  31.                                                         (void *)0,
    * O+ }6 c' P& E4 j
  32.                                                         (OS_STK *)&App_TaskStartStk[APP_TASK_START_STK_SIZE - 1],
    % _! W9 @8 w% a: `+ l3 M% V" r6 l/ I/ U  g
  33.                                                         (INT8U)APP_TASK_START_PRIO);
    , u# X; w/ d1 T& X. W
  34.         OSTimeSet(0);
    2 s% ~: V9 x  B3 _. |/ H
  35.         OSStart();
    2 a& n6 _( a* n9 [3 d" s( ?# g- U
  36.         return 0;, f! S# d" @5 R
  37. }
    % h  d$ R/ b3 E( m, ]8 ~  @1 ~

  38. ; i( V7 R6 r8 w, Q. p) u7 v
  39. static void App_TaskStart(void * p_arg){
    / z. ?0 P' @( J9 _' V) N
  40.         (void)p_arg;
    . |% D7 E  `% W: {$ w0 S
  41.         OS_CPU_SysTickInit();
    2 T' j: ]4 r* b6 K; z. h* \
  42.         App_TaskCreate();
      c% S( J8 h- L) x" L
  43.         while(1){4 J* D. k) o6 k5 H$ [: P6 g
  44.                 OSTimeDlyHMSM(0,0,1,0);, I1 `/ M. V+ m, C- J
  45.         }
    7 {1 z% G* a5 }. q- I+ x
  46. }6 a( A! M; _3 H

  47. * Q' y4 G8 r" r; {9 t& [& d
  48. static void App_TaskCreate(void){
    ) A, ~) @# }5 k" @, N& J1 y
  49.         OSTaskCreateExt(Task_Led1,(void *)0,(OS_STK *)&Task_Led1Stk[Task_Led1_STK_SIZE-1],
    3 R  T9 b" p6 U6 T8 z
  50.                 Task_Led1_PRIO,Task_Led1_PRIO,(OS_STK *)&Task_Led1Stk[0],- |. u& J" c0 c& ^
  51.                 Task_Led1_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);( m* s0 X% V; Y5 Q8 R. N
  52.         OSTaskCreateExt(Task_Led2,(void *)0,(OS_STK *)&Task_Led2Stk[Task_Led2_STK_SIZE-1],
    . e) g) f1 j+ m) G/ l2 ^
  53.                 Task_Led2_PRIO,Task_Led2_PRIO,(OS_STK *)&Task_Led2Stk[0],
    5 ?. F0 P8 Z8 M( I
  54.                 Task_Led2_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);/ y3 e# B7 ?, G0 R
  55. }: Q# t0 ]* F$ P3 N6 t

  56. - G4 w$ E) Q. w  Y. }
  57. static  void Task_Led1(void* p_arg)
    2 v( e1 ^$ M$ {/ ?/ Z0 v  M
  58. {7 }3 Q8 c- J( j" v. k) |
  59.    (void) p_arg;            
    . @9 j1 G! W9 y$ s2 w9 \
  60.    while (1)$ S0 C0 I8 Y( B  y
  61.    {
    6 D3 s6 z1 R6 n; d
  62.       LED_LED1_ON();
    $ \7 x. k: L# ^$ v/ @
  63.       OSTimeDlyHMSM(0, 0, 0, milsec1);' v" t% ^- F, H/ E0 g+ L
  64.       
    % @5 D. K/ g5 y# F1 S: T- `
  65.       LED_LED1_OFF();& i2 K+ ?8 {0 q' I
  66.       OSTimeDlyHMSM(0, 0, 0, milsec1);       
    ) d5 L4 [% e" I+ m0 ?" _9 x- W! n; F
  67.    }
    ; X8 e' Q0 `" M; t2 ]$ {
  68. }* O9 }/ m6 H0 P1 K0 p0 Q3 @) W, L
  69. static  void Task_Led2(void* p_arg)& F; G( n. n0 a' D7 F
  70. {
    ; Y% K1 {# Y& s  T3 O. C9 R
  71.         (void) p_arg;            ! t8 e6 Y5 x5 a/ b
  72.         while(1)
    " P9 N. k. y- U  j' B) z
  73.         {/ z' ]9 q0 C, b, p9 U
  74.       LED_LED2_ON();
    ! @9 C( H4 F& }9 w0 ]2 c; k% C
  75.       OSTimeDlyHMSM(0, 0, 0, milsec2);, {( r! \) e; P! ^1 e
  76.       2 C' Z) q* D& h
  77.       LED_LED2_OFF();3 \& u, F  l3 s. c
  78.       OSTimeDlyHMSM(0, 0, 0, milsec2);        * \: z' _5 ~9 P
  79.    }) z1 {# C0 O: w( V( N, L
  80. }* t$ P2 J3 ]" e) m4 @
复制代码
BSP.c文件增加如下方法:
, n3 \4 ?- P  _2 w& c
  1. void RCC_Configuration(void)# X! f! y6 T: c1 e
  2. {       
    3 J, I3 {' s& {
  3.   SystemInit(); . z! l4 y: r9 ?+ y
  4. }
    9 m: k" F$ ^/ |  S, v/ t3 ?

  5. . |7 V+ I  Y$ j% y1 S7 C' J
  6. void GPIO_Configuration(void)
    / E0 V; {* h& u2 P% I& R
  7. {
    8 }9 Y. j- n/ j1 A/ `0 d
  8.   GPIO_InitTypeDef GPIO_InitStructure;0 a% k1 @8 G0 \7 n' Z6 k5 d* d. h9 C

  9. ) T  b0 o' G( ?! j# l2 X) |9 {
  10.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOB , ENABLE); ) ^9 Z/ N4 h6 ^! c! U: P3 L2 J' K
  11.   # G& ~6 d$ {: y
  12.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;                                                 //LED1. U. l; ?) p( I! H' d
  13.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;9 C, `7 k: J: H8 R- ]$ ?1 c
  14.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;9 p& a' k/ }$ q2 j
  15.   GPIO_Init(GPIOB, &GPIO_InitStructure);                                         
    + i- Q, y; r& x! r2 b
  16.   
    3 A4 i( W# S; X9 z5 Q$ V# |
  17.   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_3;                                         //LED2, LED3
    4 o7 A# _$ X; g% |4 j  j
  18.   GPIO_Init(GPIOD, &GPIO_InitStructure);: l5 ]/ u8 M) ]
  19. }
    : r6 e! a' W2 u) z7 d4 G

  20.   I7 M4 d$ C3 t5 R/ e9 s9 d) G3 R( V
  21. void BSP_Init(void)1 K9 L4 s& o9 y6 C
  22. {, w9 q4 K: T; Q: w  o& x
  23.   /* System Clocks Configuration --72M*/
    2 \; s* N5 |- }# m4 z3 u
  24.   RCC_Configuration();   
    - g) s! s4 z+ u$ Y( o

  25. % A& [7 _% S$ ^; J( L( B  P
  26.   GPIO_Configuration(); + [% p, E, I$ y
  27. }
    # j+ r, e; w9 I) w) o" K2 ~
复制代码
另需要在app_cfg.h文件中添加:; B1 K+ l) I) E& w1 V% l: @7 ?, Q
  1. #define  APP_TASK_START_PRIO                               3
    * ~$ s& t# V6 M7 S  a" Z
  2. #define  Task_Led1_PRIO                                    7& D5 \; G% V$ O6 h# D
  3. #define  Task_Led2_PRIO                                    88 C; `: E! {, p$ L  }
  4. 4 I, O1 ?3 M+ {5 p" ~
  5. #define  APP_TASK_START_STK_SIZE                       128) b" c+ ^; L( d4 @8 b( m
  6. #define  Task_Led1_STK_SIZE                                  128
    ( M. A; t: Z. N1 x1 `8 q
  7. #define  Task_Led2_STK_SIZE                                  1287 X9 {% Q! P6 @' ^; e! ]
复制代码
此时编译会发现,LED灯不闪烁,需要做如下修改:
3 @# D8 W, W4 w* V9 `; y+ a5 p) B5 l1.startup_stm32f10x_hd.s文件中,处理PendSV_Handler名称与os_cpu_a.asm文件中OS_CPU_PendSVHandler名称不匹配,需要把PendSV_Handler全部替换为OS_CPU_PendSVHandler
$ _% ]$ {8 Y+ d' O+ x
$ s8 L6 a7 b7 g( G( I6 R
% [1 x7 `* l" Y8 W" V+ t$ 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目录下,去掉其只读属性,并添加到工程中,然后添加头文件:& v9 ^( Y$ o0 i  n* {
  1. #include <includes.h>
复制代码
再修改SysTick_Handler函数如下:  c- ~6 U+ G1 [) g( z; l7 E
  1. void SysTick_Handler(void)
    / L5 I, ?3 l6 ?1 t, [6 B6 O6 X& h) {% g
  2. {5 B! H5 c* w! H# W  [
  3.         OS_CPU_SR  cpu_sr;
    5 J& S* d# Z! C- ~: w% f2 X1 ~% R

  4. - d! g8 E; [" I" q+ \
  5.         OS_ENTER_CRITICAL();  //保存全局中断标志,关总中断/* Tell uC/OS-II that we are starting an ISR*/' z7 a4 J9 t- E
  6.         OSIntNesting++;           //OSSemPost(NMEA_MBOX);
    . M7 L% v6 O6 }4 F; E% S# e
  7.         OS_EXIT_CRITICAL();          //恢复全局中断标志7 M& ~' D9 T2 N# D! r4 R* r7 d4 c9 ~

  8. , Q' g+ _) w1 t. D( x8 R
  9.         OSTimeTick();     /* Call uC/OS-II's OSTimeTick(),在os_core.c文件里定义,主要判断延时的任务是否计时到*/) O$ M2 B4 T2 P+ g' k( N* ]

  10. 3 V' a4 ^9 }/ T8 @! M# M
  11.         OSIntExit();  //在os_core.c文件里定义,如果有更高优先级的任务就绪了,则执行一次任务切换    % `  C8 h4 C+ q7 L' o4 f
  12. }, G! |" l: _; N3 K" ^
复制代码
大家可以试一试!
# b0 J+ m! t" n2 c* Q8 v6 V6 e6 P8 V4 \' n  D" ?' `
赞 收藏 评论0 发布时间:2021-5-21 11:19

举报

0个回答

所属标签

相似技术帖

官网相关资源

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