基于STM32CubeMX的LL库学习记录(五)USART_DMA_IDLE 串口接收空闲中断接收数据

管脚图:

串口配置:

主要配置如上;

下面是主要的代码,cubemx的生成文件并未配置DMA接收数据的地址以及长度,还有dma的开关也没有打开,这个要自己写的:

/* USER CODE BEGIN 0 */
uint8_t Usart1_RxBuff[USART1_RXBUFF_SIZE];
__align(8) char Usart1_TxBuff[USART1_TXBUFF_SIZE];

void USART_DMA_CONFIG(void)
{
        LL_DMA_SetPeriphAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)(&USART1->DR));// LL_USART_DMA_GetRegAddr(USART1->DR));
        LL_DMA_SetMemoryAddress(DMA1, LL_DMA_CHANNEL_5, (uint32_t)Usart1_RxBuff);
        LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, USART1_RXBUFF_SIZE);
      LL_DMA_EnableIT_TC(DMA1, LL_DMA_CHANNEL_5);
        LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
      LL_USART_EnableDMAReq_RX(USART1);
      LL_USART_EnableIT_IDLE(USART1);
 
}

void USART_RxIdleCallback(void)
{
      uint8_t cnt;
        if(LL_USART_IsActiveFlag_IDLE(USART1))
        {
            LL_DMA_DisableChannel(DMA1, LL_DMA_CHANNEL_5); //¹Ø±ÕDMA
        
            cnt = LL_DMA_GetDataLength(DMA1,LL_DMA_CHANNEL_5);
            
          u1_printf("data len is:%d\r\n",USART1_RXBUFF_SIZE-cnt);
          u1_printf("data rx is:%s\r\n",Usart1_RxBuff);
            
            LL_DMA_SetDataLength(DMA1, LL_DMA_CHANNEL_5, USART1_RXBUFF_SIZE);             
            LL_DMA_EnableChannel(DMA1, LL_DMA_CHANNEL_5);
            LL_USART_ClearFlag_IDLE(USART1);    
        }
}

源码链接:https://download.csdn.net/download/songskygo/11146815

 

  • 5
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
STM32CubeMX中配置STM32F103C8T6的串口一空闲中断结合DMA接收不定长数据的方法如下: 1. 打开STM32CubeMX软件,选择相应的芯片型号(STM32F103C8T6)。 2. 在配置器中选择相应的外设及其参数。首先配置串口一(USART1),选择波特率、数据位、停止位、校验位等参数根据需求进行配置。 3. 在配置UART设置下拉菜单中选择“Asynchronous”,并勾选“Enable DMA Reception”选项。同时,在“DMA Settings”中选择合适的DMA通道和传输方向(从外设到内存)。 4. 在“Interrupt Settings”中勾选“USART1 global interrupt”选项,并勾选“USART1 interrupt enable”选项,以使能串口一的中断功能。 5. 在Pinout & Configuration选项卡中,单击USART1的引脚图标,选择相应的引脚,如PA9作为USART1的TX引脚,PA10作为USART1的RX引脚。 6. 点击“Project”菜单下的“Generate Code”选项生成代码并导入到工程中。 7. 在生成的代码中找到USART1_IRQHandler函数,使用DMA接收数据的方法如下: ```c void USART1_IRQHandler(void) { if(USART1->SR & USART_SR_IDLE) // 判断空闲中断标志位 { uint32_t temp; // 记录DMA传输的长度 temp = USART1->DR; // 读取USART1数据寄存器 DMA1_Channel5->CNDTR = BUFFER_SIZE; // 设置DMA通道传输长度 DMA1_Channel5->CCR |= DMA_CCR_EN; // 使能DMA1通道5 } } ``` 8. 在代码中定义一个缓冲区数组来存放接收到的数据,定义一个缓冲区大小的常量(BUFFER_SIZE),并初始化DMA传输相关的寄存器,如下: ```c #define BUFFER_SIZE 1024 // 定义缓冲区大小为1024 uint8_t rx_buffer[BUFFER_SIZE]; // 定义接收缓冲区 int main(void) { // ... DMA1_Channel5->CPAR = (uint32_t)&USART1->DR; // 设置DMA通道外设地址为USART1数据寄存器地址 DMA1_Channel5->CMAR = (uint32_t)rx_buffer; // 设置DMA通道存储器地址为接收缓冲区地址 DMA1_Channel5->CNDTR = BUFFER_SIZE; // 设置DMA通道传输长度 DMA1_Channel5->CCR |= DMA_CCR_MINC | DMA_CCR_CIRC | DMA_CCR_TCIE; // 使能DMA通道5、存储器增量模式、循环模式、传输完成中断 NVIC_EnableIRQ(USART1_IRQn); // 使能USART1中断 // ... } ``` 通过以上配置,当串口一接收到数据并产生空闲中断时,中断服务程序会启动DMA传输,将接收到的数据存储在缓冲区中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值