stm32串口DMA收发,可以接收不定长数据,格式化输出。

本文介绍了一种STM32串口使用DMA进行数据收发的方法,能够接收不定长数据并提供类似printf的格式化输出功能。程序初始化了五个串口,前四个使用DMA,接收和发送的字节数由UART_RECV_BUF_MAX_LEN和UART_SEND_BUF_MAX_LEN定义。代码详细展示了配置串口、DMA和中断处理的过程。
摘要由CSDN通过智能技术生成
<pre name="code" class="html"><span style="font-size:24px;color:#ff0000;"><strong>这个程序同时初始化了五个串口,前四个串口具有dma,所以均采用DMA接收和发送,并提供了格式化输出的类似printf的接口,可以接收未知长度的数据,但是收发字节数</strong></span><pre name="code" class="html">UART_RECV_BUF_MAX_LEN 和<pre name="code" class="html">UART_SEND_BUF_MAX_LEN有关 
 ,和串口5没有用于485通信。 
 
<strong><span style="font-size:24px;color:#ff0000;">//usrt.h</span></strong>
#ifndef _USART_H
#define _USART_H
#include "stm32f10x.h"

typedef enum 
{
  UART1_3520D = 0,   
  UART2_RS232 = 1,
	UART3_GPS = 2,
	UART4_GPRS = 3,
	UART5_RS485 = 4
	
} COM_TypeDef;   

#define UART_RECV_BUF_MAX_LEN 1024
#define UART_SEND_BUF_MAX_LEN 1024
__align(8) typedef struct 
{
	u8 RecvLen;
	u8 RecvBuf[UART_RECV_BUF_MAX_LEN];
	u8 SendLen;
	u8 SendBuf[UART_SEND_BUF_MAX_LEN];
	u8 Status;	//状态位的第一个是忙状态位
	//COM_TypeDef Com;
} SERIAL_TypeDef;

#define USART1_Port GPIOA      
#define USART1_Tx   GPIO_Pin_9
#define USART1_Rx   GPIO_Pin_10

#define USART2_Port  GPIOA
#define USART2_Tx   GPIO_Pin_2
#define USART2_Rx   GPIO_Pin_3

#define USART3_Port  GPIOB
#define USART3_Tx   GPIO_Pin_10
#define USART3_Rx   GPIO_Pin_11

#define USART4_Port  GPIOC
#define USART4_Tx   GPIO_Pin_10
#define USART4_Rx   GPIO_Pin_11

#define USART5_Port  GPIOD
#define USART5_Tx   GPIO_Pin_5
#define USART5_Rx   GPIO_Pin_6

#define UART_485_TX_EN GPIOA->BSS   = GPIO_Pin_1 //485 控制引脚
#define UART_485_RX_EN GPIOA->BRSS  = GPIO_Pin_1

extern u8 UART_STATE_FLAG; 
extern SERIAL_TypeDef serial1, serial2, serial3,serial4,serial5;

void print(char* fmt,...);
void Serial_Init(void);
void UART_Send(COM_TypeDef COM, u8 *buf, u16 len);
void UART_Read(COM_TypeDef COM, u8 *buf);
void USART_Config(COM_TypeDef COM, u32 COM_BaudRate, u8 *recvbuf, u8 *sendbuf);
#endif 


 
<pre name="code" class="html"><strong><span style="font-size:24px;color:#ff0000;">//usrt.c</span></strong>
/***************************************************串口初始化程序2014年12月李乾坤*************************************************/#include "usart.h"#include "stdarg.h"#include "common.h"USART_TypeDef* USART[5] = {USART1, USART2, USART3, UART4, UART5}; DMA_Channel_TypeDef *DMA_Channel[8] = {DMA1_Channel4, DMA1_Channel5, DMA1_Channel7, \DMA1_Channel6, DMA1_Channel2,DMA1_Channel3, DMA2_Channel5, DMA2_Channel3};SERIAL_TypeDef serial1, serial2, serial3,serial4,serial5;SERIAL_TypeDef *serial[5] = {&serial1,&serial2,&serial3,&serial4,&serial5};void Serial_Init(void){mymemset(&serial1, 0, sizeof(SERIAL_TypeDef));mymemset(&serial2, 0, sizeof(SERIAL_TypeDef));mymemset(&serial3, 0, sizeof(SERIAL_TypeDef));mymemset(&serial4, 0, sizeof(SERIAL_TypeDef));mymemset(&serial5, 0, sizeof(SERIAL_TypeDef));USART_Config(UART1_3520D, 115200, serial1.RecvBuf, serial1.SendBuf);//与3520D通信USART_Config(UART2_RS232, 115200, serial2.RecvBuf, serial2.SendBuf);//接RS232USART_Config(UART3_GPS, 9600, serial3.RecvBuf, serial3.SendBuf);//GPSUSART_Config(UART4_GPRS, 115200, serial4.RecvBuf, serial4.SendBuf);//3G// USART_Config(UART5_RS485, 9600, serial1.RecvBuf, serial1.SendBuf);//485云台}/**************************************************************************************@Decr: 初始化串口(利用串口接受完数据会进入空闲中断,在空闲中断里对DMA重新初始化,设置下次传输的参数,\关闭DMA发送完成中断,直接判断CNDTR的值来判断上次传输是否完成@Para1:COM口@Para2:波特率@Para3:发送缓冲区@Para4:
### 回答1: STM32F429是一款性能强大的微控制器,支持多种通信方式,包括串口。通过使用串口DMA功能,可以实现高效的数据收发,提高了处理速度和效率。 要实现STM32F429与屏幕的串口通信,需要先引入HAL库文件,并进行初始化配置。具体步骤可以按照以下流程:首先,启用串口DMA收发中断,并设置DMA缓存区。然后配置串口DMA的参数,并设置传输方向为从内存到外设。接着,调用HAL_UART_Transmit_DMA函数即可开始传输数据到屏幕上。当接收到屏幕返回的数据时,可以通过DMA中断来获取数据,将数据写入自定义的缓存变量中,方便后续处理。 在使用串口DMA传输数据时,要注意数据的格式,以及DMA缓存区的大小。传输的数据格式需要与屏幕的协议一致,以避免数据传输错误。DMA缓存区的大小需要根据实际需求而定,太小可能导致数据丢失,太大则会增加传输时延。 总体而言,STM32F429的串口DMA功能可以简化通信的流程,并提高处理效率。在使用过程中需要注意数据格式、DMA缓存区大小等参数,以保证数据传输的正确性和稳定性。 ### 回答2: stm32f429是一款高性能的单片机,具备强大的串口机制和DMA(直接内存访问)能力。这使得它可以轻松地使用串口DMA向屏幕收发指令。 首先,我们需要在单片机上配置相应的串口通信协议。使用串口DMA通信可以提高通信速率和处理效率。串口DMA通信方式是将数据写入到内存中的缓冲区,然后由DMA直接将数据传输到设备中,这比使用普通的中断方式更为高效。 其次,我们需要将屏幕和单片机连接起来。屏幕一般会使用SPI或者I2C协议进行通讯。在这里,我们可以使用SPI通讯协议。SPI协议是一种高速的串行通讯协议,可以支持全双工通讯,并且可以直接和屏幕进行交互。 最后,我们需要编写代码来实现串口DMA向屏幕发送和接收指令。具体来说,要先初始化串口DMA和SPI,然后开启DMA发送和接收模式,并设置DMA缓存地址和度。这样,单片机就能够通过DMA直接将指令传输到屏幕中,从而实现高效的通讯。 总之,使用串口DMA向屏幕收发指令可以提高通讯速率和处理效率,这需要我们对通讯协议有足够的认识,并且熟练掌握DMA编程技巧。这样,我们才能充分发挥stm32f429的性能和功能,实现更加稳定和高效的嵌入式系统。 ### 回答3: STM32F429是一种基于ARM Cortex-M4内核的高性能微控制器,拥有多种外设,包括DMA串口和LCD控制器。利用串口DMA结合的特性,可以方便地实现与屏幕的通信。 在使用串口DMA向屏幕发送指令时,首先需要配置串口DMA的相关寄存器。可以选择使用中断或轮询模式进行操作,建议使用DMA模式,可以减少MCU的负载和提高传输效率,同时可以实现CPU空闲等待的功能。 对于串口的配置,可以通过设置波特率、数据位数、停止位等参数进行配置,同时使能DMA传输。而对于DMA的配置,则需要设置数据源和目的地的地址,以及数据传输度等参数,同时使能DMA通道。 在数据发送前,需要先将待发送的数据存储在内存中,然后通过DMA传输到串口数据缓冲区,从而实现数据的发送。同时,在进行数据接收时,可通过DMA串口接收到的数据直接传输到内存中进行处理。 总之,通过使用串口DMA结合的方式,可以快速高效地向屏幕发送和接收指令,充分发挥STM32F429的性能和优势。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值