历史上的今天
返回首页

历史上的今天

今天是:2024年12月24日(星期二)

正在发生

2020年12月24日 | STM32 串口详解

2020-12-24 来源:eefocus

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就够健壮,没有出现丢包。

推荐阅读

史海拾趣

Furukawa Electric Co Ltd公司的发展小趣事

Furukawa Electric Co., Ltd. 在电子行业的五个发展故事

故事一:创立与早期发展

Furukawa Electric Co., Ltd.(简称“Furukawa Electric”或“古河电工”)的故事始于1884年,当时公司在日本东京建立了铜精炼设施和线缆加工工厂。这一初期的发展奠定了公司在电线电缆领域的坚实基础。随着工业革命的推进,对通信和电力传输的需求日益增长,Furukawa Electric凭借其精湛的技艺和高质量的产品逐渐在市场中站稳脚跟。通过不断的技术创新和产品优化,公司逐渐扩大了其业务范围,涉足电信、电子产品、汽车等多个领域。

故事二:技术创新与领先地位

在20世纪,Furukawa Electric成为了新技术领域的先驱。公司不仅在传统的电线电缆领域保持领先地位,还积极投入研发,开发出了许多具有划时代意义的产品。例如,在光通信领域,Furukawa Electric致力于推动“光纤到户(FTTH)”工程,为信息化社会提供了重要的技术支持。此外,公司在半导体领域也取得了显著成就,开发了多种先进的电子元件和散热产品,满足了市场对高性能电子产品的需求。

故事三:汽车领域的深入合作

近年来,Furukawa Electric进一步扩展了其业务范围,与多家汽车制造商建立了紧密的合作关系。特别是在电动汽车领域,公司凭借其先进的高压绕组线(HVW)技术,为汽车制造商提供了高性能的电动机解决方案。这些绕组线不仅满足了电动汽车对更轻盈、更薄的电动机绕组线及更高电压的需求,还提升了电动机的整体性能。通过与Superior Essex Inc.的合资企业“Essex Furukawa Magnet Wire Europe GmbH”,Furukawa Electric成功将这一技术引入欧洲市场,进一步巩固了其在全球汽车行业的领先地位。

故事四:全球市场的拓展

随着全球化的加速推进,Furukawa Electric也加快了其全球市场的拓展步伐。公司在全球范围内建立了完善的生产和销售网络,覆盖了亚洲、欧洲、美洲等多个地区。通过与国际知名企业的合作与竞争,Furukawa Electric不断提升自身的技术实力和市场竞争力。同时,公司还积极参与国际标准的制定和推广工作,为全球电子行业的发展做出了重要贡献。

故事五:可持续发展与社会责任

在追求经济效益的同时,Furukawa Electric也始终关注可持续发展和社会责任。公司致力于通过技术创新和产品优化来降低能耗和减少环境污染。例如,在电力传输系统和配电电缆领域,Furukawa Electric开发出了多种高效节能的产品,满足了市场对绿色、环保产品的需求。此外,公司还积极参与社会公益活动,为当地社区的发展贡献自己的力量。这些举措不仅提升了公司的社会形象,也为其在电子行业的长期发展奠定了坚实的基础。

Anderson Power公司的发展小趣事

Anderson Power是一家专注于电源连接器和配件制造的公司,以下是该公司发展的相关故事:

  1. 公司成立与初期阶段:Anderson Power成立于1953年,总部位于美国马萨诸塞州斯特林。最初,公司主要从事电源连接器的制造和销售。公司的创始人是William E. Anderson,他在创立公司之初便致力于提供高质量、可靠的连接器产品,满足不断增长的市场需求。

  2. 技术创新与产品发展:随着市场的需求不断增长,Anderson Power不断进行技术创新和产品开发,推出了一系列新型的电源连接器和配件产品。公司在连接器设计和制造方面拥有丰富的经验和专业知识,能够根据客户的需求定制各种类型的连接器产品。

  3. 客户合作与市场拓展:Anderson Power与全球各个行业的客户建立了长期稳定的合作关系。公司的客户群涵盖了汽车、航空航天、工业、能源等多个领域。通过与客户的紧密合作,Anderson Power不断拓展市场份额,提升品牌知名度,成为电源连接器领域的领先供应商之一。

  4. 全球布局与生产基地:为了更好地服务全球客户,Anderson Power在全球建立了多个生产基地和销售办事处。除了在美国的总部外,公司还在欧洲、亚洲等地区设立了生产工厂和销售办事处,以满足不同地区客户的需求。这些生产基地拥有先进的设备和技术,能够为客户提供高质量的连接器产品。

  5. 持续发展与未来展望:作为一家专注于电源连接器的公司,Anderson Power将继续致力于技术创新和产品发展。公司将不断推出适应市场需求的新产品,提升生产效率和产品质量,以满足客户不断变化的需求。同时,Anderson Power也将继续关注行业的发展趋势和技术变革,不断调整战略,保持在行业内的竞争优势。

Crocus公司的发展小趣事

展望未来,Crocus将继续致力于TMR传感器技术的研发与创新。公司计划进一步拓展产品线,提升产品性能,满足更多领域的需求。同时,Crocus还将加强与产业链上下游企业的合作,共同推动整个电子行业的发展。

这五个故事展示了Crocus公司在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到技术突破、产品升级、与Allegro的合并、市场拓展以及未来的持续创新,Crocus始终保持着积极进取的精神和不断创新的态度,为电子行业的发展做出了重要贡献。

HEIMANN公司的发展小趣事

展望未来,Crocus将继续致力于TMR传感器技术的研发与创新。公司计划进一步拓展产品线,提升产品性能,满足更多领域的需求。同时,Crocus还将加强与产业链上下游企业的合作,共同推动整个电子行业的发展。

这五个故事展示了Crocus公司在电子行业中的发展历程和取得的成就。从创立初期的艰难探索到技术突破、产品升级、与Allegro的合并、市场拓展以及未来的持续创新,Crocus始终保持着积极进取的精神和不断创新的态度,为电子行业的发展做出了重要贡献。

ApexTool Group公司的发展小趣事

随着全球电子市场的不断扩大,Apex Tool Group积极实施全球化战略,拓展市场版图。公司在全球范围内建立了多个生产基地和分销网络,以便更好地服务全球客户。同时,Apex Tool Group还积极与全球知名的电子企业开展合作,共同推动电动工具技术的创新和发展。这些举措使得Apex Tool Group在全球电子行业中的地位日益稳固。

aconno公司的发展小趣事

随着公司实力的增强,aconno开始积极拓展国内外市场。通过与各大电商平台和分销商建立合作关系,aconno的产品迅速覆盖了更广泛的地域和用户群体。此外,公司还积极参与国际电子展和技术交流会,与全球合作伙伴建立紧密的合作关系,共同推动电子行业的发展。

问答坊 | AI 解惑

机器人领军焊接自动化

随着近年来中国制造业的良好持续发展,带来了焊接行业的空前繁荣。特别是自成功举办北京·埃森焊接展20年来,受益最大的当数国内众多致力于在焊接领域发展的企业,他们通过这一平台不仅很好地展示了企业的产品和品牌形象,更给这些企业与国际同类产 ...…

查看全部问答>

哈工大暑期竞赛培养计划

本帖最后由 paulhyde 于 2014-9-15 03:33 编辑 提供学校的培养计划给大家作参考,希望大家可以有计划的进行训练。祝大家好运!  …

查看全部问答>

开关电源软件设计及破解

本帖最后由 paulhyde 于 2014-9-15 09:11 编辑 自己做的电源模块  …

查看全部问答>

大家现在都用到触摸屏了么?

把一杯咖啡放到“桌上”,屏幕上能马上显示一杯咖啡,还能显示出咖啡的温度等相关信息。也许在几年前这样的应用还是天方夜谭,但是现在已然是实实在在的存在。 一夜之间,iPhone引爆了触摸屏的技术革命,上网本、PC和其它产品也纷纷走向触摸屏技术 ...…

查看全部问答>

创意不仅是制作也是艺术

这只是一个金属的艺术设计作品,也许有人觉得这不能算是创意或者和我们的电子设计论坛没什么关系,我只是想说无论是创意还是电子制作都需要精心的设计,像艺术品一样精心打磨 Henry’s Robots Henry has been creating his army of miniatu ...…

查看全部问答>

哪个好心人有DP-51pro综合仿真实验仪教程

哪个好心人有DP-51pro综合仿真实验仪教程 哪个好心人有DP-51pro综合仿真实验仪教程 ]哪个好心人有DP-51pro综合仿真实验仪教程…

查看全部问答>

硬件开发流程及规范---硬件开发规范化管理

第二章 硬件开发规范化管理 第一节 硬件开发流程 §2.1.1 硬件开发流程文件介绍 硬件开发的规范化是一项重要内容。硬件开发规范化管理是在公司的《硬件开发流程》及相关的《硬件开发文档规范》、《PCB 投板流程》等文件中规划的。 硬件开发流 ...…

查看全部问答>

使用quartus的一个小问题

quartus2的9.1sp2版本能和modulesim-altera的6.5e版本搭配使用吗?…

查看全部问答>

很奇怪的问题,不知各位遇见过没有

本帖最后由 dontium 于 2015-1-23 13:43 编辑 有时,用着用着,再开ccs软件就会出现 Can\\\'t Initiallize Target CPU 1.Target initialization failed<-2092> 2.Check target power,and JTAG connection I/O Port=240 Board Name:F2812 ...…

查看全部问答>