STM32的三种串口通信协议介绍

控制/MCU

1813人已加入

描述

  STM32串口硬件电路

SPI

  开发板串口硬件电路

  STM32串口编程

  1、整体流程

  ① 开启GPIO时钟和USARTX时钟

  ② 配置TX和RX引脚

  ③ 初始化USART控制器

  2、细节实现

  ① 开启GPIO时钟和USARTX时钟

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);

  ② 配置TX和RX引脚

  /* Configure USART1 Tx (PA.09) as alternate function push-pull */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* Configure USART1 Rx (PA.10) as input floating */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  ③ 初始化USART控制器

  /* USART1 mode config */

  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_Init(USART1, &USART_InitStructure);

  USART_Cmd(USART1, ENABLE);

  STM32F的三种串口通信协议

  1、USART

  通用同步异步收发器(USART)提供了一种灵活的方法与使用工业标准NRZ异步串行数据格式的外部设备之间进行全双工数据交换。

  USART支持同步单向通信和半双工单线通信,也支持LIN(局部互联网)、智能卡协议和IrDA(红外数据组织)SIR ENDEC规范,以及调制解调器(CTS/RTS)操作。

  USART双向通信至少需要两个引脚:接收数据输入(RX)和发送数据输出(TX)。

  同步模式下需要引脚:发送器时钟输出(CK)

  IrDA模式需要引脚:数据输入(IrDA_RDI)、数据输出(IrDA_RDO)

  USART特点:

  1. 全双工操作(相互独立的接收数据和发送数据);

  2. 同步操作时,可主机时钟同步,也可从机时钟同步;

  3. 独立的高精度波特率发生器,不占用定时/计数器;

  4. 支持5、6、7、8和9位数据位,1或2位停止位的串行数据桢结构;

  5. 由硬件支持的奇偶校验位发生和检验;

  6. 数据溢出检测;

  7. 帧错误检测;

  8. 包括错误起始位的检测噪声滤波器和数字低通滤波器;

  9. 三个完全独立的中断,TX发送完成、TX发送数据寄存器空、RX接收完成;

  10.支持多机通信模式;

  11.支持倍速异步通信模式。

  2、SPI

  串口外围设备接口SPI是一种低成本,易使用的接口,主要用于微控制器与外围设备芯片之间的连接。SPI接口可以用来连接存储器、A/D转换器、D/A转换器、实时时钟日历、LCD驱动、传感器、音频芯片等。

  SPI是一个四线接口:主机输出/从机输入(MOSI)、主机输入/从机输出(MISO)、串行SCLK或SCK、外设芯片(CS/)。

  SPI是一个同步协议接口,所有的传输都参照一个共同的时钟,这个时钟信号由主机产生。SPI允许芯片与外部设备以半/全双工、同步、串行方式通信。

  根据时钟极性和时钟相位的不同,SPI有4种工作模式,如图。

SPI

  3、I2C

  I2C总线是同步通信的一种特殊形式,具有接口少,控制简单,器件封装形式小、通信速率较高等优点。

  I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。

  I2C总线的操作模式:主发送模式、从接收模式、从发送模式、从接收模式。

  I2C总线的模拟时序如下图:

SPI

  STM32串口通信程序设计要点

  1、要是能串口时钟同时要是能复用总线时钟和对应的IO时钟,如:

  //使能串口1,PA,AFIO总线

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |

  RCC_APB2Periph_AFIO |

  RCC_APB2Periph_USART1 ,

  ENABLE);

  2、stm32f10x_conf.h 中使能

  #include “stm32f10x_usart.h”

  #include “misc.h”

  3、使能中断的话要配置NVIC,在中断函数中加入相应的程序。

  简单的配置例程:

  /**************************************************************

  文件名:USART.c

  功能:串口初始化配置以及相关函数

  串口配置注意事项:

  1、 stm32f10x_conf.h 中使能

  #include “stm32f10x_usart.h”

  #include “misc.h”

  2、 本文件中定义的串口相关函数需要在头文件中做外部函数声明

  ***************************************************************/

  #include “STM32Lib//stm32f10x.h”

  void USART_Configuration(void)

  {

  GPIO_InitTypeDef GPIO_InitStructure;

  USART_InitTypeDef USART_InitStructure;

  USART_ClockInitTypeDef USART_ClockInitStructure;

  //使能串口1,PA,AFIO总线

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |

  RCC_APB2Periph_AFIO |

  RCC_APB2Periph_USART1 ,

  ENABLE);

  /* A9 USART1_Tx */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //推挽输出-TX

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  /* A10 USART1_Rx */

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//浮空输入-RX

  GPIO_Init(GPIOA, &GPIO_InitStructure);

  USART_InitStructure.USART_BaudRate = 9600;

  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_ClockInitStructure.USART_Clock = USART_Clock_Disable;

  USART_ClockInitStructure.USART_CPOL = USART_CPOL_Low;

  USART_ClockInitStructure.USART_CPHA = USART_CPHA_2Edge;

  USART_ClockInitStructure.USART_LastBit = USART_LastBit_Disable;

  USART_ClockInit(USART1, &USART_ClockInitStructure);

  USART_Init(USART1, &USART_InitStructure);

  /* Enable the USARTx */

  USART_Cmd(USART1, ENABLE);

  }

  void USART1_Putc(unsigned char c)

  {

  USART_SendData(USART1, c);

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET );

  }

  void USART1_Puts(char * str)

  {

  while(*str)

  {

  USART_SendData(USART1, *str++);

  /* Loop until the end of transmission */

  while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);

  }

  }

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分