【STM32】串口原理

单片机有自己的RX(接收端),TX(发送端),有的需要再共同接一个底线,为了保证有相同的参考电势,数据如果是高电平的话,发送过去也是高电平

1.轮询方式

CPU需要时刻注意发送数据寄存器是否为空,如果为空,CPU需要将内存变量数据搬运到发送数据寄存器中,发送数据寄存器的数据会放到发送移位寄存器中去,然后会通过TX发送出去,当发送出去后,发送数据寄存器为空,CPU需要继续搬运。

同理:

CPU需要一直检测接受数据寄存器中的值是否非空,如果非空,CPU需要将接受数据寄存器中的数据搬运到内存变量中, RX接受到数据后,将数据搬运到接受移位寄存器,然后搬运到接受数据寄存器

相关函数及使用:

c 复制代码
 HAL_UART_Transmit(&huart2, (uint8_t*)message,strlen(message), HAL_MAX_DELAY);
c 复制代码
     HAL_UART_Receive(&huart2,(uint8_t*)message,2, HAL_MAX_DELAY);
	  HAL_Delay(1000);
     HAL_UART_Transmit(&huart2, (uint8_t*)message,2, HAL_MAX_DELAY);

轮询方式占用cpu资源,并且只能发送定长数据,下面介绍中断方式

2.中断方式

中断模式下当数据从发送移位寄存器发送出去,会触发发送数据寄存器空中断,此时才需要CPU将数据从内存变量搬运到发送数据寄存器中

同理:

当收到数据并将数据移动到接受数据寄存器,会触发接受数据寄存器非空中断,此时需要CPU来搬运数据到内存变量中,当数据接受完时,我们调用串口中断函数,对接受的数据进行处理,这样就可以节省CPU资源,CPU就可以做其他的事.

在轮询方式的函数后面加IT,也不需要最后一个参数,最后一个参数代表的意思是假如是接受数据,程序会阻塞等待最后一个参数时间,如果没有接受完,则不再接受,程序向下继续。

使用中断模式的话,当数据接受完的话才会调用回调函数,在回调函数中处理接受的数据

3.DMA模式

中断模式中其实还是需要CPU来搬运数据的,有没有其他办法呢?

DMA直接内存访问,可以实现寄存器和内存之间搬运数据,不使用CPU来搬运

DMA模式设置

把之前的函数IT换成DMA即可

4.不定长数据接收

这个用到了串口空闲中断,当RX引脚无后续数据进入时,触发串口空闲中断,调用回调函数来处理数据

回调函数如下:

c 复制代码
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)


但是有一个问题就是使用HAL_UARTEx_ReceiveToIdle_DMA这个函数,DMA传输过半中断也会调用回调函数HAL_UARTEx_RxEventCallback

就是这个时50字节,当发送单片机字节超过25就会调用回调函数,也就是返回给上位机的只有25个字节

所以需要关闭DMA的传输过半中断在使用HAL_UARTEx_ReceiveToIdle_DMA的时候

c 复制代码
 __HAL_DMA_DISABLE_IT(&hdma_usart2_rx,DMA_IT_HT);//第一个参数时串口二的接收,第二个参数表示DMA的过半中断,关闭
相关推荐
Flamingˢ1 天前
ZYNQ + OV5640 视频系统开发(四):HDMI 显示链路
嵌入式硬件·fpga开发·硬件架构·音视频
LCMICRO-133108477461 天前
国产长芯微LDC5141完全P2P替代DAC80501,数模转换器 (DAC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·数模转换器 dac
普中科技1 天前
【普中 51-Ai8051 开发攻略】-- 第 9 章 按键控制实验
单片机·嵌入式硬件·开发板·keil·按键·普中科技·ai8051u
曼亿点1 天前
STM32HAL驱动L298N电机驱动模块(PWM调速+双电机控制)保姆级教程
stm32·单片机·嵌入式硬件
筱谙1 天前
BES 芯片跨核通讯与共享内存设计原理
嵌入式硬件·音频·蓝牙
思为无线NiceRF1 天前
高空线路安装智能安全帽全双工组网对讲系统(含优先级管控)应用方案
嵌入式硬件·物联网
独小乐1 天前
012.整体框架适配SDRAM|千篇笔记实现嵌入式全栈/裸机篇
c语言·汇编·笔记·单片机·嵌入式硬件·arm·gnu
不吃鱼的羊1 天前
ADC扫描组Scan Group
单片机
海砥装备HardAus1 天前
飞控算法中双环串级PID深度解析:角度环与角速度环的协同机制
stm32·算法·无人机·飞控·串级pid
LCMICRO-133108477461 天前
长芯微LPC556D1完全P2P替代DAC8830,是引脚兼容的16位数模转换器,该系列产品为单通道、低功耗、缓冲电压输出型DAC
stm32·单片机·嵌入式硬件·fpga开发·硬件工程·电压输出型dac