如果您是完全按照《如何将移植ucos到STM32F103开发板上-1》来新建的工程的话,那很遗憾,你要重新建立一个工程,因为,在那篇文章的步骤1中,我们选中了GPIO,但是没有选中USART,所以要新建一个工程,只是也要把USART选中! {7 G! W: C$ i
1 o. D0 J. M& K& l0 w: P
& e5 a* K; u: V) z0 o% W) dBSP.c文件中增加对串口的初始化及中断的初始化:
1 d6 {6 g3 }+ K! m2 _8 S% J b
4 N6 M+ L3 O3 S9 |- Z6 Y- void NVIC_Configuration(void)+ ?- Q' @: C9 Z3 s8 l2 g
- {
/ y4 L+ @; [: h, K/ H: a) ^ - //EXTI_InitTypeDef EXTI_InitStructure;
+ \( n, F7 B2 R - NVIC_InitTypeDef NVIC_InitStructure;8 }9 F% u1 b! x9 y% x, R
-
) z3 l2 `: @( s# O4 N& `( h - /* Configure the NVIC Preemption Priority Bits */ ' J0 [ ?* a% ]
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);6 h( R$ p. i: L
- ; K; X8 r$ D& i* G4 q$ v. V
- NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;, B) W: J, T2 D8 h0 b
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
$ O3 y! l; I* O$ \, c8 p - NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;/ O& F B; w/ g8 X. z
- NVIC_Init(&NVIC_InitStructure);8 f2 u: t) [1 j0 u1 V
- }+ J( I5 B. i/ K) x( l" L: J* n
- * d6 w7 V. h% n, p! ]/ g& v& ?
- void USART_Config(USART_TypeDef* USARTx,u32 baud){
8 W' j" W* C! f: h' F - USART_InitTypeDef USART_InitStructure;
$ \0 u6 g+ V4 r/ r- d$ d - GPIO_InitTypeDef GPIO_InitStructure;
$ ?& T R" g! F- | X, I& }$ q% E' v -
N, j5 {6 P" C9 C - RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
4 s- g5 j! h( T9 e- o; M - RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); 3 p! G$ f& J7 I) e( U* ~: X
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
+ @0 N' G* X# x" p -
0 g/ I* o4 U1 D; J - //usart_init----------------------------------------------------0 A6 J# O; \8 P P6 u
- /* Configure USART1 Rx (PA.10) as input floating *// I; I4 s2 V; a B5 O( T
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
U0 I- w! y1 `- F2 _* w; b - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;2 `% n5 X) E5 U6 v: p: |9 \ f$ j
- GPIO_Init(GPIOA, &GPIO_InitStructure);
# D3 K: V, \( h w! U! y -
0 X" e4 |) n# r8 J- W5 @, P - /* Configure USART1 Tx (PA.09) as alternate function push-pull *// Z( a, Q6 @, ]$ X' N; i" g/ F- ^
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;% o9 I% ?* K/ f$ p
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
; W" ]# @. H" B- ]" r - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;6 v; \& V6 k, X* w9 T; [* b! \) Y
- GPIO_Init(GPIOA, &GPIO_InitStructure);
9 G. f3 Y9 p9 T" [ - / {9 s& P. e: ]1 }) j* Y: f
-
) h: w3 i/ j* |/ [& k" \ H6 H$ V - USART_InitStructure.USART_BaudRate =baud;2 E7 S$ e# d8 O8 B* M
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;3 p- Y. T6 h$ `
- USART_InitStructure.USART_StopBits = USART_StopBits_1;4 J; H% V3 I# d0 }- c( e
- USART_InitStructure.USART_Parity = USART_Parity_No;( H1 n1 r4 R5 w( K% D
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
2 J5 ], `+ h1 V( y% i - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
k/ E5 [: m. b6 G$ A8 g - Y; }; S4 }6 Y H# F
- /* Configure USART1 */
) M4 ]( j) S1 R- f# k1 z - USART_Init(USARTx, &USART_InitStructure);
" d* i8 h6 C+ F# @( c! V - ( [% G* O6 j6 X* |
- /* Enable USART1 Receive and Transmit interrupts */
6 z# B r& D% ]# r - USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);
: B1 M: W" y2 }- T" @7 c" o - //USART_ITConfig(USARTx, USART_IT_TXE, ENABLE);
0 X( d& n$ Q6 o0 g/ H: P -
. P& }6 c$ o" q- K -
% o. K4 `) l: C3 c - /* Enable the USART1 */
4 ~. _/ Q6 t. f4 M: M - USART_Cmd(USARTx, ENABLE);
4 L& L/ s; K5 v0 |1 r6 R+ ] -
q: o3 J& j% ]+ l/ E, r) t - //USART_ClearFlag(USARTx, USART_FLAG_TXE);
; z# ~- M8 p+ p - }: ~$ d6 |0 e7 C" U, C: Y
- ; E; R0 K1 {$ }* M5 J2 ~- r; a
- void BSP_Init(void)
3 r7 K7 p5 A M2 T6 ^% ]4 P - {
4 C% ] f9 b" Q - /* System Clocks Configuration --72M*/1 G2 O( k9 `8 z7 e/ J8 A# [: z7 C9 S
- RCC_Configuration();
/ K0 P O, V4 z8 v: B) s$ U _ - GPIO_Configuration();
1 z' r. L' M6 c2 R G -
* O. n1 V1 d9 @: Y% | - NVIC_Configuration();
# Z9 [, e) w K/ B - USART_Config(USART1,115200);
% ~, C1 g \5 Q6 o! I+ s5 Q - }
/ N, p6 k# {5 `
复制代码 APP目录下新建USART.c文件,添加如下代码:
# `" z: u/ l# }& }- q) x& N. V9 o2 ]- #include <usart.h>0 z/ y+ J8 K p$ Q8 u4 R) x' Q
-
0 m- ]6 s, @' s - void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...){
0 Q6 u$ L, o$ ~! D - const char *s;
* Y; ]; L/ _; s' \ - int d;
R" U6 w2 I( u$ v9 i; P - , N9 }! e# |$ j" K$ k
- char buf[16];/ L% L9 L3 ]! m2 s& \' ?
- va_list ap;
: c& \; A1 ^, M) B - va_start(ap, Data);
* c0 S7 p1 L% A4 W/ t+ k7 f" h - : _* ~/ g2 Z" [( ]- n1 F
- while(*Data!=0){
4 h: \1 }4 _1 E7 d* K9 E4 P - if(*Data==0x5c){
3 f/ ~0 T9 N/ a7 u( V) p7 @ - switch (*++Data){
) Y$ S+ }% f4 J - case 'r':
7 M" F/ w7 z, z - USART_SendData(USARTx, 0x0d);
* @7 S) ~7 R! d2 Y8 z, n -
' Q6 h0 y! s2 v) i n5 x - Data++;
. s5 O, W% ~6 |# l f* a. C0 f - break;
2 F% n5 @9 o, t2 K& M# f - case 'n':$ ^2 _8 J" p8 e! t9 w. r
- USART_SendData(USARTx, 0x0a);
8 b9 t; k% s) z! Y: @# O - Data++;
m2 Q/ F% h1 E ?/ j - break;
/ E8 d. P3 {/ Z$ `. Y - % Q0 ~- Y7 }3 O4 [
- default:+ @1 r1 i" [0 N- L% V! e( ?
- Data++;2 O: ?% T P* C8 L- A( @ H
- break;
* U" ?- I3 B9 L* d$ n# J$ s5 r - }
; E8 J7 X* C+ \. k+ D) w4 W - }else if(*Data=='%'){+ ]9 H! Z7 l0 p/ y: y9 u
- switch (*++Data){0 {) B5 ?, O) y+ d0 _
- case 's':/ N* l+ ?1 |5 z0 ^6 r
- s = va_arg(ap, const char *);$ R7 ~/ n) r3 I# e6 \
- for ( ; *s; s++) {
: z, g8 F8 O9 z: X - USART_SendData(USARTx,*s);/ @3 a* \' x- U6 m3 D
- while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);1 s& w, p3 e% e+ L1 s
- }
X8 [; ]: u* F/ p. v1 _- a - Data++;
$ i B* e0 b4 L% V: o - break; b: f8 [& J/ s+ e% \$ m) l( P: y6 F2 Y
- case 'd':
. H% I5 L+ E! B - d = va_arg(ap, int);1 K5 |2 S/ \! z$ _1 C X. }
- itoa(d, buf, 10);) @) M6 |& }+ o/ d" [
- for (s = buf; *s; s++) {
+ \! j3 Z! W7 f5 n m6 ~+ f1 b* k: b - USART_SendData(USARTx,*s);/ V) |+ R. F; c
- while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);0 ?4 S S( U2 N& ~+ _
- }; B, K# E" h9 o3 I' {
- Data++;& n, [7 i- I/ A/ v0 }
- break;
2 S: x$ y [) ^: V. w3 j. \ - default:
, m5 Y$ X8 x' ?) z# s6 [* z - Data++;1 x, v3 f+ P& q" Q/ l6 @) p- Y, o
- break;
1 q- i, w7 L# G5 x - } $ K% L. L( T: h# { D$ r, F4 H/ ]8 R
- }else{0 E y8 z7 Q( ?" R! A' c- F
- USART_SendData(USARTx, *Data++);/ K! D) h5 v0 u# P- z% z8 | U B
- }7 j. p4 {2 L4 X. y
- while(USART_GetFlagStatus(USARTx, USART_FLAG_TC)==RESET);
0 B1 P/ v* \' D! C5 F0 N - }
~# I d: y3 k$ A4 p9 B9 c - }
! `# q# e0 {/ J6 E1 @3 A. T) k - 3 B$ t6 v5 ?% x; v6 @8 D$ R
- char *itoa(int value, char *string, int radix)9 L o- l) ^6 `* M
- {" _5 L2 [ Z8 O1 {8 _! j- ~
- int i, d;
% m' i+ G! y' i4 x4 G - int flag = 0;: \% t. M1 E8 |2 R2 v2 E4 H. c9 o' @9 ]
- char *ptr = string;8 l F6 s9 e- f- M: K
-
1 _' C1 }6 {& s3 N; Y1 i9 v% r - /* This implementation only works for decimal numbers. */7 u3 G. w ?* ` U H9 s
- if (radix != 10)( s& x+ Z) g1 g. Y$ o: d# P) B
- {
# l# L g* w5 I! v0 q3 B - *ptr = 0;
6 F0 u8 z! K; _ - return string;
9 S/ K+ r" x5 s: E - }
2 h' q ]+ o! ?( I( Q% O% V8 G - ' s: k2 Q" C- l6 t9 ~" w% s
- if (!value)& o0 c; Q8 C$ W, h" t& O: V8 X
- {; U9 P) t0 g/ B7 F. W' Z! T4 D
- *ptr++ = 0x30;
9 P: h, o: ?0 U. B. p4 j - *ptr = 0;- {/ B- T0 b/ r3 O% z" Z
- return string;( B0 v9 Y( L0 T; c4 G5 |& P! _1 V
- }$ B( X3 O5 ~1 y1 r$ v J r
-
' q9 c/ A3 t6 ^3 {6 H) v6 o - /* if this is a negative value insert the minus sign. */: F( T6 n& Y4 W$ H5 C
- if (value < 0)
. q7 p- y c$ d1 u+ y/ \/ _ - {# [9 h! j7 H7 s1 k" U& `3 H
- *ptr++ = '-';
0 s& W% X7 I2 F1 }$ p& g( ]. `$ a! R - /* Make the value positive. */
. u6 a8 ]% I2 \- a - value *= -1;
- w! z2 N# m) Q$ ?, L! Q, ^6 ^ - }
- a6 P4 w+ ^8 t2 K; W - for (i = 10000; i > 0; i /= 10)5 u/ r; _5 o; J" F$ ^6 f6 ]
- {7 C$ ^/ S0 `& X4 j
- d = value / i;
$ s9 O4 @. c7 u* D& S+ \$ A" w -
4 t4 ~0 e* D+ I- k o. K6 R5 t - if (d || flag). E2 i9 P+ ^9 X( f2 L
- {& ~5 Z1 H; F# w- G: T
- *ptr++ = (char)(d + 0x30);
9 ^: D F+ Y9 a8 b6 x: K+ A+ u. p - value -= (d * i);
/ _/ F6 ^) z+ f% ?9 c# M3 f7 f - flag = 1;7 V9 x: A/ |: I/ d
- }+ J. u0 h( T% ~+ W1 h3 `
- }2 ?( J$ X3 r" m2 R
-
( w) @) v9 P# f4 h- ~ - /* Null terminate the string. */3 ^9 v3 Q. V2 O" }7 l# ]$ m
- *ptr = 0;+ q5 O0 v# J9 ?4 A
-
/ c/ S' i t B4 i - return string;6 w8 }, l& w. _9 A
-
}9 L' E7 y' c+ I - } /* NCL_Itoa */- X' y9 e, X, W% I
-
$ H3 M H) ^5 h) P1 e3 M! J0 C - int SendChar (int ch) { /* Write character to Serial Port */& H/ b$ m: l* ?
- USART_SendData(USART1, (unsigned char) ch);
: |$ v8 t S; w+ R, m - while (!(USART1->SR & USART_FLAG_TXE));
, V% b) @" ?7 v/ H3 [! U - if(ch=='\r')
9 D% k- Z( _+ A - SendChar('\n');$ j# x5 Q+ T: r/ B8 j `
- return (ch);: z% j# T- J- L" ?' ]
- }7 s+ \! [- x6 Q
- g) E0 |* L! s7 B2 X* t3 h. J2 e
复制代码 新建usart.h文件:( l5 V2 A0 b1 @" P* {3 ^
- <pre name="code" class="html">#ifndef __USART_H__
! W1 @6 A) C% C) @3 D' l/ ] L7 s - #define __USART_H__
7 L* b7 C. ]" z* T1 W/ O -
: t8 r7 X2 A2 ?; d9 X3 e8 { - #include <includes.h>
( {4 w/ R& s) I( @% C -
! q: b9 } u8 j, b - void USART_OUT(USART_TypeDef* USARTx, uint8_t *Data,...);
% W4 m: }% u5 F0 R7 v1 C - char *itoa(int value, char *string, int radix);/ ~8 ]1 M9 x8 C+ I* U9 T/ |
- int SendChar (int ch);3 @- y- U# b7 Z. ^/ g% U/ y3 [
-
- S" \' }$ g5 _" u$ L2 l - #endif* T, }: m. o, I. F% f! U* {, X
复制代码 stm32f10x_it.c文件中添加串口中断处理:
1 {. s7 X" Z: _; U9 L6 @9 ^/ |4 {- void USART1_IRQHandler(void)& `$ l" G7 Y# A$ r" q: v- X
- {! l. F) L6 G# ^$ J3 G
- unsigned int i;5 q7 m: l& g {# ^) e! l' x, D4 |( X
- unsigned char msg[50];
( q) ?% U; r* y - OS_CPU_SR cpu_sr;
t; g- ^* }8 I& |3 e - 2 V5 ]0 L0 x0 M' {( E
- OS_ENTER_CRITICAL();: ]" y) R! x; J8 q
- OSIntNesting++;
- r7 Y4 a, a* E4 O9 k" k -
% j/ V; q. ~2 B8 A5 ` - OS_EXIT_CRITICAL();& j; s. U4 J- V5 N/ ]2 G
-
; m7 P( x3 P5 X2 a4 a% m - //OSTimeTick();* o; k. z+ O! W, Z1 Z1 Y6 I
- 9 J+ o1 @6 d: d6 Q& X8 ^8 X) u) e
- if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
0 q& S o) z; Q9 t, d3 j - { 4 n: `$ u) [4 b( W0 k3 k
- if(RxCounter1>20)
8 K7 D/ ~% K8 t) d - RxCounter1=1;3 q+ x1 c& N3 N6 i$ ^- s
- # @' M6 J% y' o c* L W
- // Read one byte from the receive data register $ ?6 D5 j( v8 i
- msg[RxCounter1++]= USART_ReceiveData(USART1);
, ~. d5 q2 K6 C3 n+ p) R) c2 g - SendChar(msg[RxCounter1-1]);9 n3 |% d5 i6 q0 @) G5 h
-
/ l+ d6 ]( M6 f1 h: H) Y - if(msg[RxCounter1-1]=='L')1 F' k* J7 @- S3 G& a
- {
# q; o4 l7 j& M' i' @: X7 U - msg[0]='L'; RxCounter1=1;
- e/ k$ J! j$ e2 Z+ M O' m" S - }else if(msg[RxCounter1-1]=='F')
( A+ u4 [. a: ?( ]3 `" c - {
8 r3 s7 ~1 h* _% N7 T4 c9 t) \9 y7 K - for(i=0; i< RxCounter1; i++){4 F( ^. ~5 l* D; j [; N
- TxBuffer1[i] =msg[i];
1 ^- Q u8 Z) f! P' e, r9 k6 z. w - }- C& h3 s* ~5 t7 M
- TxBuffer1[RxCounter1]=0;: Z+ d8 {! v; l1 ~% k/ r
- RxCounter1=0;
1 n- O) q( _' e, {$ l5 T - //OSSemPost(Com1_SEM);
7 c0 |$ f- ?( s' S- V: | - OSMboxPost(Com1_MBOX,(void *)&msg); 5 C7 B- U# f$ q# p- o! U
- }- b! |7 S* m4 E: f* f- [
- }% D" ~" s L2 h% n
- if(USART_GetITStatus(USART1, USART_IT_TXE) != RESET)0 b, d/ Z' D5 u% j5 V
- {
& B! {' _# W& n% r5 e" ~7 \! \ - USART_ITConfig(USART1, USART_IT_TXE, DISABLE);
. c3 o6 H$ E$ I - }
9 N0 O' l% n# H - OSIntExit();
9 b2 b8 y6 V1 ^4 N& T& ]0 w - }5 m1 b6 r( N& V, v
复制代码 APP.c文件中新建消息邮箱处理函数:
6 b( o7 n0 ~. Z* r0 }
4 m! @. C8 ] w J! Z1 l2 k- static void Task_Com1(void *p_arg){
7 H# n Z$ W3 ?4 o - INT8U err; j# u" Q: g5 L" r% M
- unsigned char * msg;
6 i1 F# @2 c+ ]4 Y% Z7 J( N - (void)p_arg;
9 i& u O7 g9 m& L* A3 i) |5 ] - while(1){
* m0 a: {; A' N; h% [: m- U4 ` - msg=(unsigned char *)OSMboxPend(Com1_MBOX,0,&err);2 x; Q9 w# S/ r# u9 I, `$ @4 Q# _& H- M
- if(msg[0]=='L'&&msg[1]=='1'){
; L. L" o; P! y$ F - milsec1=atoi(&msg[3]);
* k0 u1 e- G6 W* E! i3 e - USART_OUT(USART1,"\r\n");
2 h) Y" t% ~9 p2 a$ G1 c - USART_OUT(USART1,"LED1: %d ms delay",milsec1);3 j d2 Z& ^9 G4 R) E8 @
- USART_OUT(USART1,"\r\n");$ G. u1 {. ]- f/ n/ g; c* h
- }else if(msg[0]=='L'&&msg[1]=='2'){ K9 N- X z5 P& C" X8 h
- milsec2=atoi(&msg[3]);
* Z6 D9 y' K0 R - USART_OUT(USART1,"\r\n");
" t* L" y! F! h" b - USART_OUT(USART1,"LED2: %d ms delay",milsec2);
4 V) g# N; F6 m9 Q2 G/ l8 D - USART_OUT(USART1,"\r\n");$ X$ u( T# v I& {
- }
; E- }4 \6 t& L1 P( [ - }
9 @6 a) k1 }* S0 f3 [' L: Y; |' D - }, ~! y0 D0 U% c( m. t
复制代码 并添加该任务:3 B! R& ]8 `1 c' O+ S; r
- OSTaskCreateExt(Task_Com1,(void *)0,(OS_STK *)&Task_Com1Stk[Task_Com1_STK_SIZE-1],/ Z0 Q9 a; N# t8 b: |& o! _
- Task_Com1_PRIO,Task_Com1_PRIO,(OS_STK *)&Task_Com1Stk[0],
0 O- A4 D8 a7 Z, t/ Q/ ` - Task_Com1_STK_SIZE,(void *)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);- P3 }4 L# @1 R3 Q# F, ^9 y) n* F
复制代码 新建一个头文件globals.h:1 L$ s2 S( v$ K, B Y% u6 T3 K
- #ifdef GLOBALS
: `# `: `( ^& n2 Y - #define EXT
7 Z0 D2 C8 U4 c/ l6 Y/ b2 {( L - #else* e2 b. s1 N- H. y' N* Y0 ~) |
- #define EXT extern E' B& c3 P# o+ s
- #endif8 m6 z$ r4 K; o
-
7 Z$ r$ V( M8 f4 j ? -
g; z$ x/ L8 x( T) H% M - EXT unsigned char TxBuffer1[400];
7 H3 W- f+ e: H' T% w% X$ \$ W$ L - / s7 \+ k. ?2 w0 A
- EXT unsigned char TxBuffer2[];
$ Q+ {2 v! H$ h9 l: J- M2 o, X) M N - EXT unsigned char RxBuffer1[400];
% h; M1 t3 |, r9 y. N. r$ u - EXT unsigned char RxBuffer2[];& x3 s6 ^# s- s, C% C Q4 X
- EXT unsigned char TxCounter1;
$ k8 I3 T# d" y - EXT unsigned int TxCounter2;: u. r. t. y: r4 Q
- EXT volatile unsigned int RxCounter1;
$ S% z* r- U4 { - EXT volatile unsigned int RxCounter2;
. H% M0 O% e! J - 7 L$ X. y& V/ R! T, n0 d6 L9 c! w
- EXT volatile unsigned char rec_f,tx_flag;# e$ h$ A* j6 e$ p
- EXT volatile unsigned long Rec_Len; % w/ K/ [9 {3 D% K2 x
- EXT volatile unsigned int milsec1,milsec2,milsec3;
" i! _* C! y' R% K5 S) U" ~
复制代码 将 globals.h 文件 include 到 APP.c 和 stm32f10x_it.c 中,注意,在APP.c文件 中应该先define GLOBALS,即+ {1 h0 D" g ]1 m7 Q
- #define GLOBALS
# ?& l7 C) e) S -
' b* t& \1 ~9 _3 g) | - #include <globals.h>
复制代码 APP.c文件中添加全局变量:5 K2 w+ J6 J& v% I }: N; ~; n
, z4 h7 V) {) ?9 q, E2 ?stm32f10x_it.c 中也添加该变量: 7 _7 [8 n" G5 ^8 ]* Z& ~
- extern OS_EVENT* Com1_MBOX;
复制代码 6 U9 R; \% u2 t6 R; N/ d0 `
7 ^& O" M! G, { |