DMA 空闲中断 ringbuffer配置

DMA+空闲中断+RingBuffer 串口模块配置

  1. 在uart.c中声明uart_rx_dma_buffer[128],并在bsp_system.h中声明外部变量
  2. 添加初始化代码,关闭DMA的半中断:
    在uart.c中,/* USER CODE BEGIN USART1_Init 2 */开始,添加 HAL_UARTEx_ReceiveToIdle_DMA(&huart1,uart_rx_dma_buffer,sizeof(uart_rx_dma_buffer));
    __HAL_DMA_DISABLE_IT(&hdma_usart1_rx,DMA_IT_HT);
    在stm32g4xx_it.c,引用bsy头文件,找到USART1_IRQHandler,在段末添加相同代码
  3. 在uart_app.c中,写空闲中断函数
    void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t size)
    {
    memset(uart_rx_dma_buffer,0,sizeof(uart_rx_dma_buffer));
    }
  4. 在uart_app.c中,写
    void uart_proc(void)
    {
    if(ringbuffer_is_empty(&usart_rb)) return;
    ringbuffer_read(&usart_rb,usart_read_buffer,usart_rb.itemCount);
    printf(“ringbuffer data:%s\n”,usart_read_buffer);
    memset(usart_read_buffer,0,sizeof(uint8_t) * 128);
    }
  5. ringbuffer.c ringbuffer.h:在大模板资源包中复制到工程文件的app文件夹中,并在工程中包含.c文件,在bsp.h中引用ringbuffer.h
  6. 在uart_app.c中,定义ringbuffer_t usart_rb 结构体,定义uint8_t usart_read_buffer[128] = {0},并在bsp定义外部结构体变量
  7. 在uart_app.c中的,void HAL_UARTEx_RxEventCallback 里,补充
    if(!ringbuffer_is_full(&usart_rb))
    {
    ringbuffer_write(&usart_rb,uart_rx_dma_buffer,size);
    }
  8. 在main.c中的初始化部分添加ringbuffer_init(&usart_rb) //环形缓冲区的初始化
  9. 在uart_app.c中,编写解析函数
    void uart_proc(void)
    {
    if(ringbuffer_is_empty(&usart_rb)) return;
    ringbuffer_read(&usart_rb,usart_read_buffer,usart_rb.itemCount);
    printf(“ringbuffer data:%s\n”,usart_read_buffer);
    memset(usart_read_buffer,0,sizeof(uint8_t) * 128);
    }

记得在usart.c中初始化变量

1 个赞