串口--USART1

寄存器中波特率的算法

TX/RX波特率=fck/(16*USARTDIV)
fck:串口时钟频率
TX/RX波特率:用户设置的波特率,即串口发送数据的实际波特率,如9600、115200等
USARTDIV:写入到波特率寄存器中的数值,是一个浮点数
1.计算:fck=72000000Hz
              TX/RX波特率=9600

 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);
}

猜你喜欢

转载自www.cnblogs.com/juan-4-14/p/12976645.html