• STM32学习笔记:USART


    1.1、发送器(TX)
    发送使能位TE置1后,发送器先发送一个空闲帧(数据帧长度的高电平),
    然后,往USART_DR寄存器中写入要发送的数据;
    写完最后一个数据后,等待USART状态寄存器(USART_SR)的TC=1,完成数据传输;
    如果USART_CR1寄存器的TCIE=1,将产生中断。

    发送标志位:
    TE  发送使能
    TXE 发送寄存器为空,发送单个字节时使用
    TC  发送完成,发送多字节数据使用
    IXIE 发送完成中断使能

    1.2、接收器(RX)
    将控制寄存器(USART_CR1)的RE=1,使能接收;
    确定到起始位后,根据RX电平状态把数据存放在接收移位寄存器中;
    接收完成后,RXNE=1.

    接收标志位:
    RE      接收使能
    RXNE    读数据寄存器非空
    RXNEIE  接收完成中断使能

    2、USART初始化结构体
    typedef struct{
        u32 USART_BaudRate;
        u32 USART_WortLength;
        u32 USART_StopBits;
        u32 USART_Parity;
        u32 USART_Mode;
        u32 USART_HardwareFlowControl;
    }USART_InitTypeDef;
    typedef struct{
        u32 USART_Clock;
        u32 USART_CPOL;
        u32 USART_CPHA;
        u32 USART_LastBit;
    }USART_ClockInitTypeDef;

    3、USART收发通信
    3.1 配置思路
    (1)使能RX\TX引脚GPIO时钟和USART时钟
    (2)初始化GPIO,将GPIO复用到USART上
    (3)配置USART参数
    (4)配置中断控制器并使能USART接收中断
    (5)使能USART
    (6)在USART接收中断中实现数据接收和发送

    3.2 USART初始化配置

    1. void USART_Init()
    2. {
    3.     GPIO_InitTypeDef GPIO_InitStructure;
    4.     USART_InitTypeDef USART_InitStructure;
    5.     
    6.     //使能时钟
    7.     RCC_AHB1PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);
    8.     
    9.     //GPIO端口复用 tx
    10.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
    11.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    12.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;    //复用推挽输出
    13.     GPIO_Init(GPIOA, &GPIO_InitStructure);
    14.     
    15.     //GPIO端口复用 rx
    16.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;//PA.10
    17.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入
    18.     GPIO_Init(GPIOA, &GPIO_InitStructure); 
    19.     //UASRT初始化配置
    20.     USART_InitStructure.USART_BaudRate = bound;     //串口波特率
    21.     USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
    22.     USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
    23.     USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
    24.     USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
    25.     USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;    //收发模式
    26.     
    27.     NVIC_Configuration();    
    28.     USART_Init(USART1, &USART_InitStructure); //初始化配置
    29.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE); //串口接收中断
    30.     USART_Cmd(USART1, ENABLE);  //串口使能   
    31. }

    3.3 中断初始化配置
    void NVIC_Configuration()
    {
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;        //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;            //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);    //根据指定的参数初始化VIC寄存器
    }

    3.4实现一个接收函数

    1. u8 USART_RX_BUF[USART_REC_LEN];
    2. U16 USART_RX_STA=0;
    3. u8 Res;
    4. void USART_IRQHandler(void)
    5. {
    6.     if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
    7.     {
    8.         Res = USART_ReceiveData(USART);
    9.         if((USART_RX_STA&0x8000)==0)//接收未完成
    10.         {
    11.             if(USART_RX_STA&0x4000)//接收到了0X0d
    12.             {
    13.                 if(Res!=0x0a)USART_RX_STA=0;//收到0d,没收到0a,错误,直接重新计数
    14.                 else USART_RX_STA |= 0x8000;//完成接收数据
    15.             }
    16.             else//未收到0x0d
    17.             {
    18.                 if(Res==0x0d)USART_RX_STA|=0x4000;
    19.                 else
    20.                 {
    21.                     USART_RX_BUF[USART_RX_STA&0x3FFF] = Res;
    22.                     USART_RX_STA++
    23.                     if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收错误
    24.                 }
    25.             }
    26.         }
    27.     }
    28. }

  • 相关阅读:
    算法竞赛入门【码蹄集新手村600题】(MT1501-1550)
    通过es索引生命周期策略删除日志索引
    亲测可用的1688商品详情API和关键字搜索API,需要自取!
    架构师04-应用服务间加密设计和实践
    Ts内置类型---下
    PHP:匿名函数
    JS操作字符串常见方法
    java多线程 -- volatile 关键字 内存 可见性
    c# entity freamwork 判断是否存在
    深入理解Java Stream流
  • 原文地址:https://blog.csdn.net/lurong66/article/details/126712801