目录

01、USART的特点

02、USART简介

2.1、数据传输模型

2.2、帧结构

2.3、波特率

03、STM32的USART

04、代码配置


01、USART的特点

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

  • 全双工异步通信。

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

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

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

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

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

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

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

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

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

通信结构

02、USART简介

2.1、数据传输模型

2.2、帧结构

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

① 起始位

② 数据位(8位或者9位)

③ 奇偶校验位(第9位)

④ 停止位(1,15,2位)

⑤ 波特率设置

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

1.数据包

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

2.波特率

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

3.起始和停止信号

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

4.有效数据

有效数据规定了主题数据的长度,一般为8或9位,其在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;

03、STM32的USART

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

下文我们以USART1为例讲解

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

04、代码配置

配置中断优先级。

  /* 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个字符,且PC以100ms为间隔发送数据,发送977包收到977包回复,测试demo就够健壮,没有出现丢包。

keilIAR工程代码和硬件PCB开源地址:

https://github.com/strongercjd/STM32F207VCT6

点击查看本文所在的专辑,STM32F207教程

关注公众号,第一时间收到文章更新。评论区不能及时看到,需要交流可以到公众号沟通

STM32 串口详解相关推荐

  1. stm32位操作详解

    stm32位操作详解 STM32位操作原理 思想:把一个比特分成32位,每位都分配一个地址,这样就有32个地址,通过地址直接访问. 位操作基础 位运算 位运算的运算分量只能是整型或字符型数据,位运算把 ...

  2. STM32 定时器详解

    STM32 定时器详解 吃了一个猛亏,自己理解花了大半天时间,结果一看代码发现巨简单 算了,把自己理解的放上来吧 目录 STM32 定时器详解 前言 一.定时器种类和区分 二.时钟源 三.计数过程 3 ...

  3. STM32开发 -- 串口详解

    如需转载请注明出处:https://blog.csdn.net/qq_29350001/article/details/80708964 讲完GPIO,接下来看一下串口. 串口通信,已经讲了很多次了. ...

  4. STM32 ADC详解

    目录 01.ADC简介 02.STM32的ADC外设 03.STM32ADC框图讲解 04.触发源 05.转换周期 06.数据寄存器 07.中断 08.电压转换 09.电路图设计 10.代码设计 01 ...

  5. STM32 DAC详解

    目录 01.DAC简介 02.DAC转换 03.功能说明 04.DAC输出电压 05.代码配置 上一篇介绍了<STM32ADC详解>,既然有模拟转数字的ADC模块,那么就必然有数字转模拟的 ...

  6. STM32 SPI详解

    目录 1.SPI简介 2.SPI特点 2.1.SPI控制方式 2.2.SPI传输方式 2.3.SPI数据交换 2.4.SPI传输模式 3.工作机制 3.1.相关缩写 3.2.CPOL极性 3.3.CP ...

  7. STM32 GPIO 详解

    0. 实验平台 基于STM32F407ZG 1. GPIO 简介 1.1 简介 GPIO全称:General Purpose Input Output,即通用输入输出端口,一般用来采集外部器件的信息或 ...

  8. STM32 中断详解

    目录 1 EXTI控制器 2 NVIC控制器 3 code 中断,在单片机中占有非常重要的地位.代码默认地从上向下执行,遇到条件或者其他语句,会按照指定的地方跳转.而在单片机执行代码的过程中,难免会有 ...

  9. STM32固件升级详解(BootLoader)

    基础知识 这里以 KEIL 开发环境和 STM32F103RET6 为例. 上电时单片机首先进入复位中断 Reset_Handler,即汇编文件的复位中断处理函数. 并且有一个中断向量表默认存在于 f ...

最新文章

  1. 微信里如何判断页面被分享成功
  2. nagios mysql php_nagios监控mysql
  3. c/c++ ide 简介
  4. matlab模糊规则ruleList的解释
  5. C++开发要注意的规范?
  6. WebTable之ChildItem方法应用
  7. 前端学习(2831):小程序事件绑定
  8. case mybatis 不同表_解决mybatis case when 报错的问题
  9. 中教云教师备课云平台获北京市新技术新产品(服务)认定
  10. 亚洲200佳 中国88家企业居首
  11. vue对象中的实例属性
  12. supersocket缓冲区_SuperSocket学习进展
  13. jxl java mer_导出报表出错,有没有大神懂得
  14. Linux运维工程师岗位分析(15-25k)
  15. NSR | 国科大王艳芬组中国草地多维资源梯度上的单峰生产力与生物多样性关系...
  16. 亲自动手搭建微服务框架和测试环境-1-背景
  17. 华为MateBook D加装硬盘和内存
  18. 给我两小时,我能写很长长长长长长的APP测试用例!
  19. 如何处理训练样本不均衡的问题
  20. 【Linux】一、Linux系统下安装Nvidia P1000显卡驱动、CUDA、cuDNN

热门文章

  1. terminal登录mysql_转载-MySQL之终端(Terminal)管理MySQL
  2. Linux 文件系统相关的命令
  3. Java 算法 礼物分配
  4. 最详细的Spring核心IOC的源码分析
  5. Mysql数据库-Centos和Raspbian主从复制(备份)
  6. 时间序列趋势分解 seasonal_decompose
  7. python函数使用两个小括号
  8. easyExcel实现Excel导出功能
  9. [洛谷P3957] 跳房子
  10. 第九章 Servlet工作原理解析