STM32F1的USART3通讯问题

weixin_36247668 2018-10-18 07:53:28
void USART3_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3| RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOB, &GPIO_InitStructure);
/*USART3 mode config*/
USART_InitStructure.USART_BaudRate=9200;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART3,&USART_InitStructure);
USART_Cmd(USART3,ENABLE);
}

int fputc(int ch,FILE *f)
{
USART_SendData(USART3,(unsigned char)ch);
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)!=SET);
return(ch);
}

static char *itoa(int value, char *string, int radix)
{
int i, d;
int flag = 0;
char *ptr = string;

/* This implementation only works for decimal numbers. */
if (radix != 10)
{
*ptr = 0;
return string;
}

if (!value)
{
*ptr++ = 0x30;
*ptr = 0;
return string;
}

/* if this is a negative value insert the minus sign. */
if (value < 0)
{
*ptr++ = '-';

/* Make the value positive. */
value *= -1;
}

for (i = 10000; i > 0; i /= 10)
{
d = value / i;

if (d || flag)
{
*ptr++ = (char)(d + 0x30);
value -= (d * i);
flag = 1;
}
}


void USART3_printf(USART_TypeDef* USARTx, uint8_t *Data,...)
{
const char *s;
int d;
char buf[16];

va_list ap;
va_start(ap, Data);

while ( *Data != 0)
{
if ( *Data == 0x5c )
{
switch ( *++Data )
{
case 'r':
USART_SendData(USARTx, 0x0d);
Data ++;
break;

case 'n':
USART_SendData(USARTx, 0x0a);
Data ++;
break;

default:
Data ++;
break;
}
}
else if ( *Data == '%')
{
switch ( *++Data )
{
case 's':
s = va_arg(ap, const char *);
for ( ; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;

case 'd':
d = va_arg(ap, int);
itoa(d, buf, 10);
for (s = buf; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
Data++;
break;
default:
Data++;
break;
}
} /* end of else if */
else USART_SendData(USARTx, *Data++);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET );
}
}
这个是STM32开发书中的程序,我想问一下各位为什么在我运行程序时一旦运行到while( USART_GetFlagStatus(USARTx, USART_FLAG_TC) == RESET)就一直陷入死循环,卡在那里运行不下去呢?到底哪里有问题?
...全文
509 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
DigCore 2018-10-29
  • 打赏
  • 举报
回复
这行代码错误!!!
RCC_APB2PeriphClockCmd(RCC_APB1Periph_USART3| RCC_APB2Periph_GPIOB,ENABLE);

其中RCC_APB1Periph_USART3这个结构体只能用RCC_APB1PeriphClockCmd 接口来使能USART3外设的始终。

给你附个截图,好好看看RCC_APB1PeriphClockCmd 和 RCC_APB2PeriphClockCmd函数前面的注释信息:



更多技术博文分享,访问http://www.digcore.cn
yishumei 2018-10-19
  • 打赏
  • 举报
回复
会不会是波特率的问题,USART_InitStructure.USART_BaudRate=9200; 改成USART_InitStructure.USART_BaudRate=19200(或者9600); 试试

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧