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

【经验分享】实现STM32的串口数据发送和printf函数重定向

[复制链接]
STMCU小助手 发布时间:2022-2-4 21:00
    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把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函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
  1. #include <stdio.h>//标准的库函数
    5 F7 P& P  Z$ Z7 C& k/ `  V
  2. ) ~$ u$ z0 K- S+ T: p- G
  3. //重写这个函数就可以了
      L) k. J% F1 A7 Z& r9 i7 V1 m
  4. #ifdef _PRINTF_
    4 F. F! t7 Q& j. j- r  \1 k# j& s8 j, X
  5. int fputc(int ch, FILE *f)
    " K1 h# i. [3 u" `
  6. {
    7 [1 S; R6 A7 x) r6 K* H  y
  7.    USART_SendData(USART3, (u8) ch);- E6 a& H/ G' g3 B: _
  8. " g. ^9 u  D; m  Z; i* R1 L9 v  ^
  9.    while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))
    0 ~3 z4 g) O4 B# [5 |  l
  10.    {
    2 ~! D( f) H. S: ~. C& B3 q. r1 i1 j
  11.    }# F7 M( h' M2 Q8 X

  12. . g/ t" |7 F& H, ~' [( _% {
  13.    return ch;# ~6 h: c& q0 ]8 o- Y" _! }
  14. }
    : A2 E" r7 t0 f9 s( \0 K% v
  15. #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- \( ]
初始化设置:
  1. void Uart_RccInit(void)4 f' ~$ {( A5 c9 m. Y7 j' c
  2. {; f' n" G& U; m1 I  X( q' q' J" Q
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);
    ; K# Y' ^9 Z9 v- c; T7 c
  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);6 S. r6 f3 I0 e( X
  5. }
    & v1 `* O" K) T/ H9 h; t- _3 H1 l/ h9 |
  6. ) T* U. V2 f5 z6 D
  7. void Uart_GpioInit(void)* G* b' g( `+ f! C2 ?
  8. {+ ^) `7 O7 j, o) _
  9.     GPIO_InitTypeDef GPIO_InitStructure;4 _: ?, ]$ c' s& S  U: U0 n
  10.    
    - }: Y6 W; b( r3 U9 K
  11.     //PB10作为US1的TX端,打开复用,负责发送数据7 Q' |$ C+ v" I" y5 W$ V
  12.     GPIO_StructInit(&GPIO_InitStructure);& f, ^' ?7 m4 s
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;% X1 v, {1 \( [
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    5 f7 k- s) U: l0 w, E
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出1 L8 P! x& f. f1 l; c" s  C' T
  16.     GPIO_Init(GPIOB, &GPIO_InitStructure);2 w: r3 l* a, X; Z
  17.    
      K: R& H' P/ x/ |/ Y' f1 g$ ~
  18.     //PB11作为US1的RX端,负责接收数据
    1 e/ g0 Q' U% p) [( B
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    5 i; L  t6 G1 T  A5 O0 F% S! ]2 o
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    0 M- ]+ s$ }. g& K7 O
  21.     GPIO_Init(GPIOB, &GPIO_InitStructure);: ?, M7 _9 o' b* r
  22. }7 D$ f, X% F$ w; p& ?/ w" l  N

  23. ( J2 B! ~' T% ^
  24. void Uart_UartInit(void)( x% U. u& T5 g2 V/ _& W( u
  25. {0 t, [7 X& g0 y8 {! [
  26.     USART_InitTypeDef USART_InitStructure;
    9 H5 ?8 ~! @5 ^' _; ~( }- F
  27.     - x& `+ \( l; ^
  28.     USART_StructInit(&USART_InitStructure);5 G  r2 z4 o- y0 m0 @0 k9 {
  29.     USART_InitStructure.USART_BaudRate = 9600;
    * M8 Z3 F. M2 L$ K$ q
  30.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;6 W9 P5 y/ N% [- h4 `
  31.     USART_InitStructure.USART_StopBits = USART_StopBits_1;, A# f) \  g+ |4 J# c: i, J
  32.     USART_InitStructure.USART_Parity = USART_Parity_No;
    / N, a/ Z5 E# l1 R
  33.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;  i  ^; q. k9 E0 x9 J# f, [
  34.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;1 Q2 q% h0 m# [' k9 ]4 S
  35.     USART_Init(USART3, &USART_InitStructure);1 K; h& ~6 [$ U/ Z; j
  36.     , V6 M8 c, O: c$ t
  37.    // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);) i4 G( h9 n1 P
  38.     USART_Cmd(USART3, ENABLE);
    8 g2 ]* }! W0 T. A
  39. ' B/ B$ O0 `7 _4 p  X  }% C
  40. }
复制代码

: y$ w1 K: w& I. Q* [' J2 e: L$ k: V2 U, e: t
收藏 评论0 发布时间:2022-2-4 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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