蓝桥杯嵌入式(总结自用)

3.16

今天从开头学到串口的DMA转运,看的是西风的视频(下面附上链接)

Uart、DMA、ADC_哔哩哔哩_bilibili

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);