单片机
返回首页

STM32F4——串口(USART)通信总结

2018-06-15 来源:eefocus

一、概述:

    USART即通用同步异步收发器,用于灵活的与外部设备全双工数据交换,它支持多种通信传输方式,可以通过小数波特率发生器提供多种波特率。

二、串口IO:

    对于STM32F407有6个串口,对于每个串口对应的IO可以从芯片原理图中对应找到,对于其串口1,对应的IO为PA9/PB6端口对应串口1的发送端,PA10/PB7端口对应串口1的接收端。

三、通信参数:

    对于数据的传输需要设定好相关的数据传输协议,因此必要的参数设定是有必要的,其中包括:起始位、数据位(8位或9位)、奇偶校验位(开启与否)、停止位(1、1.5、2位)、波特率设定。

四、相关寄存器:

    其中相关寄存器有:状态寄存器、数据寄存器、波特率寄存器、控制寄存器1、控制寄存器2、控制寄存器3、保护时间和预分频寄存器;下边简单分析一下前三个寄存器。

    1、状态寄存器:

    目前认识的位有:TXE:发送寄存器为空;TC:发送完成;RXNE:读取数据寄存器不为空;ORE:上溢错误;FE:帧错误;PE:奇偶校验错误。

    2、数据寄存器:该寄存器只有低8位有效,而且具有读写操作,有关该寄存器中的数据时要发送的数据还是接受到的数据取决于执行的操作是“读取”还是“写入”。

    3、波特率寄存器:

    波特率寄存器用来通过设定相关数值通过时钟产生相应的波特率。对于串口1的数值设定和产生波特率的关系如下:

    其中在寄存器中会设定相应的值,DIV_Mantissa[11,0]用来设定分频系数的整数部分,DIV_Fraction[3,0]用来设定分频系数的小数部分。

五、相关代码分析:

    下面依照串口的配置过程,来分析相关代码:

    1、相关时钟使能:


  1. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟  

  2. RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟  

    2、引脚复用映射:


  1. //串口1对应引脚复用映射  

  2. GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1  

  3. GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1  

    3、GPIO端口模式设定:


  1. //USART1端口配置  

  2.        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10  

  3. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能  

  4. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;   //速度50MHz  

  5. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出  

  6. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉  

  7. GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10  

    4、串口参数设定:


  1.        //USART1 初始化设置  

  2. USART_InitStructure.USART_BaudRate = bound;//波特率设置  

  3. USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式  

  4. USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位  

  5. USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位  

  6. USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制  

  7. USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式  

  8.    USART_Init(USART1, &USART_InitStructure); //初始化串口1  

    5、配置相关中断:


  1. #if EN_USART1_RX      

  2.     USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断  

  3.   

  4.     //Usart1 NVIC 配置  

  5.         NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道  

  6.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3  

  7.     NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;       //子优先级3  

  8.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ通道使能  

  9.     NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、  

  10. #endif  

    6、使能串口(及注意相关标志位):


  1. USART_Cmd(USART1, ENABLE);  //使能串口1   

  2. learFlag(USART1, USART_FLAG_TC);  

    7、中断服务函数(根据需要自行处理):



  1. if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接收中断(接收到的数据必须是0x0d 0x0a结尾)  

  2. {  

  3.     Res =USART_ReceiveData(USART1);//(USART1->DR);   //读取接收到的数据  

  4.       

  5.     if((USART_RX_STA&0x8000)==0)//接收未完成  

  6.     {  

  7.         if(USART_RX_STA&0x4000)//接收到了0x0d  

  8.         {  

  9.             if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始  

  10.             else USART_RX_STA|=0x8000;  //接收完成了   

  11.         }  

  12.         else //还没收到0X0D  

  13.         {     

  14.             if(Res==0x0d)USART_RX_STA|=0x4000;  

  15.             else  

  16.             {  

  17.                 USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;  

  18.                 USART_RX_STA++;  

  19.                 if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收     

  20.             }          

  21.         }  

  22.     }              

  23.  }  

    8、剩下就是根据串口的相关传输状态来进行数据的发送和接收,可依据自己的需要进行设计和分析。


进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 光控音效发生器电路

  • 离子检测器电路分析

  • 非常简单的150W功放电路图

  • 优化电路板布局的简单方法

  • 一个简单的立体声平衡指示器电路

  • 一种构建12V和230V双直流电源的简单方法

    相关电子头条文章