一、通信相关知识
在计算机设备与设备之间或集成威廉希尔官方网站
之间常常需要进行数据传输(通信)。
1.按数据传送的方式,通信可分为串行通信与并行通信两种方式:
⚫ 并行通信:数据各个位同时传输。
⚫ 串行通信:数据按位顺序一位一位的传输。
——在数据传输速率相同的情况下,很明显,因为一次可传输多个数据位的数据 ,并行通信传输的数据量要大得多。
——而串行通信则可以节省数据线的硬件成本(特别是远距离时)以及PCB 的布线面积。
——并行传输对同步要求较高,而且信号干扰的问题会显著影响通信性能。现在随着通信速率的提高,越来越多的应用场合采用高速率的串行传输。
2.根据数据通信的方向,通信又分为全双工、半双工及单工通信。
⚫单工:数据传输只支持数据在一个方向上传输,在任何时刻都只能进行一个方向的通信。即一个固定为发送设备,另一个固定为接收设备。
⚫半双工:两个设备之间可以收发数据,但不能在同一时刻进行。允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种可以切换方向的单工通信;
⚫全双工:在同一时刻,两个设备之间可以同时收发数据。允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
3. 根据通信的数据同步方式,又分为同步通信和异步通信两种
同步通信和异步通信可以根据通信过程中是否有使用到时钟信号进行简单的区分。
⚫ 同步通信:带时钟同步信号传输;例如SPI,IIC通信接口。
在同步通信中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通信中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
⚫ 异步通信:不带时钟同步信号。例如:UART,单总线。
在异步通信中,通信双方要做好约定,如直接在数据信号中穿插一些信号位,或者把主体数据进行打包,以数据帧的格式传输数据,约定数据的传输速率等。
4.通信速率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示,即每秒钟传输的二进制位数,单位为比特每秒bit/s(bps),人们常常直接以波特率来表示比特率。
串口波特率/比特率:9600bps,就是每秒中传输9600bit。
波特率的常用值有2400、9600、19200、115200。
波特率越大,传输速率越快。
二、STM32串口
⚫ UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器
⚫ USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步异步收发器
大容量STM32F10x系列芯片,包含3个USARTx(x=1~3)和2个UARTx(x=4、5)
我们平时用的串口通信基本都是UART(全双工异步通信)
1.UART引脚连接方法
1)芯片连接芯片
对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,一个芯片发送数据,另一个芯片接受数据,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信。
2)芯片连接PC
芯片常用TTL电平电平标准,PC机常用RS232的电平标准。
相比TTL电平,RS-232可以使用-15V 表示逻辑1,+15V 表示逻辑0,增加了串口通信的远距离传输及抗干扰能力。
若是芯片与PC机相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机通常使用的都是RS232通讯标准,芯片采用的是 TTL电平,所以需要连接一个RS232转换器将TTL电平转换成 PC可以识别的RS232电平,再交叉连接。
3) 芯片与芯片通过DB9接口连接
两个芯片通过RS232标准COM口(也成DB9接口)连接时,需要进行两次TTL电平和RS323电平的转换。
4)USB转TTL串口芯片
2.UART异步通信方式特点:
⚫ 全双工异步通信。
⚫ 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
⚫ 可编程的数据字长度(8位或者9位);
⚫ 可配置的停止位(支持1或者2位停止位);
⚫ 可配置的使用DMA多缓冲器通信。
⚫ 单独的发送器和接收器使能位。
⚫ 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
⚫ 多个带标志的中断源。触发中断。
⚫ 其他:校验控制,四个错误检测标志。
3.串口通信过程
1) 数据接收过程
外部设备将数据发送到串行输入移位寄存器,串行输入移位寄存器在将数据传送到输入数据缓冲器,CPU在从输入数据缓冲器中读出数据。
2)数据发送过程
CPU将要发送的数据写入输出数据缓冲器,输出数据缓冲器在将数据写入串行输出移位寄存器,串行移位寄存器在将数据输出到外部设备。
4.STM32串口异步通信需要定义的参数
1) 波特率设置:异步通讯中由于没有时钟信号所以两个通讯设备之间需要约定好波特率
2) 起始位:串口通信的一个数据包从起始信号开始,数据包的起始信号由一个逻辑0 的数据位表示,通信双方要约定一致。
3) 停止位:串口通信的一个数据包直到停止信号结束,而数据包的停止信号可由0.5、1、1.5 或2 个逻辑1 的数据位表示,只要双方约定一致即可。
4) 有效数据位(8位)
5) 奇偶校验位(第9位) :在有效数据之后,有一个可选的数据校验位。校验控制使能后可选择奇校验(odd)或偶校验(even)。
补充:
奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。
三、常用串口寄存器
1.USART_SR状态寄存器
串口的状态可以通过状态寄存器 USART_SR 读取:
(1)RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
(2)TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:
1)读 USART_SR,写USART_DR;
2)直接向该位写 0。
2.USART_DR数据寄存器
3.USART_BRR波特率寄存器
4.USART_CR1控制寄存器 1
四、串口库函数配置
1.串口时钟使能, GPIO 时钟使能
RCC_APB2PeriphClockCmd();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
2.串口复位
void USART_DeInit(USART_TypeDef* USARTx)
USART_DeInit(USART1); //复位串口 1
这一步不是必须的。
3. GPIO 端口模式设置 端口模式设置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式为复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
4.串口参数初始化
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8个数据模式
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); //根据设定参数使能串口1
5.使能串口
USART_Cmd();
USART_Cmd(USART1, ENABLE);
6.初始化 NVIC并且开启中断
如果需要开启中断才这个步骤.
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 中断配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指定串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能IQR通道
NVIC_Init(&NVIC_InitStructure); //根据制定参数初始化中断
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收中断
7.编写中断处理函数
USARTx_IRQHandler();
void USART1_IRQHandler(void) //串口1中断函数
{
......
}
8.其他常用串口函数
1)串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
2)串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//判断串口1读寄存器是否非空(RXNE)
USART_GetFlagStatus(USART1, USART_FLAG_TC);//判断串口1发送是否完成(TC)
与串口基本配置直接相关的几个固件库函数和定义主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中,可自行查阅。
3)获取相应中断状态:
当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:
USART_GetITStatus(USART1, USART_IT_TC)
返回值是 SET,说明是串口发送完成中断发生。
一、通信相关知识
在计算机设备与设备之间或集成威廉希尔官方网站
之间常常需要进行数据传输(通信)。
1.按数据传送的方式,通信可分为串行通信与并行通信两种方式:
⚫ 并行通信:数据各个位同时传输。
⚫ 串行通信:数据按位顺序一位一位的传输。
——在数据传输速率相同的情况下,很明显,因为一次可传输多个数据位的数据 ,并行通信传输的数据量要大得多。
——而串行通信则可以节省数据线的硬件成本(特别是远距离时)以及PCB 的布线面积。
——并行传输对同步要求较高,而且信号干扰的问题会显著影响通信性能。现在随着通信速率的提高,越来越多的应用场合采用高速率的串行传输。
2.根据数据通信的方向,通信又分为全双工、半双工及单工通信。
⚫单工:数据传输只支持数据在一个方向上传输,在任何时刻都只能进行一个方向的通信。即一个固定为发送设备,另一个固定为接收设备。
⚫半双工:两个设备之间可以收发数据,但不能在同一时刻进行。允许数据在两个方向上传输,但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种可以切换方向的单工通信;
⚫全双工:在同一时刻,两个设备之间可以同时收发数据。允许数据同时在两个方向上传输,因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。
3. 根据通信的数据同步方式,又分为同步通信和异步通信两种
同步通信和异步通信可以根据通信过程中是否有使用到时钟信号进行简单的区分。
⚫ 同步通信:带时钟同步信号传输;例如SPI,IIC通信接口。
在同步通信中,收发设备双方会使用一根信号线表示时钟信号,在时钟信号的驱动下双方进行协调,同步数据。通信中通常双方会统一规定在时钟信号的上升沿或下降沿对数据线进行采样。
⚫ 异步通信:不带时钟同步信号。例如:UART,单总线。
在异步通信中,通信双方要做好约定,如直接在数据信号中穿插一些信号位,或者把主体数据进行打包,以数据帧的格式传输数据,约定数据的传输速率等。
4.通信速率
衡量通信性能的一个非常重要的参数就是通信速率,通常以比特率(Bitrate)来表示,即每秒钟传输的二进制位数,单位为比特每秒bit/s(bps),人们常常直接以波特率来表示比特率。
串口波特率/比特率:9600bps,就是每秒中传输9600bit。
波特率的常用值有2400、9600、19200、115200。
波特率越大,传输速率越快。
二、STM32串口
⚫ UART(Universal Asynchronous Receiver/Transmitter)通用异步收发器
⚫ USART(Universal Synchronous/Asynchronous Receiver/Transmitter)通用同步异步收发器
大容量STM32F10x系列芯片,包含3个USARTx(x=1~3)和2个UARTx(x=4、5)
我们平时用的串口通信基本都是UART(全双工异步通信)
1.UART引脚连接方法
1)芯片连接芯片
对于两个芯片之间的连接,两个芯片GND共地,同时TXD和RXD交叉连接。这里的交叉连接的意思就是,一个芯片发送数据,另一个芯片接受数据,芯片1的RxD连接芯片2的TXD,芯片2的RXD连接芯片1的TXD。这样,两个芯片之间就可以进行TTL电平通信。
2)芯片连接PC
芯片常用TTL电平电平标准,PC机常用RS232的电平标准。
相比TTL电平,RS-232可以使用-15V 表示逻辑1,+15V 表示逻辑0,增加了串口通信的远距离传输及抗干扰能力。
若是芯片与PC机相连,除了共地之外,就不能这样直接交叉连接了。尽管PC机和芯片都有TXD和RXD引脚,但是通常PC机通常使用的都是RS232通讯标准,芯片采用的是 TTL电平,所以需要连接一个RS232转换器将TTL电平转换成 PC可以识别的RS232电平,再交叉连接。
3) 芯片与芯片通过DB9接口连接
两个芯片通过RS232标准COM口(也成DB9接口)连接时,需要进行两次TTL电平和RS323电平的转换。
4)USB转TTL串口芯片
2.UART异步通信方式特点:
⚫ 全双工异步通信。
⚫ 分数波特率发生器系统,提供精确的波特率。发送和接受共用的可编程波特率,最高可达4.5Mbits/s
⚫ 可编程的数据字长度(8位或者9位);
⚫ 可配置的停止位(支持1或者2位停止位);
⚫ 可配置的使用DMA多缓冲器通信。
⚫ 单独的发送器和接收器使能位。
⚫ 检测标志:① 接受缓冲器 ②发送缓冲器空 ③传输结束标志
⚫ 多个带标志的中断源。触发中断。
⚫ 其他:校验控制,四个错误检测标志。
3.串口通信过程
1) 数据接收过程
外部设备将数据发送到串行输入移位寄存器,串行输入移位寄存器在将数据传送到输入数据缓冲器,CPU在从输入数据缓冲器中读出数据。
2)数据发送过程
CPU将要发送的数据写入输出数据缓冲器,输出数据缓冲器在将数据写入串行输出移位寄存器,串行移位寄存器在将数据输出到外部设备。
4.STM32串口异步通信需要定义的参数
1) 波特率设置:异步通讯中由于没有时钟信号所以两个通讯设备之间需要约定好波特率
2) 起始位:串口通信的一个数据包从起始信号开始,数据包的起始信号由一个逻辑0 的数据位表示,通信双方要约定一致。
3) 停止位:串口通信的一个数据包直到停止信号结束,而数据包的停止信号可由0.5、1、1.5 或2 个逻辑1 的数据位表示,只要双方约定一致即可。
4) 有效数据位(8位)
5) 奇偶校验位(第9位) :在有效数据之后,有一个可选的数据校验位。校验控制使能后可选择奇校验(odd)或偶校验(even)。
补充:
奇偶校验(Parity Check)是一种校验代码传输正确性的方法。根据被传输的一组二进制代码的数位中“1”的个数是奇数或偶数来进行校验。采用奇数的称为奇校验,反之,称为偶校验。采用何种校验是事先规定好的。通常专门设置一个奇偶校验位,用它使这组代码中“1”的个数为奇数或偶数。若用奇校验,则当接收端收到这组代码时,校验“1”的个数是否为奇数,从而确定传输代码的正确性。
三、常用串口寄存器
1.USART_SR状态寄存器
串口的状态可以通过状态寄存器 USART_SR 读取:
(1)RXNE(读数据寄存器非空),当该位被置 1 的时候,就是提示已经有数据被接收到了,并且可以读出来了。这时候我们要做的就是尽快去读取 USART_DR,通过读 USART_DR 可以将该位清零,也可以向该位写 0,直接清除。
(2)TC(发送完成),当该位被置位的时候,表示 USART_DR 内的数据已经被发送完成了。如果设置了这个位的中断,则会产生中断。该位也有两种清零方式:
1)读 USART_SR,写USART_DR;
2)直接向该位写 0。
2.USART_DR数据寄存器
3.USART_BRR波特率寄存器
4.USART_CR1控制寄存器 1
四、串口库函数配置
1.串口时钟使能, GPIO 时钟使能
RCC_APB2PeriphClockCmd();
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
2.串口复位
void USART_DeInit(USART_TypeDef* USARTx)
USART_DeInit(USART1); //复位串口 1
这一步不是必须的。
3. GPIO 端口模式设置 端口模式设置
void GPIO_Init(GPIO_TypeDef* GPIOx, GPIO_InitTypeDef* GPIO_InitStruct);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA.9
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//速度为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //模式为复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA.9
4.串口参数初始化
void USART_Init(USART_TypeDef* USARTx, USART_InitTypeDef* USART_InitStruct);
USART_InitTypeDef USART_InitStructure;
USART_InitStructure.USART_BaudRate = bound;//串口波特率
USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8个数据模式
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); //根据设定参数使能串口1
5.使能串口
USART_Cmd();
USART_Cmd(USART1, ENABLE);
6.初始化 NVIC并且开启中断
如果需要开启中断才这个步骤.
void NVIC_Init(NVIC_InitTypeDef* NVIC_InitStruct);
NVIC_InitTypeDef NVIC_InitStructure;
//Usart1 中断配置
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//指定串口1中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //响应优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能IQR通道
NVIC_Init(&NVIC_InitStructure); //根据制定参数初始化中断
void USART_ITConfig(USART_TypeDef* USARTx, uint16_t USART_IT,
FunctionalState NewState)
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启串口接收中断
7.编写中断处理函数
USARTx_IRQHandler();
void USART1_IRQHandler(void) //串口1中断函数
{
......
}
8.其他常用串口函数
1)串口数据收发:
void USART_SendData();//发送数据到串口,DR
uint16_t USART_ReceiveData();//接受数据,从DR读取接受到的数据
2)串口传输状态获取:
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, uint16_t USART_FLAG);
USART_GetFlagStatus(USART1, USART_FLAG_RXNE);//判断串口1读寄存器是否非空(RXNE)
USART_GetFlagStatus(USART1, USART_FLAG_TC);//判断串口1发送是否完成(TC)
与串口基本配置直接相关的几个固件库函数和定义主要分布在stm32f10x_usart.h和stm32f10x_usart.c文件中,可自行查阅。
3)获取相应中断状态:
当我们使能了某个中断的时候,当该中断发生了,就会设置状态寄存器中的某个标志位。经常我们在中断处理函数中,要判断该中断是哪种中断,使用的函数是:
ITStatus USART_GetITStatus(USART_TypeDef* USARTx, uint16_t USART_IT)
比如我们使能了串口发送完成中断,那么当中断发生了, 我们便可以在中断处理函数中调用这个函数来判断到底是否是串口发送完成中断,方法是:
USART_GetITStatus(USART1, USART_IT_TC)
返回值是 SET,说明是串口发送完成中断发生。
举报