ZBLOG

使用STM32标准库实现开启串口1DMA接收数据并在空闲时产生中断

使用STM32标准库实现开启串口1的DMA接收数据并在空闲时产生中断的步骤如下:

  1. 配置串口1的硬件初始化参数。包括波特率、数据位、停止位、奇偶校验等。
// 串口1配置
USART_InitTypeDef USART_InitStruct;
USART_InitStruct.BaudRate = 9600;
USART_InitStruct.WordLength = USART_WordLength_8b;
USART_InitStruct.StopBits = USART_StopBits_1;
USART_InitStruct.Parity = USART_Parity_No;
USART_InitStruct.Mode = USART_Mode_Rx;
USART_InitStruct.HardwareFlowControl = USART_HardwareFlowControl_None;

USART_Init(USART1, &USART_InitStruct);
  1. 配置DMA传输参数。
// DMA配置
DMA_InitTypeDef DMA_InitStructure;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&(USART1->DR); // 外设地址为串口数据寄存器地址
DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)rxBuffer; // 内存地址为接收缓冲区起始地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 数据从外设传输到内存
DMA_InitStructure.DMA_BufferSize = RX_BUFFER_SIZE; // 接收缓冲区大小
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址固定不增加
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存地址自动增加以接收多个字节
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; // 外设数据大小为字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; // 内存数据大小为字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环模式,保证持续接收
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 设置DMA优先级为高
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 禁用内存到内存传输模式

DMA_Init(DMA1_Channel5, &DMA_InitStructure); // 使用DMA1的通道5(USART1_RX)
  1. 配置串口空闲中断。
// 使能串口空闲中断
USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);

// 清除空闲中断标志位
__HAL_UART_CLEAR_FLAG(&huart1, UART_FLAG_IDLE);

// 开启 DMA 接收模式和空闲中断
USART_DMACmd(USART1, USART_DMAReq_Rx | USART_DMAReq_Idle, ENABLE);
  1. 实现空闲中断处理函数。
void USART1_IRQHandler(void)
{
    if (USART_GetITStatus(USART1, USART_IT_IDLE) != RESET) { // 判断是否是空闲中断触发
        USART_ClearITPendingBit(USART1, USART_IT_IDLE); // 清除空闲中断标志位
        
        uint16_t rxLen = RX_BUFFER_SIZE - DMA_GetCurrDataCounter(DMA1_Channel5); // 获取接收数据长度
        
        /* 在这里进行接收数据的处理 */
        
        DMA_Cmd(DMA1_Channel5, DISABLE);  // 关闭DMA通道
        DMA_SetCurrDataCounter(DMA1_Channel5, RX_BUFFER_SIZE); // 重新设置DMA传输长度
        DMA_Cmd(DMA1_Channel5, ENABLE); // 开启DMA通道
        
        /* 在这里可以进行下一轮接收准备 */
    }
}

以上就是使用STM32标准库实现开启串口1的DMA接收数据并在空闲时产生中断的基本步骤。需要根据具体的硬件平台和需求做相应的适配和修改。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:http://sdn.0voice.com/?id=4978

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?