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
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
好的,我有空试试。现在又有新BUG出来了。
#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;
}
参考一下我这个吧,
谢谢,我有空试试。
一周热门 更多>