STM32 USART串口详解
知晓编程 2023-06-08

0 1 USART的特点

USART是通用异步收发传输器(UniversalAsynchronousReceiver/Transmitter),通常称作UART,是一种异步收发传输器,是设备间进行异步通信的关键模块。UART负责处理数据总线和串行口之间的串/并、并/串转换,并规定了帧格式;通信双方只要采用相同的帧格式和波特率,就能在未共享时钟信号的情况下,仅用两根信号线(Rx和Tx)就可以完成通信过程,因此也称为异步串行通信。

  • 全双工异步通信。

  • 小数波特率发生器系统,提供精确的波特率。

  • 可配置的16倍过采样或8倍过采样,因而为速度容差与时钟容差的灵活配置提供了可能。

  • 可编程的数据字长度(8位或者9位);

  • 可配置的停止位(支持1或者2位停止位);

  • 可配置的使用DMA多缓冲器通信。

  • 单独的发送器和接收器使能位。

  • 检测标志:① 接受缓冲器  ②发送缓冲器空 ③传输结束标志

  • 多个带标志的中断源。触发中断。

  • 其他:校验控制,四个错误检测标志。

通信结构

0 2 USART简介

2.1、数据传输模型

2.2、帧结构

串口异步通信需要定义的参数

起始位

数据位(8位或者9位)

奇偶校验位(第9位)

停止位(1,15,2位)

波特率设置

带奇偶校验的数据为就是9

1.数据包

串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备得RXD接口,在协议层中规定了数据包的内容,具体包括起始位、主体数据(8位或9位)、校验位以及停止位,通讯的双方必须将数据包的格式约定一致才能正常收发数据。

2.波特率

由于异步通信中没有时钟信号,所以接收双方要约定好波特率,即每秒传输的码元个数,以便对信号进行解码,常见的波特率有48009600115200等。STM32中波特率的设置通过串口初始化结构体来实现。

3.起始和停止信号

数据包的首尾分别是起始位和停止位,数据包的起始信号由一个逻辑0的数据位表示,停止位信号可由0.511.52个逻辑1的数据位表示,双方需约定一致。STM32中起始和停止信号的设置也是通过串口初始化结构体来实现。

4.有效数据

有效数据规定了主题数据的长度,一般为89位,其在STM32中也是通过串口初始化结构体来实现的。

5.数据校验

在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)0 校验(space)1 校验(mark)以及无(noparity)。这些也都可以在串口初始化结构体中实现的。

2.3、波特率

OVER8,用于配置过采样,通常情况下,OVER8设置为0

如果时钟时84M

USARTDIV = 84000000/(115200*16) = 45.572

那么得到:

DIV_Fraction = 16*0.572 = 0x09;

DIV_Mantissa = 45 = 0x2D;

0 3 STM32的USART

根据STM32F207数据手册,STM32F207一共6个串口

下文我们以USART1为例讲解

STM32F207数据手册的Table10. Alternate functionmapping图中看到USART1的对应管脚,下文我们选择PA9PA10作为USART1的管脚。

0 4 代码配置

配置中断优先级。

 /* Enable the USARTx Interrupt */ NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =1; NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStructure);

打开串口与相应的GPIO引脚,配置好相应串口信息与GPIO引脚的工作模式。

 /* Enable GPIO clock */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); /* Enable UART1 clock */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); /* Connect PXx to USARTx_Tx*/ GPIO_PinAFConfig(GPIOA, 9, GPIO_AF_USART1);  /* Connect PXx to USARTx_Rx*/ GPIO_PinAFConfig(GPIOA, 10, GPIO_AF_USART1);  /* Configure USART Tx as alternate function */ GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &GPIO_InitStructure);  /* Configure USART Rx as alternate function */ GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; GPIO_Init(GPIOA, &GPIO_InitStructure);

配置USART1。

 USART_InitStructure.USART_BaudRate = 115200;//配置波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;//配置数据字长 USART_InitStructure.USART_StopBits = USART_StopBits_1;//配置停止位 USART_InitStructure.USART_Parity = USART_Parity_No;//配置校验位 USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//配置硬件流控制 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//配置工作模式,收发一起  /* USART configuration */ USART_Init(USART1, &USART_InitStructure);// 完成串口的初始化配置

使能中断配置。

 USART_ITConfig(USART1, USART_IT_TC, ENABLE); USART_ITConfig(USART1, USART_IT_RXNE, ENABLE)

我们配置了发送传输完成中断和接收数据寄存器非空中断。我们可以配置很多类型中断,在ST提供的标准库函数中看到。

/** * @brief Enables or disables the specified USART interrupts. * @param USARTx: where x can be 1, 2, 3, 4, 5 or 6 to select the USART or  * UART peripheral. * @param USART_IT: specifies the USART interrupt sources to be enabled or disabled. * This parameter can be one of the following values: * @arg USART_IT_CTS: CTS change interrupt * @arg USART_IT_LBD: LIN Break detection interrupt * @arg USART_IT_TXE: Transmit Data Register empty interrupt * @arg USART_IT_TC: Transmission complete interrupt * @arg USART_IT_RXNE: Receive Data register not empty interrupt * @arg USART_IT_IDLE: Idle line detection interrupt * @arg USART_IT_PE: Parity Error interrupt * @arg USART_IT_ERR: Error interrupt(Frame error, noise error, overrun error) * @param NewState: new state of the specified USARTx interrupts. * This parameter can be: ENABLE or DISABLE. * @retval None */

最后使能串口。

 /* Enable USART */ USART_Cmd(USART1, ENABLE);

main主函数,功能是LCD显示串口接收的10个字符(如果不是ascii码则不显示),串口倒序返回接收到的10个字节。

int main(void){ while (1) { if(LCD_refresh_flg){ LCD_refresh_flg = 0; LCD_ShowString(0,16,receive_data); receive_num--; USART_SendData(USART1, receive_data[receive_num--]); send_flg = 1; } }}

因为使能了中断,我们还需要编写中断函数。

void USART1_IRQHandler(void){ if(USART_GetFlagStatus(USART1, USART_FLAG_TC)) { if(send_flg == 1){ if(receive_num==0){ USART_SendData(USART1, receive_data[receive_num]); send_flg = 0; receive_flg = 1; }else{ USART_SendData(USART1, receive_data[receive_num--]); } } USART_ClearFlag(USART1, USART_FLAG_TC); } if(USART_GetFlagStatus(USART1, USART_FLAG_RXNE)) { if((receive_flg)&&(send_flg == 0)){ receive_data[receive_num++] = USART_ReceiveData(USART1); if(receive_num==10){ receive_flg = 0; LCD_refresh_flg = 1; } } USART_ClearFlag(USART1, USART_FLAG_RXNE); }}

下载验证

LCD显示屏可以显示接收的10个字符,且PC100ms为间隔发送数据,发送977包收到977包回复,测试demo就够健壮,没有出现丢包。

声明: 本文转载自其它媒体或授权刊载,目的在于信息传递,并不代表本站赞同其观点和对其真实性负责,如有新闻稿件和图片作品的内容、版权以及其它问题的,请联系我们及时删除。(联系我们,邮箱:evan.li@aspencore.com )
0
评论
  • 相关技术文库
  • 硬件
  • 原理图
  • 信号完整性
  • EMI
  • 应用BK5822设计ETC OBU

      中国的公路不停车收费(ETC)系统应用市场越来越大,为了促进ETC应用的快速发展和成熟,国家相关部门开展了高速公路联网不停车收费的试点工程,比如,京津翼地区和长三角地区,所以对车载单元(OBU)的需求量也随之大幅增加。  目前市场上应用的OBU多数是通过分立元器件设计实现的,存在一致性、稳定性和可靠性的问题。博通(BEKEN)集成电路于2010年年初推出用于ETC系统的射频收发器">射频...

    09-28
  • 一种单芯片GPS接收机的硬件设计

    引言   GPS(全球定位系统)发展到今天,其用途越来越广泛,而技术的进步和用户需求也不断推动GPS系统的增强。目前美国正在致力于GPSBlockII系统的现代化和“GPS - III”计划,旨在全面改善GPS的生命力、精度、可用性、完好性、灵活性和安全性。  GPS用户端设备也处于不断升级和发展之中。从接收机的结构来看,随着VLSI(超大规模集成电路)和DSP技术的发展,单通道序贯式、时分多路复...

    09-28
  • 半刚性电缆是指什么

    半刚性电缆组件的最基本形式为由金属管构成的同轴传输线。其中,所述金属管一般为形成外导体的铜管,沿该铜管的中心线设有金属丝导体。所述中心金属丝导体由介电材料支撑...

    09-27
  • 比Wi-Fi快100倍的网络 真的靠谱吗?

    Wi-Fi 对移动计算的使用产生了巨大的影响,使员工可以在任何地方访问公司网络,咖啡店也能成为独立工作人员的办公地点。但Wi-Fi 也有其缺点,所以诞生了一个新的标准:Li-Fi,如果它可以顺利上市,

    09-26
  • 产品设计共用一款PCB一套软件,如何区分判断?

    在实际的工程项目中,有时候会碰到两款差异不大的产品,设计的时候共用一款PCB,软件也共用一套软件。这个时候,我们可以开辟一个IO口,用于侦测实际应用的是哪款产品

    09-25
  • 探究CDMA网络在MBB时代的发展趋势和应对策略,推动移动通信技术创新

    面对日新月异的移动终端和爆炸式增长的移动应用,移动互联网流量未来10年将迎来数百倍的增长。MBB洪流已然来袭,然而,它们主要来自哪里?

    09-25
  • 数字功放与模拟功放的优缺点对比:深入分析两种功放技术的特点与应用,助您选择适合的音频放大方案

     “数字功放”的基本电路是早已存在的D类放大器(国内称丁类放大器)。以前,由于价格和技术上的原因,这种放大电路只是在实验室或高价位的测试仪器中应用。这几年的技术发展使数字功放的元件集成到一两块芯片中,

    09-25
  • 基于触控屏的无线通信噪声干扰验证研究

    本文所探讨的内容虽然仅是噪声验证的其中一个例子,但我们已可以见微知着的了解到,无线通讯讯号技术的博大精深,以及干扰掌控的技术深度。所有相关厂商业者在开发时,均需透过更深入的研究、更多的技术资源与精力投

    09-25
  • 深入探讨两种常见的比例放大电路设计方案,实现精确信号放大功能

    运算放大器,它有两个输入引脚和一个输出引脚。其中两个输入引脚,一个是正相输入,一个是负相输入。正是因为运算放

    09-25
  • 优化光缆路由:降低光网络时延的关键因素分析与解决方案研究

    中国电信日前发布了《低时延光网络白皮书》,指出了四大需求低时延的业务。第一是金融和电子交易类用户;第二是基于TCP协议的高清视频类业务,包括4K/8K、视频会议、VR等实时性要求极高的大带宽业务;第三

    09-25
  • 浅析915MHz发射/接收模块电路设计

    设计为868MHz和902至928MHz 的AMR解决方案,RFMD的RF6549功能独立的Rx和Tx路径,两个连接多样性的解决方案或一个测试端口的输出端口的端口。PA的部分包括一个标称输出功率为28

    09-25
下载排行榜
更多
评测报告
更多
广告