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

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

[复制链接]
STMCU小助手 发布时间:2022-2-4 21:00
    在调试电机驱动程序的时候,是不能随便利用中断来进行一些寄存器或数据的查看的,不然你在运行的时候突然来一下,如果占空比大的话那可能直接就把MOS管给烧了,所以我们很多情况下只能使用USART(串口)来进行程序的调试和数据的监控了。
    对于STM32来说,由于很多内容都是有库来实现的,那就省了很多时间,直接看个例子就可以写了,大致有4步步骤:
1、RCC始终初始化,对端口和USARTX使能时钟
6 X; t$ p* S6 [6 H: o4 R/ K  V2、初始化端口功能,RX设置为输入悬空,TX设置为复用功能的推挽输出,注意GPIO_SPEED要设置下,我没设置弄了半天都没输出
4 }' [  g( p) w. _+ y) Y3、设置USARTX寄存器,波特率、数据位、校验位、停止位等
6 b* I, H# u% D+ W/ S4、看需要是否开中断,我这里没开* n1 L3 L  v5 e

  q9 s; b" U' U$ U& c' E9 a
    设置完后其实是可以发简单的数据了,不过如果要实现一些复杂的输出就需要自己去写相应的函数,还不一定能都实现,那该怎么才能跟好实现串口的数据输出呢?
     这里就可以用到Printf函数,之前一直看个可以重定向这个函数来出现输出,就是以前片子资源少,就没想过用这个函数了,现在就有机会试试了。查了下,发现其实还是很简单的,就是重定向一个函数就好了。
  1. #include <stdio.h>//标准的库函数
    ( }! d/ g/ ~  n0 ^8 X% _7 F; s
  2. 4 |7 w( ~5 l7 K) w! K: o
  3. //重写这个函数就可以了' O2 l, |8 G5 [
  4. #ifdef _PRINTF_
    ( V# H; [; J: x7 r
  5. int fputc(int ch, FILE *f), N' i2 V! n3 S
  6. {
    5 v8 G/ _) T2 p7 Q9 X
  7.    USART_SendData(USART3, (u8) ch);2 {/ n" H9 ?& k! l7 d5 [% q# g  P

  8. + k5 @; s- W0 p0 r$ `% n6 m$ Q
  9.    while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))
    ( W$ j7 S1 e( h8 {
  10.    {
    % N+ l9 _' y3 ?6 i# M8 B2 ~' {
  11.    }
    6 V' L8 I! G9 f2 f& ~' B. N
  12. ) P2 i/ s* e0 q$ {  U# a9 t" R
  13.    return ch;6 B! r8 V* R3 Y, o, `
  14. }1 _$ ^2 a" }' r6 _% P) g
  15. #endif
复制代码
+ y7 l  b/ o* l# |, g
# G6 k: y0 q* L; _
    还有修改下IDE的设置,我的是用IAR,进到option->general option->library configuration下,把library从normal改为full,好了,下面使用printf输出数据就OK了,对于调试来说还是相当好用的。
, R5 j  ~  ~6 [$ \# y# X  c5 b* r
初始化设置:
  1. void Uart_RccInit(void)# [+ U$ P; ~" d9 o0 x% j. t  ~
  2. {
    - p  K9 ~# B0 X: W/ h% K8 D" u
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);
    % _& A& o4 r* Y" C. E
  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);0 l/ O, R" D' [& N% h
  5. }
    % t9 u) c. d7 l9 \" Z9 `
  6. " {# K+ D* W& j, k6 g% V
  7. void Uart_GpioInit(void)
    3 ?$ ^( A8 C; y$ y$ M; \
  8. {
    ! E" J' J, T1 z9 ~$ Z" K
  9.     GPIO_InitTypeDef GPIO_InitStructure;' T; a6 ?' V+ |5 `2 X& \8 m/ k8 r) J
  10.    
    : `5 M2 u! G$ F9 I* x( W6 \: i
  11.     //PB10作为US1的TX端,打开复用,负责发送数据6 |+ ^$ G6 h3 `; p0 ^
  12.     GPIO_StructInit(&GPIO_InitStructure);
    3 _9 V$ ~1 x4 H0 l' K& i  r
  13.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;6 P/ o# S8 l6 [. `  J
  14.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;$ f0 F" ^. Z8 u" v/ v; z
  15.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出( O; F" u+ x0 a* S8 e/ g
  16.     GPIO_Init(GPIOB, &GPIO_InitStructure);
    ; z) S9 {; j  i9 t+ X% @
  17.       ~0 t- v# y! @+ |; d
  18.     //PB11作为US1的RX端,负责接收数据; c4 |* q' x+ ~% w5 Y' Y# [. D1 L7 N
  19.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;/ ~% ]) l! Z  J$ g. n
  20.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;$ e: o: X0 Q& u" m2 {4 W
  21.     GPIO_Init(GPIOB, &GPIO_InitStructure);8 P0 M, q8 O5 u3 V$ ^- h& ]  k
  22. }0 O7 ~* r& b7 n, ~& ~

  23. 3 E! c8 n8 {' P4 i
  24. void Uart_UartInit(void)& ~8 [4 R% e% Q* S, @; {
  25. {% M/ {9 D& l* c" a! K* _6 [; C# Z
  26.     USART_InitTypeDef USART_InitStructure;
    0 d2 R; b6 I4 t- J9 \  h
  27.     ! K9 O3 k2 y: M0 c- o
  28.     USART_StructInit(&USART_InitStructure);( R) O3 r7 ?! x6 B& ~5 h3 z
  29.     USART_InitStructure.USART_BaudRate = 9600;
    3 [) R0 N0 z7 Y$ D* }, t
  30.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
    ! a7 v' _6 L! x: B
  31.     USART_InitStructure.USART_StopBits = USART_StopBits_1;0 L& z9 o. @9 V4 x
  32.     USART_InitStructure.USART_Parity = USART_Parity_No;
    9 V0 d0 O! n% Z" y
  33.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;8 z8 y' ?2 p# w" f, W* E
  34.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;# ]; }' m7 v" {
  35.     USART_Init(USART3, &USART_InitStructure);
    4 K  S; Z. n; _# V& o- z# l! W# \
  36.     ( q6 m$ R. Y& f0 e! ]
  37.    // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
    $ {7 E3 M# Y9 F" H
  38.     USART_Cmd(USART3, ENABLE);, `7 e9 p0 M, Y; k8 F

  39. : E- s, ?# Q* X' j7 n" z
  40. }
复制代码
2 s" P9 }1 C) u. s1 J: W

0 f% k* o! ?  v# k7 E
赞 收藏 评论0 发布时间:2022-2-4 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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