|
在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。 对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤: 1、RCC始终初始化,对端口和USARTX使能时钟
& E" Q1 G5 \; ?, ]2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出7 R+ W! f: y4 G K
3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
5 X# Z& q8 m7 {9 b4、看需要是否开中断,我这里没开
# ]* h1 a; O0 _1 D' D4 B/ `9 S9 Y& @* c* Q* w" l2 H) W
设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢? 这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。 - #include <stdio.h>//标准的库函数
5 F7 P& P Z$ Z7 C& k/ ` V - ) ~$ u$ z0 K- S+ T: p- G
- //重写这个函数就可以了
L) k. J% F1 A7 Z& r9 i7 V1 m - #ifdef _PRINTF_
4 F. F! t7 Q& j. j- r \1 k# j& s8 j, X - int fputc(int ch, FILE *f)
" K1 h# i. [3 u" ` - {
7 [1 S; R6 A7 x) r6 K* H y - USART_SendData(USART3, (u8) ch);- E6 a& H/ G' g3 B: _
- " g. ^9 u D; m Z; i* R1 L9 v ^
- while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))
0 ~3 z4 g) O4 B# [5 | l - {
2 ~! D( f) H. S: ~. C& B3 q. r1 i1 j - }# F7 M( h' M2 Q8 X
. g/ t" |7 F& H, ~' [( _% {- return ch;# ~6 h: c& q0 ]8 o- Y" _! }
- }
: A2 E" r7 t0 f9 s( \0 K% v - #endif
复制代码 & b# y( R# ?, k' J4 t
* O$ |; E6 U8 `* z0 T2 T 还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。
* c- \0 s9 B' z- \( ]初始化设置: - void Uart_RccInit(void)4 f' ~$ {( A5 c9 m. Y7 j' c
- {; f' n" G& U; m1 I X( q' q' J" Q
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);
; K# Y' ^9 Z9 v- c; T7 c - RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);6 S. r6 f3 I0 e( X
- }
& v1 `* O" K) T/ H9 h; t- _3 H1 l/ h9 | - ) T* U. V2 f5 z6 D
- void Uart_GpioInit(void)* G* b' g( `+ f! C2 ?
- {+ ^) `7 O7 j, o) _
- GPIO_InitTypeDef GPIO_InitStructure;4 _: ?, ]$ c' s& S U: U0 n
-
- }: Y6 W; b( r3 U9 K - //PB10作为US1的TX端,打开复用,负责发送数据7 Q' |$ C+ v" I" y5 W$ V
- GPIO_StructInit(&GPIO_InitStructure);& f, ^' ?7 m4 s
- GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;% X1 v, {1 \( [
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
5 f7 k- s) U: l0 w, E - GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出1 L8 P! x& f. f1 l; c" s C' T
- GPIO_Init(GPIOB, &GPIO_InitStructure);2 w: r3 l* a, X; Z
-
K: R& H' P/ x/ |/ Y' f1 g$ ~ - //PB11作为US1的RX端,负责接收数据
1 e/ g0 Q' U% p) [( B - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
5 i; L t6 G1 T A5 O0 F% S! ]2 o - GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
0 M- ]+ s$ }. g& K7 O - GPIO_Init(GPIOB, &GPIO_InitStructure);: ?, M7 _9 o' b* r
- }7 D$ f, X% F$ w; p& ?/ w" l N
( J2 B! ~' T% ^- void Uart_UartInit(void)( x% U. u& T5 g2 V/ _& W( u
- {0 t, [7 X& g0 y8 {! [
- USART_InitTypeDef USART_InitStructure;
9 H5 ?8 ~! @5 ^' _; ~( }- F - - x& `+ \( l; ^
- USART_StructInit(&USART_InitStructure);5 G r2 z4 o- y0 m0 @0 k9 {
- USART_InitStructure.USART_BaudRate = 9600;
* M8 Z3 F. M2 L$ K$ q - USART_InitStructure.USART_WordLength = USART_WordLength_8b;6 W9 P5 y/ N% [- h4 `
- USART_InitStructure.USART_StopBits = USART_StopBits_1;, A# f) \ g+ |4 J# c: i, J
- USART_InitStructure.USART_Parity = USART_Parity_No;
/ N, a/ Z5 E# l1 R - USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; i ^; q. k9 E0 x9 J# f, [
- USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;1 Q2 q% h0 m# [' k9 ]4 S
- USART_Init(USART3, &USART_InitStructure);1 K; h& ~6 [$ U/ Z; j
- , V6 M8 c, O: c$ t
- // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);) i4 G( h9 n1 P
- USART_Cmd(USART3, ENABLE);
8 g2 ]* }! W0 T. A - ' B/ B$ O0 `7 _4 p X }% C
- }
复制代码
: y$ w1 K: w& I. Q* [' J2 e: L$ k: V2 U, e: t
|