DMA+空闲中断+RingBuffer 串口模块配置
- 在uart.c中声明uart_rx_dma_buffer[128],并在bsp_system.h中声明外部变量
- 添加初始化代码,关闭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,在段末添加相同代码 - 在uart_app.c中,写空闲中断函数
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart,uint16_t size)
{
memset(uart_rx_dma_buffer,0,sizeof(uart_rx_dma_buffer));
} - 在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);
} - ringbuffer.c ringbuffer.h:在大模板资源包中复制到工程文件的app文件夹中,并在工程中包含.c文件,在bsp.h中引用ringbuffer.h
- 在uart_app.c中,定义ringbuffer_t usart_rb 结构体,定义uint8_t usart_read_buffer[128] = {0},并在bsp定义外部结构体变量
- 在uart_app.c中的,void HAL_UARTEx_RxEventCallback 里,补充
if(!ringbuffer_is_full(&usart_rb))
{
ringbuffer_write(&usart_rb,uart_rx_dma_buffer,size);
} - 在main.c中的初始化部分添加ringbuffer_init(&usart_rb) //环形缓冲区的初始化
- 在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);
}
