3.16
今天从开头学到串口的DMA转运,看的是西风的视频(下面附上链接)
1.串口的DMA转运重要知识点:
(1)USART_APP.C中
#include "USART.H"
#include "USART_APP.H"
#include "LCD_APP.H"
#define BUUFER_SIZE 64
uint8_t usart_read_buffer[BUUFER_SIZE];
//串口中断
//void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
//{
// if(huart->Instance == USART1)
// {
// uart_rx_ticks = uwTick;
// uart_rx_index++;
//
// HAL_UART_Receive_IT(&huart1, &uart_rx_buffer[uart_rx_index], 1);
//
// }
//}
//空闲中断
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
printf("dma data:%s\r\n", uart_rx_dma_buffer);
// LcdSprintf(Line1, "%s", uart_rx_dma_buffer);
memset(uart_rx_dma_buffer, 0, sizeof(uart_rx_dma_buffer));
}
void usart_proc(void)
{
//串口中断
// if(uart_rx_index == 0) return;
// // 如果从最后一次接收到数据到现在已经超过100ms
// if(uwTick - uart_rx_ticks > 100) // 100ms内没有收到新的数据
// {
// printf("uart data: %s\n", uart_rx_buffer);
// // 清空接收缓冲区,将接收索引置零
// memset(uart_rx_buffer, 0, uart_rx_index);
// uart_rx_index = 0;
//
// // 将UART接收缓冲区指针重置为接收缓冲区的起始位置
// huart1.pRxBuffPtr = uart_rx_buffer;
// }
//空闲中断
}
我觉得DMA转运应该是比赛中最应该使用的,西风的视频里面讲到串口中断直接进行处理会造成数码管的卡死,使用DMA转运则会减轻串口的使用时间,从而解决 数码管的卡死
(2)stm32g4xx_it.c和usart.c中
一定记得加上:
HAL_UARTEx_ReceiveToIdle_DMA(&huart1, uart_rx_dma_buffer, sizeof(uart_rx_dma_buffer));
__HAL_DMA_DISABLE_IT(&hdma_usart1_rx ,DMA_IT_HT);