USART串口通信

相关通信的基本概念

  • 通信可分为:
    • 单工通信:任何时刻只能向一个方向传输数据
    • 半双工: 不可同时收发数据,但可分时收发
    • 全双工: 可同时收发数据
    • -
  • 通信还可分为,同步和异步两种
    • 有时钟信号的,都可认为是同步的!同步通信效率更高,但允许时钟误差较小。
    • 无时钟信号的,都可认为是异步的!异步通信为了保证数据传输的准确性,都会在原有数据基础上附带传输一些校验位,不需要时钟!
    • -

初始化串口通信的基本流程

  • 初始化与USART相关的GPIO
  • 配置USART相关的数据结构体,其中包括波特率配置
  • 如果接收数据采用中断的形式,那么还需要初始化串口中断,需要配置串口中断优先级(配置NVIC寄存器)

- 使能串口,主要是使能 USART_UE 位,以及使能串口接收中断!

/* 中断优先级配置函数 */
void Nvic_config(void)
{
    NVIC_InitTypeDef  Nvic_InitStruct;
        // 设置中断分组   
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    // 配置通道,设置USART为中断源
    Nvic_InitStruct.NVIC_IRQChannel = USARTx_IRQ;
    //使能中断
    Nvic_InitStruct.NVIC_IRQChannelCmd = ENABLE;
    // 配置主优先级
    Nvic_InitStruct.NVIC_IRQChannelPreemptionPriority = 1;
    // 配置子优先级
    Nvic_InitStruct.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&Nvic_InitStruct);

}

 /* 串口初始化函数 */
void USART_config(void)
{
    USART_InitTypeDef Usart_InitStruct;
    GPIO_InitTypeDef  Gpio_Tx_InitStruct, Gpio_Rx_InitStruct;

    /*初始化与USART相关的GPIO*/
        // 初始化接收端GPIO
    Gpio_Rx_InitStruct.GPIO_Pin = USARTx_Rx_GPIOPIN;
    Gpio_Rx_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    Gpio_Rx_InitStruct.GPIO_Mode = GPIO_Mode_IN_FLOATING;    //配置为悬空模式

        // 初始化发送端GPIO
    Gpio_Tx_InitStruct.GPIO_Pin = USARTx_Tx_GPIOPIN;
    Gpio_Tx_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;    //配置为服用推挽输出
    Gpio_Tx_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;

    /* 初始化相应时钟及GPIO结构体 */
    RCC_APB2PeriphClockCmd(USARTx_GPIO_CLK, ENABLE);
    GPIO_Init(USARTx_GPIOPORT, &Gpio_Rx_InitStruct);
  GPIO_Init(USARTx_GPIOPORT, &Gpio_Tx_InitStruct);


    /* 配置USART结构体*/

        //配置波特率
    Usart_InitStruct.USART_BaudRate = USARTx_BaudRate;
        //设置数据为长度
    Usart_InitStruct.USART_WordLength = USART_WordLength_8b;
        //配置校验位
    Usart_InitStruct.USART_Parity = USART_Parity_No;
        //设置停止位
    Usart_InitStruct.USART_StopBits = USART_StopBits_1; 
        //配置硬件流控制
    Usart_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
        //配置发送/接收模式
    Usart_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

        // 开时钟以及初始化USART结构体
    RCC_APB2PeriphClockCmd(USARTx_CLK, ENABLE);
    USART_Init(DEBUG_USARTx, &Usart_InitStruct);

    /* 因为存在串口中断,所以需要配置中断优先级! */
    Nvic_config();

    /* 因为接收数据是在中断函数里处理,所以,需要使能串口接收中断 */
    USART_ITConfig(DEBUG_USARTx, USART_IT_RXNE, ENABLE);

    /* 使能串口 */
    USART_Cmd(DEBUG_USARTx, ENABLE);

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值