寄存器中波特率的算法
2.串口的配置过程
(1)Usart_Init()
{
1.GPIO口配置:复用推挽输出、浮空输入
2.USART配置:USART_Init()、USART_Cmd();波特率、数据位、校验位、停止位、无硬件控制流、收发模式
}
(2)串口接收函数Usart_Rx()
{
1.while()//判断接收数据寄存器非空标志--等待接收,当TDR寄存器中的数据被硬件转移到移位寄存器的时候,该位被硬件置位。0--未转移完
while((USART1->SR &(1<<5))==0);或是while(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)==RESET);
2.返回接收的数据
RxData=USART_ReceiveData(USART1);return RxData;
或者是return USART1->DR;
}
(3)串口发送函数Usart_Tx(data)
{
1.//发送完成---0:发送还未完成;
while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);
2.发送接收的数据USART_SendData(USART1,TxData);或者USART1->DR = data;
}
(4)回显函数
{
先接收:同接收函数
再发送:同发送函数
}
(5)重定义fputc
//往串口输出--在串口上显示
int fputc(int c, FILE * stream)
{
//判断上次数据是否发送完成
while((USART1->SR &(1<<7))==0);
USART1->DR = c;
return c;
}
方法二:
//重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
/* 发送一个字节数据到串口 */
USART_SendData(DEBUG_USARTx, (uint8_t) ch);
/* 等待发送完毕 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);
return (ch);
}
///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{
/* 等待串口输入数据 */
while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);
return (int)USART_ReceiveData(DEBUG_USARTx);
}
。。。。。。。这里面涉及到了SR寄存器的6位和7位的不同,一个是判断全部完成,一个位6是数据寄存器数据发送完成,但移位寄存器未将数据发送完成,两者进行读写判断时都可以。