10通用同步异步收发器(USART)

一口Linux 2022-10-28 11:50

10.1 通信基本概念

10.1.1 并行通信和串行通信

1、处理器与外部设备通信的两种方式:

串行通信有两种通信方式:

并行通信:
-传输原理:数据各个位同时传输。
-优点:速度快
-缺点:占用引脚资源多

串行通信 -传输原理:
串行通信方式有 UART USB IIC SPI CAN 以太网等都是采用串行通信方式。
数据按位顺序传输。
-优点:占用引脚资源少
-缺点:速度相对较慢

不过这两种通信方式是可以转换的,如图串行转并行:

有关两者优缺点:

10.1.2 单工通信、半双工通信、全双工通信

按照数据传送方向,分为:
单工:
数据传输只支持数据在一个方向上传输;
半双工:
允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;
全双工:
允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。


11.1.3 同步通信和异步通信


1、同步通信:带时钟同步信号传输。


2、 异步通信:不带时钟同步信号。


10.1.4 RS-232

1、RS232标准串口通讯结构图


2、原生的串口通信


10.1.5 串口数据帧格式

1、串口数据包的基本组成


2、奇偶校验


10.2 STM32F429 USART结构

10.2.1 概述


10.2.2 USART结构


2、数据通道


3、发送器


4、接收器



10.2.3 波特率设置


10.2.4 DMA控制

接收缓冲区和发送缓冲区的DMA请求是独立的,它们分别对应于独立的DMA通道。

1.使用DMA进行发送

将USART控制寄存器3(USART_CR3)中的DMAT位置1可以使能DMA模式进行发送。
一旦使能了USART的DMA功能,当TXE 位置1时,
控制器会将数据自动从SRAM区加载到USART_DR,启动发送过程。
所有数据的发送不需要通过程序干涉。

2.使用DMA进行接收

将USART_CR3中的DMAR位置1可以使能DMA模式进行接收。一旦使能了USART的DMA功能,当接收数据时,RXNE
位置1时,控制器会将数据会从USART_DR自动加载到SRAM区域中。整个数据的接受过程不需要程序的干涉。

10.3 USART典型应用步骤及常用库函数

10.3.1 串口配置一般步骤


10.3.2 常用库函数说明




10.4 应用实例

10.4.1 通过串口向计算机传输100个字节

使用串口线把计算机和电路板的USART1连接在一起,如图11-15所示。编写程序,通过USART1向计算机发送100个字节,这一功能可以通过查询方式、中断方式或中断方式实现。这里以常用的查询方式实现这一功能。

USART1配置参数:
波特率=115 200、
有效数据位=8位、
停止位=1位、
不使用校验方式、
收发模式、
不使用硬件流控。
USART1的TXD和RXD分别使用PA9和PA10。

1.编程要点

(1)使能USART1和复用引脚GPIO的工作时钟。
(2)初始化USART1 相关GPIO引脚,并将引脚复用给USART1。

(3)根据要求,初始化USART1。使用查询方式发送数据。
(4)使能USART1。
(5)循环发送100个字节。

2.主程序

int main(void){               uint16_t  i;               /*初始化USART 配置模式为 115200 8-N-1,中断接收*/    USART1_Config();    for(i=0;i<100;i++)//循环发送100个x   {      /*发送一个字符x*/      USART_SendData(USART1, ‘x’);      /*等待发送数据寄存器为空 ,只有在发送数据寄存器为空的情况下,才能发送下一个字符*/      while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);              }      while(1);           }

3. 串口配置函数

void USART_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /*-------------------第1步--------------------*/ /*使能 GPIOA时钟*/ RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA,ENABLE); /*使能 UART1 时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  /*-------------------第2步--------------------*/ /*复用PA9到USART1*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); /*复用PA10到USART1*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); /*配置TX引脚为复用功能*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);   /*配置RX引脚为复用功能*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ;            //复用模式 GPIO_Init(GPIOA,&GPIO_InitStructure); /*-------------------第3步--------------------*/ /*配置USART1模式*/ USART_InitStructure.USART_BaudRate = 115200; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b;            //8位有效数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //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_Init(USART1, &USART_InitStructure);            //初始化USART1  /*因为使用查询方式发送数据,没有用到中断,因此没有中断相关配置,缺少第4步*/ /*-------------------第5步--------------------*/ USART_Cmd(USART1, ENABLE);//使能USART1}

10.4.2 串口与计算机回显功能实现

回显功能就是把计算机发送给电路板上微控制器的数据通过串口原样返回给计算机,并显示在串口显示软件中。
USART1配置参数:
波特率=115 200、
有效数据位=8位、
停止位=1位、
不使用校验方式、
收发模式、
不使用硬件流控。

USART1的TXD和RXD分别使用PA9和PA10。

1.编程要点

(1)使能USART1和复用引脚GPIO的时钟。
(2)初始化USART1 相关GPIO引脚,并将引脚复用给USART1。
(3)根据要求初始化USART1。
(4)初始化NVIC的USART1串口中断通道,并使能USART1的读取数据寄存器不为空中断(RXNE)。
(5)使能USART1。
(6)编写中断服务程序。

2.主程序

int main(void){ USART_Config(); //初始化USART1 printf("这是一个串口中断接收回显实验\n");//注意只有对printf函数进行重定向才能使用 while(1);}

3. 串口配置函数

void USART_Config(void){ GPIO_InitTypeDef GPIO_InitStructure; USART_InitTypeDef USART_InitStructure; /*-------------------第1步--------------------*/ /*使能 GPIOA时钟*/ RCC_AHB1PeriphClockCmd( RCC_AHB1Periph_GPIOA,ENABLE); /*使能 UART1 时钟*/ RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  /*-------------------第2步--------------------*/ /*复用PA9到USART1*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); /*复用PA10到USART1*/ GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); /*配置TX引脚为复用功能*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF; //复用模式 GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure);   /*配置RX引脚为复用功能*/ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF ;            //复用模式 GPIO_Init(GPIOA,&GPIO_InitStructure); /*-------------------第3步--------------------*/ /*配置USART1模式*/ USART_InitStructure.USART_BaudRate = 115200; //波特率 USART_InitStructure.USART_WordLength = USART_WordLength_8b; //8位有效数据位 USART_InitStructure.USART_StopBits = USART_StopBits_1; //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_Init(USART1, &USART_InitStructure);            //初始化USART1 /*-------------------第4步--------------------*/ //初始化NVIC中的USART1中断通道 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //选择NVIC组2 NVIC_InitStructure.NVIC_IRQChannel=USART1_IRQn; //配置USART为中断源 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1; //抢占优先级为1 NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;           //响应优先级为1 NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;            //使能中断  NVIC_Init(&NVIC_InitStructure); //初始化配置NVIC  //使能串口的RXNE中断 USART_ITConfig(USART1,USART_IT_RXNE,ENABLE); //使能串口的RXNE中断  /*-------------------第5步--------------------*/ USART_Cmd(USART1,ENABLE);                      //使能USART1}

4.串口中断服务函数

void USART1_IRQHandler(void){    uint8_t ucTemp;    if(USART_GetITStatus(USART1,USART_IT_RXNE)!=RESET) //检测RXNE标志位    {                            ucTemp = USART_ReceiveData( USART1 ); //读取接收数据      USART_SendData(USART1,ucTemp);  //把数据发送给计算机,实现回显功能      }            }

5. printf函数重定向

使用printf函数通过USART1向计算机的串口调试助手打印数据,需要将printf函数内部实现功能重定向到微控制器的USART1。
(1)设置Keil MDK软件中的Use MicroLIB选项。
(2)重定向fputc函数。

2)重定向fputc函数。

int fputc(int ch, FILE* stream){//通过串级发送数据chUSART_SendData(USART1, (uint8_t) ch);      
while (USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET); //等待发送完毕
return ch;}

10.4.3 利用DMA通过串口向计算机1000个字节

利用DMA通过USART1向计算机传输1000个字节,一旦配置好USART1和DMA数据流,在启动DMA传输之后,不需要程序的干预,即可完成数据传输

USART1配置参数:波特率=115 200、有效数据位=8位、停止位=1位、不使用校验方式、收发模式、不使用硬件流控。

1.编程要点

(1)使能USART1、复用引脚GPIO及DMA2的时钟。
(2)初始化USART1相关GPIO引脚,并将引脚复用给USART1。
(3)根据要求,初始化并使能USART1。
(4)初始化DMA2数据流7的通道4,并使能DMA2数据流7。
(5)使能USART1的DMA发送功能,启动DMA数据传输。

2、主程序

uint8_t Send_Buff[1000]; //DMA传输数据源存储区int main(void){  uint16_t i;  USART_Config();                                   //初始化USART1  DMA_Config();                                                         //初始化DMA  for(i=0;i//初始化DMA传输数据源存储区  {    Send_Buff [i]            = 'Z';  }  /*使能USART1的DMA发送,启动DMA数据传输*/  USART_DMACmd(USART1, USART_DMAReq_Tx,ENABLE);           //关键  while(1);                                   //无须CPU干涉,实现数据传输}

3. 串口配置函数

同10.4.1串口配置函数。

4. DMA配置函数

extern uint8_t Send_Buff[1000]; //DMA传输数据源存储区void DMA_Config(void){ DMA_InitTypeDef  DMA_InitStructure; /*-------------------第1步--------------------*/ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE); //使能DMA2时钟   /*-------------------第2步--------------------*/ DMA_DeInit(DMA2_Stream7);            //复位,禁止DMA2数据流7  while (DMA_GetCmdStatus(DMA2_Stream7)!= DISABLE); //确保DMA数据流禁止成功  /*-------------------第3步--------------------*/ /*初始化DMA2数据流7*/  DMA_InitStructure.DMA_Channel=DMA_Channel_7; //选择通道  DMA_InitStructure.DMA_PeripheralBaseAddr=(uint32_t) SRC_Buffer;//目标地址  DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t) Send_Buff; //源数据地址  DMA_InitStructure.DMA_DIR=DMA_DIR_MemoryToPeripheral; //存储器到外设模式  DMA_InitStructure.DMA_BufferSize=1000;            //DMA传输数据数目  //禁止自动递增功能  DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;            DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //使能自动递增功能  //8位数据宽度  DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_Byte;  DMA_InitStructure.DMA_MemoryDataSize=DMA_PeripheralDataSize_Byte; DMA_InitStructure.DMA_Mode=DMA_Mode_Normal; //正常模式,不循环,只传输一次 DMA_InitStructure.DMA_Priority=DMA_Priority_High;//设置DMA2数据流7优先级为高DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable; //禁用FIFO模式 //此时这一参数无用DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;            //单次模式DMA_InitStructure.DMA_PeripheralBurst=DMA_MemoryBurst_Single; //单次模式DMA_Init(DMA2_Stream7,&DMA_InitStructure); //完成DMA2数据流7配置 /*-------------------第4步--------------------*/ DMA_Cmd(DMA2_Stream7,ENABLE);            //使能DMA2数据流7,启动DMA数据传输   /*-------------------第5步--------------------*/ while (DMA_GetCmdStatus(DMA2_Stream7)!=ENABLE);   //检测DMA数据流是否有效}


end


一口Linux 


关注,回复【1024】海量Linux资料赠送

精彩文章合集


文章推荐

【专辑】ARM
【专辑】粉丝问答
专辑linux入门
专辑计算机网络
专辑Linux驱动
【干货】嵌入式驱动工程师学习路线
【干货】Linux嵌入式所有知识点-思维导图

一口Linux 写点代码,写点人生!
评论
  • 全球智能电视时代来临这年头若是消费者想随意地从各个通路中选购电视时,不难发现目前市场上的产品都已是具有智能联网功能的智能电视了,可以宣告智能电视的普及时代已到临!Google从2021年开始大力推广Google TV(即原Android TV的升级版),其他各大品牌商也都跟进推出搭载Google TV操作系统的机种,除了Google TV外,LG、Samsung、Panasonic等大厂牌也开发出自家的智能电视平台,可以看出各家业者都一致地看好这块大饼。智能电视的Wi-Fi连线怎么消失了?智能电
    百佳泰测试实验室 2024-12-12 17:33 56浏览
  • 铁氧体芯片是一种基于铁氧体磁性材料制成的芯片,在通信、传感器、储能等领域有着广泛的应用。铁氧体磁性材料能够通过外加磁场调控其导电性质和反射性质,因此在信号处理和传感器技术方面有着独特的优势。以下是对半导体划片机在铁氧体划切领域应用的详细阐述: 一、半导体划片机的工作原理与特点半导体划片机是一种使用刀片或通过激光等方式高精度切割被加工物的装置,是半导体后道封测中晶圆切割和WLP切割环节的关键设备。它结合了水气电、空气静压高速主轴、精密机械传动、传感器及自动化控制等先进技术,具有高精度、高
    博捷芯划片机 2024-12-12 09:16 86浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-12 10:13 40浏览
  • 习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习笔记&记录学习习笔记&记学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记录学习学习笔记&记
    youyeye 2024-12-11 17:58 87浏览
  • 首先在gitee上打个广告:ad5d2f3b647444a88b6f7f9555fd681f.mp4 · 丙丁先生/香河英茂工作室中国 - Gitee.com丙丁先生 (mr-bingding) - Gitee.com2024年对我来说是充满挑战和机遇的一年。在这一年里,我不仅进行了多个开发板的测评,还尝试了多种不同的项目和技术。今天,我想分享一下这一年的故事,希望能给大家带来一些启发和乐趣。 年初的时候,我开始对各种开发板进行测评。从STM32WBA55CG到瑞萨、平头哥和平海的开发板,我都
    丙丁先生 2024-12-11 20:14 75浏览
  • 在智能化技术快速发展当下,图像数据的采集与处理逐渐成为自动驾驶、工业等领域的一项关键技术。高质量的图像数据采集与算法集成测试都是确保系统性能和可靠性的关键。随着技术的不断进步,对于图像数据的采集、处理和分析的需求日益增长,这不仅要求我们拥有高性能的相机硬件,还要求我们能够高效地集成和测试各种算法。我们探索了一种多源相机数据采集与算法集成测试方案,能够满足不同应用场景下对图像采集和算法测试的多样化需求,确保数据的准确性和算法的有效性。一、相机组成相机一般由镜头(Lens),图像传感器(Image
    康谋 2024-12-12 09:45 75浏览
  • 时源芯微——RE超标整机定位与解决详细流程一、 初步测量与问题确认使用专业的电磁辐射测量设备,对整机的辐射发射进行精确测量。确认是否存在RE超标问题,并记录超标频段和幅度。二、电缆检查与处理若存在信号电缆:步骤一:拔掉所有信号电缆,仅保留电源线,再次测量整机的辐射发射。若测量合格:判定问题出在信号电缆上,可能是电缆的共模电流导致。逐一连接信号电缆,每次连接后测量,定位具体哪根电缆或接口导致超标。对问题电缆进行处理,如加共模扼流圈、滤波器,或优化电缆布局和屏蔽。重新连接所有电缆,再次测量
    时源芯微 2024-12-11 17:11 109浏览
  • 天问Block和Mixly是两个不同的编程工具,分别在单片机开发和教育编程领域有各自的应用。以下是对它们的详细比较: 基本定义 天问Block:天问Block是一个基于区块链技术的数字身份验证和数据交换平台。它的目标是为用户提供一个安全、去中心化、可信任的数字身份验证和数据交换解决方案。 Mixly:Mixly是一款由北京师范大学教育学部创客教育实验室开发的图形化编程软件,旨在为初学者提供一个易于学习和使用的Arduino编程环境。 主要功能 天问Block:支持STC全系列8位单片机,32位
    丙丁先生 2024-12-11 13:15 66浏览
  • 一、SAE J1939协议概述SAE J1939协议是由美国汽车工程师协会(SAE,Society of Automotive Engineers)定义的一种用于重型车辆和工业设备中的通信协议,主要应用于车辆和设备之间的实时数据交换。J1939基于CAN(Controller Area Network)总线技术,使用29bit的扩展标识符和扩展数据帧,CAN通信速率为250Kbps,用于车载电子控制单元(ECU)之间的通信和控制。小北同学在之前也对J1939协议做过扫盲科普【科普系列】SAE J
    北汇信息 2024-12-11 15:45 113浏览
  • RK3506 是瑞芯微推出的MPU产品,芯片制程为22nm,定位于轻量级、低成本解决方案。该MPU具有低功耗、外设接口丰富、实时性高的特点,适合用多种工商业场景。本文将基于RK3506的设计特点,为大家分析其应用场景。RK3506核心板主要分为三个型号,各型号间的区别如下图:​图 1  RK3506核心板处理器型号场景1:显示HMIRK3506核心板显示接口支持RGB、MIPI、QSPI输出,且支持2D图形加速,轻松运行QT、LVGL等GUI,最快3S内开
    万象奥科 2024-12-11 15:42 88浏览
  • 应用环境与极具挑战性的测试需求在服务器制造领域里,系统整合测试(System Integration Test;SIT)是确保产品质量和性能的关键步骤。随着服务器系统的复杂性不断提升,包括:多种硬件组件、操作系统、虚拟化平台以及各种应用程序和服务的整合,服务器制造商面临着更有挑战性的测试需求。这些挑战主要体现在以下五个方面:1. 硬件和软件的高度整合:现代服务器通常包括多个处理器、内存模块、储存设备和网络接口。这些硬件组件必须与操作系统及应用软件无缝整合。SIT测试可以帮助制造商确保这些不同组件
    百佳泰测试实验室 2024-12-12 17:45 63浏览
  • 本文介绍瑞芯微RK3588主板/开发板Android12系统下,APK签名文件生成方法。触觉智能EVB3588开发板演示,搭载了瑞芯微RK3588芯片,该开发板是核心板加底板设计,音视频接口、通信接口等各类接口一应俱全,可帮助企业提高产品开发效率,缩短上市时间,降低成本和设计风险。工具准备下载Keytool-ImportKeyPair工具在源码:build/target/product/security/系统初始签名文件目录中,将以下三个文件拷贝出来:platform.pem;platform.
    Industio_触觉智能 2024-12-12 10:27 68浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦