前言
在串口通信过程中,我们常常用到接受和发送中断,相信大家都不陌生。这里还有另一个非常有用的中断可能被大家所忽略,即总线空闲状态IDLE中断。当一帧数据传输结束之后,总线会维持高电平空闲,此时会触发MCU的IDLE中断。在本文中,将介绍使用该中断来进行不定长串口数据接收的办法。通过该中断,可以省却用于检测数据传输是否完成的判断操作。
实验环境
· STM32F411RE-NUCLEO
· STM32CubeMX
总线状态分析
下图是发送0xAA 0x55的所抓取到的波形。从图中我们可以看到在发送该帧之前和之后,总线时钟处于IDLE状态。在该帧中,字节与字节之间,没有IDLE状态出现,即不会出现IDLE误触发的情况。
不定长数据接收
本次制作的工程是基于HAL库的。在原生的HAL库中,并没有集成IDLE中断的处理。所以,在本文我们介绍的方法中,需要修改一些库文件来实现。
使用 STM32CubeMX 生成实验工程
工程的配置如下图:
1. 系统始终配置为100MHz
2. 配置USART2为Asynchrones,管脚配置为PA2,PA3。
3. USART2参数:9600Bits/s, 8bits, None,1Stop
为了方便打印接收到的相关信息,需要对生成的工程做如下修改来映射print函数。
main.c-声明
main.c-Code
修改工程代码
增加接收Buffer
main.c
stm32f4xx_hal_uart.c
在接收函数中使能IDLE中断
stm32f4xx_hal_uart.c -> HAL_UART_Receive_DMA()函数
处理IDLE中断
stm32f4xx_hal_uart.c -> HAL_UART_IRQHandler ()函数
接收完成处理(IDLE产生,一帧数据传输完成)
stm32f4xx_hal_uart.c -> HAL_UART_AbortReceive_IT ()函数
main.c
使能接收
main.c
实验结果
使用串口调试,通过STLINK的虚拟串口发送数据,MCU会返回接收多少个字节的数据,并将接收到的数据打印出来。下图是发送0xAA 0x55的实验结果。
小结
合理使用串口总线空闲状态中断,在接收那些数据量不确定的场合会非常方便,同时也能很好地优化代码设计。
关键字:UART IDLE 中断接收 不定长数据
引用地址:
工程师笔记 | 使用UART IDLE中断接收不定长数据
推荐阅读最新更新时间:2024-11-02 22:14
STM32复习笔记(四)串口通信
一、常见的串行通信接口: 二、STM32的串口通信接口: UART:通用异步收发器 USART:通用同步异步收发器 大容量STM32F10x系列芯片,包含3个USART和2个UART 三、UART异步通信方式引脚连接方法: -RXD:数据输入引脚。数据接受。 -TXD:数据发送引脚。数据发送。 四、UART异步通信方式引脚: -RXD:数据输入引脚。数据接受。 -TXD:数据发送引脚。数据发送。 五、UART异步通信方式特点: 全双工异步通信。 分数波特率发生器系统,提供精确的波特率。 -发送和接受共用的可编程波特率,最高可达4.5Mbits/s 可编程的数据字长度(8位或者
[单片机]
ATMEGA128 UART的使用
#include myuart.h #include avr/io.h #include #define UDRE 5 #define RXEN 4 #define TXEN 3 #define UCSZ0 1 #define RXC 7 #define RXCIE 7 ISR(USART0_RX_vect)//接收中断 { unsigned char dummy; while ( UCSR0A & (1 RXC) ) { dummy = UDR0; } USART_Transmit(dummy); } void USART_Transmit(unsigned char data)//发送字节 {
[单片机]
ARM串口(UART)的使用 (S3C2440)
UART概述 通用异步收发器简称UART(Universal Asynchronous Receiver and Transmitter) 工作方式为:串行、全双工。 只需3根线:TXD(发送数据)、RXD(接收数据)、GND。 数据传输流程: 原来是高电平(空闲状态) 发送方拉低电平,保持1bit时间,为起始位。 接收方检测到起始位,然后通信双方按照波特率发送和接收5-8位数据。 若使用校验功能,则发送完数据位后还要接着发送奇偶校验位。 最后,发送停止位。 S3C2440的UART的特性 3个独立异步串行I/O端口,每个都可以是基于中断或基 于 DMA 模式的操作。 UART 通过使用系统时钟可以支持最高 115.2
[单片机]
stm32f103——串口UART
在学习UART之前,我们先来了解一下单片机与外围设备之间的通信: 单片机与外围设备之间的信息交换和传输我们称为通信。过去通信方式有两种:并行通信和串行通信。 并行通信: 定义:并行通信是指利用多条传输线将一个数据的各位同时传送。 传输方式:传输一个字节(8个位)的数据时,并口是将8个位一字排开,分别在8条连接线上同时传输。 特点:传输速度块,适用于短距离通信。 缺点:虽然,并行通信传输速度快,但是由于,线与线之间存在电磁干扰,会导致数据错误。而且由于线比较多,PCB布线比较麻烦,所以并行通信不常用,而串行通信用得比较广泛。 串行通信: 定义:串行通信是指利用一条传输线将数据一位位地顺序传送。 传输方式:传输一个字节(8
[单片机]
SPI UART TWI 三种串行总线协议的区别
1.SPI(Serial Peripheral Interface:串行外设接口) 管脚:SS/SCK/MOSI(SDO)/MISO(SDI)
结构:一个始终发生器、两个移位寄存器(主从各一个);
使用:初始化(完成对两器件器件SPI使能、主从设置、SCK设置、IO方向、采样沿);
编写数据读/写函数(只要发生一次数据传送,两器件的SPIF位就会置位,从而读写);
必要时加入中断程序;
注意:两个寄存器是互通的,其工作过程见网硬盘,从百度文库搜集。因此主机读从机数据必须发送两个字节,第一个是命令字节,告诉从机要准备数据于从机SPD
[嵌入式]
用于ATmega128的软件UART范例程序
一般教科书上提供的UART收发的程序往往是一段采用轮循(Polling)方式完成收发的简单代码。但对于高速的AVR来讲,采用这种方式大大降低了 MUC的效率。在使用AVR时,应根据芯片本身的特点(片内大容量数据存储器RAM,更适合采用高级语言编写系统程序),编写高效可靠的UART收发接口(低层)程序。下面是一个典型的ATmega128的软件USART的接口程序。 #include #define RXB8 1 #define TXB8 0 #define UPE 2 #define OVR 3 #define FE 4 #define UDRE 5 #define RXC 7 #define FRAMING_E
[单片机]
STM32串口中断接收方式详细比较
简介:本例程通过PC机的串口调试助手将数据发送至STM32,接收数据后将所接收的数据又发送至PC机,具体下面详谈 实例一: void USART1_IRQHandler(u8 GetData) { u8 BackData; if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) //中断产生 { USART_ClearITPendingBit(USART1,USART_IT_RXNE); //清除中断标志. GetData = UART1_GetByte(BackData); //也行GetData=USART1- DR; USART1_SendByte(GetData);
[单片机]
MSP430F5438学习笔记 UART ACLK 9600-8-N-1
1.初始化UART0之前需要先初始化ACLK、SMCLK和MCLK。示例代码中使用XT1,ACLK为32768,SMCLK和MCLK约为8MHZ。 2.UART的时钟可以参考ACLK或者SMCLK,本例参考ACLK。由于参考ACLK时钟,所以串口速率不能超过32768。选择9600较为合适。 3.MSP430波特率的产生有两种模式,低频波特率产生和过采样波特率产生。代码中使用低频波特率产生。 4.代码的开头调用了stdio,在函数中宏重写了putchar函数,定向到UART单字节输出。 5.代码初始化之后输出 Hello MSP430,随后直接反射串口接收到的数据,例如发送123456即返回123456。 // 时钟默认情
[单片机]