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

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

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

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

  2. //重写这个函数就可以了
  3. #ifdef _PRINTF_
  4. int fputc(int ch, FILE *f)
  5. {
  6.    USART_SendData(USART3, (u8) ch);

  7.    while(!(USART_GetFlagStatus(USART3, USART_FLAG_TXE) == SET))
  8.    {
  9.    }

  10.    return ch;
  11. }
  12. #endif
复制代码


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

初始化设置:
  1. void Uart_RccInit(void)
  2. {
  3.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOBs);
  4.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  5. }

  6. void Uart_GpioInit(void)
  7. {
  8.     GPIO_InitTypeDef GPIO_InitStructure;
  9.    
  10.     //PB10作为US1的TX端,打开复用,负责发送数据
  11.     GPIO_StructInit(&GPIO_InitStructure);
  12.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  13.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  14.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度设置,不设置可能导致无输出
  15.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  16.    
  17.     //PB11作为US1的RX端,负责接收数据
  18.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
  19.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  20.     GPIO_Init(GPIOB, &GPIO_InitStructure);
  21. }

  22. void Uart_UartInit(void)
  23. {
  24.     USART_InitTypeDef USART_InitStructure;
  25.    
  26.     USART_StructInit(&USART_InitStructure);
  27.     USART_InitStructure.USART_BaudRate = 9600;
  28.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;
  29.     USART_InitStructure.USART_StopBits = USART_StopBits_1;
  30.     USART_InitStructure.USART_Parity = USART_Parity_No;
  31.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
  32.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  33.     USART_Init(USART3, &USART_InitStructure);
  34.    
  35.    // USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);
  36.     USART_Cmd(USART3, ENABLE);

  37. }
复制代码


收藏 评论0 发布时间:2022-2-4 21:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版