stm32l552ret 序列槽接收DMA空閑中斷
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0zctR2badlYrR2MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnL2AzN4UDNwgTM5EjMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
接收數組定義:
#pragma pack(4)
unsigned char UART_DMA_BUFF[255];
#pragma pack()
static void MX_USART1_UART_Init(void)
{
/* USER CODE BEGIN USART1_Init 0 */
/* USER CODE END USART1_Init 0 */
/* USER CODE BEGIN USART1_Init 1 */
/* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 9600;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_7_8) != HAL_OK)
{
Error_Handler();
}
if (HAL_UARTEx_EnableFifoMode(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
//使能序列槽空閑中斷
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE);
//DMA 接收位址設定
HAL_UART_Receive_DMA(&huart1,UART_DMA_BUFF,255);
/* USER CODE END USART1_Init 2 */
}
加入的是這兩行
序列槽接收裡改成這樣
#include "string.h"
extern unsigned char UART_DMA_BUFF[255];
unsigned char data_length;
void USART1_IRQHandler(void)
{
/* USER CODE BEGIN USART1_IRQn 0 */
/* USER CODE END USART1_IRQn 0 */
HAL_UART_IRQHandler(&huart1);
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET)
{
/* USER CODE BEGIN USART1_IRQn 1 */
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清楚序列槽二空閑中斷的标志位
HAL_UART_DMAStop(&huart1);
data_length = 255 - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); //計算接收到的資料長度
HAL_UART_Transmit(&huart1,UART_DMA_BUFF,data_length,0x200); //測試函數:将接收到的資料列印出去
memset(UART_DMA_BUFF, 0 ,255); //清除數組
HAL_UART_Receive_DMA(&huart1, UART_DMA_BUFF, 255);
}
/* USER CODE END USART1_IRQn 1 */
}
驗證如下:
附完整工程:
連結:https://pan.baidu.com/s/1EfFHEPwW1IwcBzTusqNm2A
提取碼:1573