高级会员

- 积分
- 671
- 金钱
- 671
- 注册时间
- 2015-4-26
- 在线时间
- 173 小时
|
发表于 2016-5-23 09:37:45
|
显示全部楼层
网上关于发送字符的代码大多如下: USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);  其实咋一看是说的通的,但是在仔细看手册的时候发现 TC 和 TXE 标志位在复位的时候被置1 ,这样第一次while循环就是没有用的。这样导致了首次第一个字符还没有被输出,就被后面的字符覆盖掉,造成实际看到的丢失现象。解决办法就很简单:在前面加上一句 USART1->SR;  具体代码如下: USART1->SR;  USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET);  下面我来说说原因: 第一句读取SR寄存器,第二句写DR寄存器 刚好清除了TC标志位 。第一次while循环就起作用了。   我在使用库函数中的printf函数时,添加的fputc函数。 int fputc(int ch, FILE *f) {     /* TC TXE 标志位在复位的时候被置1 */  /*第一句读取SR寄存器,第二句写DR寄存器*/  /* 如果不这样操作,首次发送的第一个字符会丢失 */ USART1->SR;  USART_SendData(USART1, (uint8_t)ch);  while( USART_GetFlagStatus(USART1, USART_FLAG_TC) != SET); return (ch); }   也可将USART1->SR;替换为USART_GetFlagStatus(USART1, USART_FLAG_TC) |
|