使用DMA是实现USART1的不定长接收和发送数据。接收采用FIFO缓存和队列的方式向应用层抛数据。首先定义接收和发送的缓存区,缓存区的大小根据收发数据量确定。
#define USAER1_RX_MAX 128 //串口1最大接收数据量
#define USAER1_TX_MAX 128
#define USART1_RX_FIFO_MAX (1024)
static uint8_t USART1_TX_Buff[USAER1_TX_MAX];
static uint8_t USART1_RX_Buff[USAER1_RX_MAX];
然后初始化串口和DMA
/**************************************************************************
函 数 名:Usart1_Init
功能描述:串口1初始化。
输入参数:
bound:波特率
输出参数:None
返 回 值:None。
其他说明:
使用串口1前,必须调用该函数初始化。
**************************************************************************/
void Usart1_Init(const uint32_t bound)
{
GPIO_InitTypeDef GPIO_InitStructure; //GPIO配置
USART_InitTypeDef USART_InitStructure; //串口配置
NVIC_InitTypeDef NVIC_InitStructure; //中断配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE); //使能USART1,GPIOA时钟
/* 配置串口使用的GPIO */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //PA9(TX)
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA10(RX)
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入(RX引脚可以设置为非模拟功能任何模式,甚至不设置)
GPIO_Init(GPIOA, &GPIO_InitStructure); //初始化GPIOA10
/* 配置串口 */
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
/* 配置中断优先级 */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn; //设置串口1的优先级
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 8 ; //主优先级
NVIC_InitStructure.NVIC_IRQChannelSubPrio

本文介绍了一种使用STM32的USART模块结合DMA实现不定长数据收发的方法。通过定义缓存区并配置串口及DMA参数,实现了数据的有效传输。文章详细解释了初始化过程、DMA中断处理以及数据分帧机制。
最低0.47元/天 解锁文章
2960

被折叠的 条评论
为什么被折叠?



