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

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

[复制链接]
STMCU小助手 发布时间:2022-2-4 21:00
    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。
    对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤:
1、RCC始终初始化,对端口和USARTX使能时钟2 I! q4 x3 d4 {: w# S1 x
2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
. M7 _3 N9 L- Z2 S  n3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
& f! o% W' ?  i+ O. U5 |4、看需要是否开中断,我这里没开, z5 ~4 F7 {& _# ~, T. W/ _& B

- g( \, R8 l# G8 V+ v* O% p
    设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢?
     这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
  1. #include <stdio.h>//标准的库函数
    2 h' t9 M# y4 r. t+ Q

  2.   |1 u6 h4 p, B' S/ s% ~
  3. //重写这个函数就可以了
    - A9 q1 R1 G5 K+ P1 I' t6 ]
  4. #ifdef _PRINTF_
    " F* ~( r+ W  d+ L  x& A, W5 S" a% O
  5. int fputc(int ch, FILE *f)
    & ]4 X* I. c0 }3 L4 U1 K* A- \6 r
  6. {
    , G4 w( P$ q8 M0 b. N2 r# x5 z0 p
  7.    USART_SendData(USART3, (u8) ch);% ^; h0 h0 {' t2 W6 [3 o

  8. . G6 z& Y  E6 [2 i6 D
  9.    while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))- D9 Y3 z, F7 ]: F( h
  10.    {8 M! j7 a- i+ [1 v6 w
  11.    }
    # n+ v  i; L9 c- |" s( n# s' h
  12. ( E, k4 U! p! m' Z
  13.    return ch;, d. ?- r# y# X* h
  14. }9 }7 F* D% ^* C5 s5 [
  15. #endif
复制代码
2 O0 n2 R/ q2 `+ T. p; B6 K3 u% o) A/ G' n$ w

  a" d# W- `) g3 `
    还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。

$ Q- C8 W1 s* s! f' o
初始化设置:
  1. void Uart_RccInit(void). M$ }, s9 ~% [7 m+ L' _0 }3 y( y
  2. {
    ( W; s4 l& B* W7 N
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);2 n" h/ f$ C( I2 W7 y+ c
  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
    7 {8 j. h- R3 |: X: G: A; V" K
  5. }0 F, }" H/ q& Q8 D4 Q' f

  6. * i5 q( w. e1 u8 t3 R4 M5 k
  7. void Uart_GpioInit(void)
    , c7 R, i, x  j7 O" \6 L
  8. {
    & A$ l9 u  v1 {" c
  9.     GPIO_InitTypeDef GPIO_InitStructure;
    3 w" _' i# Z! r0 w% R3 j
  10.     1 B9 J4 ~$ L- z7 h( P9 z8 z0 r
  11.     //PB10作为US1的TX端,打开复用,负责发送数据5 z0 _- P: a( B1 e) g6 e6 e
  12.     GPIO_StructInit(&GPIO_InitStructure);. D% o5 Z: E' x2 @) ]: u3 N. Z: n
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;: B, D, n+ b3 q5 ]2 Y
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    ! M) j; }9 @: I
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出3 q% N9 }' L5 J0 W2 Q
  16.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    % ^$ f' n5 u2 {. g# v
  17.       A& Z4 ]  n9 l9 D3 s
  18.     //PB11作为US1的RX端,负责接收数据$ Y1 g: ^! G6 Q* j* X7 B7 w
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
    ( j# Q. B8 e' }4 v  j  q! ^& o
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
    : q4 G8 @3 q: h1 o7 d* D
  21.     GPIO_Init(GPIOB, &GPIO_InitStructure);$ E. R# {8 p+ u& J! r8 O+ m
  22. }
    0 u4 p/ B+ E5 L* F
  23. 7 e  e- A" R$ @) ~2 k2 h. Y
  24. void Uart_UartInit(void)
      l. ?0 `1 O, E3 f
  25. {" l% t9 c1 T% [
  26.     USART_InitTypeDef USART_InitStructure;) s6 Y+ H5 J/ n- r+ d/ u
  27.    
    ! [5 l* `1 o8 ?4 d: }3 r; H
  28.     USART_StructInit(&USART_InitStructure);
    - ~& G4 M' T" v5 K
  29.     USART_InitStructure.USART_BaudRate = 9600;
    8 S; A7 y2 x. N$ H4 F
  30.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    , D3 b% [9 c- W9 v8 {' ]
  31.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
    " P. ~4 K- E/ [9 d/ Y4 `
  32.     USART_InitStructure.USART_Parity = USART_Parity_No;
    ; V1 V6 k& z5 D/ E4 }
  33.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;. w# v: _9 X2 V+ I% R+ P# E6 _8 m& P
  34.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;7 y: f! P- f* X; ~* S
  35.     USART_Init(USART3, &USART_InitStructure);
    0 ^8 y" L# `8 R! d  k1 x5 X: T
  36.     ( _# k5 Y2 X7 H* x1 c( Y8 G
  37.    // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    ) g+ u6 f* c7 E2 m5 ?8 a
  38.     USART_Cmd(USART3, ENABLE);
    * ?% h; Z& S0 P" A; e' z' y3 ?0 P

  39. + y* I) j; L5 g0 @. c! f  l* S
  40. }
复制代码
/ i3 L) O' @5 e: x2 u3 v
. i' Q' J  _! E( {
赞 收藏 评论0 发布时间:2022-2-4 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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