新人求助,如何用uart3实现printf

2019-07-20 22:12发布

RT,因为调试过程中UART1被其他功能占用,因此需要使用UART3打印数据到屏幕上。但是更改了fputc函数中的uart1为uart3之后仍无法实现。程序卡在
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
这个循环中。
个人认为可能原因是USART3出于某种原因没有成功能够发送数据,但具体细节及解决方案还是不清楚。

具体代码如下:
//加入以下代码,支持printf函数,而不需要选择MicroLIB   
#if 1
#pragma import(__use_no_semihosting)            
//标准库需要的支持函数               
struct __FILE
{
int handle;
};
FILE __stdout;      
//定义sys_exit()以避免使用半主机模式
_sys_exit(int x)
{
x = x;
}
//重定义fputc函数
int fputc(int ch, FILE *f)
{      
while((USART3->SR&0X40)==0);//循环发送,直到发送完毕
    USART3->DR = (u8) ch;      
return ch;
}
#endif

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
9条回答
Cuifamily111
1楼-- · 2019-07-21 21:02
zejack 发表于 2019-7-18 16:50
#include "sys.h"
#include "stdio.h"
#include "string.h"

好的,我有空试试。现在又有新BUG出来了。
1599064432
2楼-- · 2019-07-22 00:19
Cuifamily111 发表于 2019-7-18 16:39
有初始化,可以看下面的图。

#include "usart.h"
#include "pms5003.h"
#include "stdio.h"

extern uint8_t data_cnt;
extern uint8_t counter;

void usart_config(void)
{
  //1:打开GPIO ,USART3的时钟
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOC,ENABLE);
  
  //2:初始化相应的串口引脚
  usart_release_gpio_int();
  
  //3:配置串口模式
  usart_para_config();
  
  //4:配置串口中断
  usart_nvic_config();
}

void usart_release_gpio_int(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
   
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11;                   //USART3
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  GPIO_Init(GPIOC,&GPIO_InitStructure);
  
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource10, GPIO_AF_1);         //TX            
  GPIO_PinAFConfig(GPIOC, GPIO_PinSource11, GPIO_AF_1);         //RX  
}

void usart_para_config(void)
{
  USART_InitTypeDef USART_InitStructure;
  
  USART_InitStructure.USART_BaudRate = 9600;         /*波特率*/
  USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;   /*流控*/
  USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx;
  USART_InitStructure.USART_WordLength = USART_WordLength_8b;    /*数据位,8*/
  USART_InitStructure.USART_Parity = USART_Parity_No;            /*校验位,n*/
  USART_InitStructure.USART_StopBits = USART_StopBits_1;         /*停止位,1*/
  USART_Init(USART3,&USART_InitStructure);
  
  USART_ClearFlag(USART3,USART_FLAG_TC);                    //清除发送完成标志位
  USART_Cmd(USART3,ENABLE);                                 //使能串口3
  
  USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);
}

int fputc(int ch, FILE *f)                                    //IAR重定向printf函数
{
  //while (USART_GetFlagStatus(USART3,USART_FLAG_TC)  ==  RESET )
  while (USART_GetFlagStatus(USART3,USART_FLAG_TXE)  ==  RESET )
  {
   
  }
  USART_SendData(USART3,(uint8_t) ch);
  return ch;
}


参考一下我这个吧,
Cuifamily111
3楼-- · 2019-07-22 04:55
1599064432 发表于 2019-7-18 16:53
#include "usart.h"
#include "pms5003.h"
#include "stdio.h"

谢谢,我有空试试。

一周热门 更多>