• 串口--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);
    }

    。。。。。。。这里面涉及到了SR寄存器的6位和7位的不同,一个是判断全部完成,一个位6是数据寄存器数据发送完成,但移位寄存器未将数据发送完成,两者进行读写判断时都可以。

  • 相关阅读:
    ELK环境搭建
    django orm 操作表
    django1.11入门
    CentOS7 yum安装python3.6
    完美的【去重留一】SQL
    CentOS7安装docker
    【Jenskins】安装与配置
    【Linux】网卡配置与绑定
    【SaltStack】一些常用模块举例
    【SaltStack】通过Master给Minion安装MySQL
  • 原文地址:https://www.cnblogs.com/juan-4-14/p/12976645.html
Copyright © 2020-2023  润新知