|
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。 对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤: 1、RCC始终初始化,对端口和USARTX使能时钟7 S9 u3 P$ \7 j& L& |* _9 s3 G! H
2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出3 [$ k9 K5 A) f ?' a
3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
2 @* w" b! B# l4 I4、看需要是否开中断,我这里没开8 M/ K0 D( ]1 ^ I# n
# g3 f- ?, `1 d! M" T. s& d 设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢? 这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。 - #include <stdio.h>//标准的库函数& v0 U7 |; _) j, ]
- . p; z& R: _( B7 v g
- //重写这个函数就可以了
2 i' ], }" J. g. ~! M6 y - #ifdef _PRINTF_$ c# x$ X; r. O
- int fputc(int ch, FILE *f)
7 r& a! W5 ?9 d. F - {
3 H. S C7 K1 n& b) j! E - USART_SendData(USART3, (u8) ch);
# K V9 w- D% B" [# ^
4 v1 t' H8 {" j, j7 _( K( p- while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))1 e2 _, a0 p5 ~6 _- |2 S
- {1 y: A9 z6 q3 x0 U6 i
- }
) K& q' |. }4 w! \# Z+ P1 | - ; h/ K* c. x/ \$ r$ x
- return ch;( D- q" |/ R. i) i4 C# T+ V6 @# U. V
- }9 i- ` H( P( D! h7 y
- #endif
复制代码
- ]) P; i- Q- @. [' x
! b9 Z0 }, l* A, j& z 还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。
; b/ ]& P3 c7 Y4 q. k初始化设置: - void Uart_RccInit(void)) B' Z1 b* o$ s0 [+ u: T
- {4 l% S" |. L! L4 y, a6 B
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);( e# n1 Q. L# f: m/ p
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);! B3 L# A o8 F; u2 d. i
- }! }% j" Y" Z2 F2 Z* l o
" y H) Q3 O& b8 t/ j4 B5 ~* x- void Uart_GpioInit(void)
4 U- K% @2 R) s) I8 D' o; f7 z - {
; q% d- d) y* s a2 b$ B - GPIO_InitTypeDef GPIO_InitStructure;
& r. D q8 P# D5 D" T- h7 g: \2 S3 E - 4 I% }; G/ e- t; d5 q
- //PB10作为US1的TX端,打开复用,负责发送数据
$ a& W8 l* x' n5 ]+ X - GPIO_StructInit(&GPIO_InitStructure);# P& @. t, ]: }, z
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
7 {! ^' d0 c9 _ - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
5 a, X8 o: n, @; f9 v" B$ O# \& r# S - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出
+ Z. K6 ~- m, i9 }# o/ R - GPIO_Init(GPIOB, &GPIO_InitStructure);% ~# S( S# \9 m% s# }
- ' g$ t1 f7 N5 l; T' B, x6 ?
- //PB11作为US1的RX端,负责接收数据8 |) i' y2 X" v* s! l( N
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
1 p( z" m% q* m6 t) V - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
: I9 G6 d, N) | - GPIO_Init(GPIOB, &GPIO_InitStructure);$ i, @; B1 o6 Q( X6 d; f
- }
; J: c; d2 o. `- m, U& Q) ~
% H" h, c0 m( E- void Uart_UartInit(void)
) T: a; g6 Y' v- g3 u# @8 | - {
1 B% I; |$ w" b! r# s2 B - USART_InitTypeDef USART_InitStructure;7 s) k. _6 C0 V0 }
-
/ d$ w* s6 ^& N, Z - USART_StructInit(&USART_InitStructure);3 W. J. l/ a8 [+ X2 w0 I& F3 Q
- USART_InitStructure.USART_BaudRate = 9600;* H q4 D. @; ]' B$ o3 Q8 E
- USART_InitStructure.USART_WordLength = USART_WordLength_8b;( N+ e0 R% |. a4 ?
- USART_InitStructure.USART_StopBits = USART_StopBits_1;8 x" Q( ]1 K7 X0 O1 i+ M8 @4 f1 {
- USART_InitStructure.USART_Parity = USART_Parity_No;
# D) w* _) t0 e% l0 M1 S - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
; |8 \) e1 M+ u - USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;( b' ]# c; d0 h- A3 J+ f
- USART_Init(USART3, &USART_InitStructure);
* M* H8 X' i' T5 H -
9 {& _ Q3 P% l* r3 V - // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
3 P! q- z8 h+ J5 l+ e - USART_Cmd(USART3, ENABLE);/ |; l( ]. t# c7 R; b
5 O# m8 E' \8 Q! F$ U+ W- }
复制代码
2 ?" m- O. ?( E4 Z: E( W
' l, d. Y$ H9 A. n" P' S/ ] |