首先,使用CubeMX配置STM32
序列槽二用來接收資料,序列槽一列印輸出,使能中斷和DMA。
在序列槽二的初始化裡添加空閑中斷的使能:
static void MX_USART2_UART_Init(void)
{
/* USER CODE BEGIN USART2_Init 0 */
/* USER CODE END USART2_Init 0 */
/* USER CODE BEGIN USART2_Init 1 */
/* USER CODE END USART2_Init 1 */
huart2.Instance = USART2;
huart2.Init.BaudRate = 9600;
huart2.Init.WordLength = UART_WORDLENGTH_8B;
huart2.Init.StopBits = UART_STOPBITS_1;
huart2.Init.Parity = UART_PARITY_NONE;
huart2.Init.Mode = UART_MODE_TX_RX;
huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart2.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart2) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART2_Init 2 */
__HAL_UART_ENABLE_IT(&huart2, UART_IT_IDLE);
/* USER CODE END USART2_Init 2 */
}
在stm32f1xx_it.c檔案下編寫中斷函數:
/**
* @brief This function handles USART2 global interrupt.
*/
void USART2_IRQHandler(void)
{
/* USER CODE BEGIN USART2_IRQn 0 */
/* USER CODE END USART2_IRQn 0 */
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
printf("Rec:%s", RxBuffer); //序列槽一列印輸出
__HAL_UART_CLEAR_IDLEFLAG(&huart2);//清楚序列槽二空閑中斷的标志位
__HAL_DMA_DISABLE(&hdma_usart2_rx); //關閉DMA
DMA1_Channel6->CNDTR = 0xFA; //複位DMA指針
__HAL_DMA_ENABLE(&hdma_usart2_rx); //使能DMA
memset(RxBuffer, 0 ,128); //清除數組
/* USER CODE END USART2_IRQn 1 */
}
這樣就ok啦 具體的我也懶得寫了orz