日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

手把手教你从0创建STM32串口空闲+DMA数据接收工程

發(fā)布時(shí)間:2023/12/10 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 手把手教你从0创建STM32串口空闲+DMA数据接收工程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

串口通訊是嵌入式系統(tǒng)中最常用的通訊方式。

STM32的串口接收普通的方式是在串口讀數(shù)據(jù)寄存器非空RXNE中斷(Read data register not empty)中1個(gè)字節(jié)1個(gè)字節(jié)的接收串口數(shù)據(jù),一幀數(shù)據(jù)的接收完成可以使用結(jié)束幀判斷,也可以使用定時(shí)器計(jì)時(shí)當(dāng)定時(shí)器溢出時(shí)認(rèn)為一幀數(shù)據(jù)已經(jīng)接收完成(一幀數(shù)據(jù)中各byte的時(shí)間間隔很短<1mS,因此可以將定時(shí)器設(shè)置為3mS溢出,在RXNE中斷中清0定時(shí)器,若產(chǎn)生定時(shí)器溢出中斷表明已經(jīng)3mS沒有接收到數(shù)據(jù)了,判定已結(jié)束一幀數(shù)據(jù)接收)。

如上方式每一個(gè)字節(jié)的接收都會觸發(fā)RXNE中斷進(jìn)行接收字節(jié)的保存,因此若一直接收數(shù)據(jù)會占用較多的CPU時(shí)間,從而影響其它業(yè)務(wù)程序的執(zhí)行。比較好的方式是使用DMA+串口空閑中斷實(shí)現(xiàn)數(shù)據(jù)的接收,STM32只需要進(jìn)一次中斷即可。直接存儲器存取(DMA)是用來提供在外設(shè)和存儲器之間或者存儲器和存儲器之間的高速數(shù)據(jù)傳輸。無須CPU干預(yù),數(shù)據(jù)可以通過DMA快速地移動,從而可以節(jié)省CPU的資源來做其他操作。

?

工具準(zhǔn)備:

STM32CubeMX(Verison5.6.1)

KEIL5(uVision V5.26.2.0)

正點(diǎn)原子潘多拉IOT開發(fā)板(芯片型號:STM32L475VET6,也可以使用其它STM32芯片)

?

設(shè)計(jì)需求:

  • LED狀態(tài)指示燈指示系統(tǒng)運(yùn)行狀態(tài)(正常為閃爍)
  • 可實(shí)現(xiàn)串口DMA數(shù)據(jù)接收,并將接收到的數(shù)據(jù)原封不動的返回
  • ?

    硬件配置:

  • 使用板載的綠色LED燈作為系統(tǒng)運(yùn)行狀態(tài)指示燈,硬件引腳為PE8
  • 使用潘多拉IOT開發(fā)板開發(fā)板的USART1,硬件引腳為PA9(TX),PA10(RX)
  • ? ?? USART1配置如下:

    ? ?? 波特率:128000bps

    ? ?? 數(shù)據(jù)位:8

    ? ?? 校驗(yàn)位:無

    ? ?? 停止位:1

    ?

    <Part 1 工程生成>

    1、打開STM32CubeMX后選擇Start My Project from MCU

    2、根據(jù)芯片型號創(chuàng)建工程

    3、選擇系統(tǒng)時(shí)鐘源為外部晶振(可自由配置)

    這里需要解釋的是選擇外部高速時(shí)鐘HSE時(shí)有2個(gè)時(shí)鐘源選項(xiàng)。其中Crystal/Ceramic Resonator表示使用晶振/陶瓷振蕩器Bypass Clock Sourc表示使用旁路時(shí)鐘源,即不使用晶振,外部直接供給一個(gè)可靠的時(shí)鐘源。

    4、配置程序的調(diào)試方式,一般選JTAG或SWD(根據(jù)自己項(xiàng)目的調(diào)試方式選就可以)

    5、配置系統(tǒng)時(shí)鐘頻率,最終配置系統(tǒng)時(shí)鐘頻率為80MHz

    6、配置USART1基本信息

    7、配置USART1 DMA接收

    需要配置的模式為USART1接收DMA,方向從外設(shè)到內(nèi)存(即將USART1接收到的數(shù)據(jù)搬運(yùn)到用戶定義的內(nèi)存空間中),數(shù)據(jù)寬度為1Byte,DMA的優(yōu)先級設(shè)置為High,模式為Normal即搬運(yùn)完用戶指定的字節(jié)數(shù)后停止DMA工作,Circle循環(huán)模式則在搬運(yùn)完成后又從頭開始搬運(yùn),因此循環(huán)接收時(shí)會覆蓋掉用戶定義的內(nèi)存空間中保存的之前接收到的數(shù)據(jù)。

    8、設(shè)置USART1中斷優(yōu)先級

    NVIC在此處默認(rèn)為4bit為搶占優(yōu)先級,0bit為從優(yōu)先級,即不支持配置從優(yōu)先級,搶占優(yōu)先級的配置范圍為0~15(0優(yōu)先級為最高,此處將串口中斷優(yōu)先級設(shè)置為3,也算是優(yōu)先級比較高了)

    9、配置系統(tǒng)運(yùn)行指示燈PE8的管腳信息

    配置系統(tǒng)運(yùn)行指示燈的意義在于,可以直觀的觀察到程序是否正常運(yùn)行。這里需要注意的是,在GPIO端口被配置為輸出時(shí),其弱上拉和弱下拉電阻是不可用的。

    10、配置工程生成相關(guān)配置

    <Part 2 工程修改>

    需要修改的文件有如下幾個(gè):

    main.c

    usart.c

    usart.h

    stm32l4xx_it.c

    ?

    main.c中修改部分如下紅框所示:

    /* USER CODE BEGIN Header */ /********************************************************************************* @file : main.c* @brief : Main program body******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************/ /* USER CODE END Header *//* Includes ------------------------------------------------------------------*/ #include "main.h" #include "dma.h" #include "usart.h" #include "gpio.h"/* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes *//* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD *//* USER CODE END PTD *//* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */ /* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); /* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 *//* USER CODE END 0 *//*** @brief The application entry point.* @retval int*/ int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_DMA_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */HAL_Delay(100); __HAL_UART_CLEAR_IDLEFLAG(&huart1); /* 使能IDLE中斷前先清除其中斷標(biāo)志位,以免使能后就立刻進(jìn)入中斷 */ HAL_Delay(100); __HAL_UART_ENABLE_IT(&huart1, UART_IT_IDLE); /* 使能IDLE串口空閑中斷 */ /* USART1使能串口DMA接收,最多接收DMA_MAX_RECV_SIZE個(gè)字節(jié),接收內(nèi)容存儲于gu8_dma_recv_buff_a緩沖區(qū) */HAL_Delay(100); HAL_UART_Receive_DMA(&huart1, gu8_dma_recv_buff_a, DMA_MAX_RECV_SIZE); /* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_GPIO_TogglePin(LED_G_GPIO_Port, LED_G_Pin); /* 翻轉(zhuǎn)狀態(tài)指示燈引腳電平 */HAL_Delay(300); /* 每300mS翻轉(zhuǎn)一次 */}/* USER CODE END 3 */ }/*** @brief System Clock Configuration* @retval None*/ void SystemClock_Config(void) {RCC_OscInitTypeDef RCC_OscInitStruct = {0};RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};/** Initializes the CPU, AHB and APB busses clocks */RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;RCC_OscInitStruct.HSEState = RCC_HSE_ON;RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;RCC_OscInitStruct.PLL.PLLM = 1;RCC_OscInitStruct.PLL.PLLN = 20;RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV7;RCC_OscInitStruct.PLL.PLLQ = RCC_PLLQ_DIV2;RCC_OscInitStruct.PLL.PLLR = RCC_PLLR_DIV2;if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK){Error_Handler();}/** Initializes the CPU, AHB and APB busses clocks */RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK|RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_4) != HAL_OK){Error_Handler();}PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK){Error_Handler();}/** Configure the main internal regulator output voltage */if (HAL_PWREx_ControlVoltageScaling(PWR_REGULATOR_VOLTAGE_SCALE1) != HAL_OK){Error_Handler();} }/* USER CODE BEGIN 4 *//* USER CODE END 4 *//*** @brief This function is executed in case of error occurrence.* @retval None*/ void Error_Handler(void) {/* USER CODE BEGIN Error_Handler_Debug *//* User can add his own implementation to report the HAL error return state *//* USER CODE END Error_Handler_Debug */ }#ifdef USE_FULL_ASSERT /*** @brief Reports the name of the source file and the source line number* where the assert_param error has occurred.* @param file: pointer to the source file name* @param line: assert_param error line source number* @retval None*/ void assert_failed(uint8_t *file, uint32_t line) { /* USER CODE BEGIN 6 *//* User can add his own implementation to report the file name and line number,tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) *//* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    usart.c中修改部分如下紅框所示:

    /********************************************************************************* File Name : USART.c* Description : This file provides code for the configuration* of the USART instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************//* Includes ------------------------------------------------------------------*/ #include "usart.h"/* USER CODE BEGIN 0 */volatile uint8_t gu8_dma_recv_buff_a[DMA_MAX_RECV_SIZE] = {0}; /* DMA接收緩沖區(qū) */ /* USER CODE END 0 */UART_HandleTypeDef huart1; DMA_HandleTypeDef hdma_usart1_rx;/* USART1 init function */void MX_USART1_UART_Init(void) {huart1.Instance = USART1;huart1.Init.BaudRate = 128000;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.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;if (HAL_UART_Init(&huart1) != HAL_OK){Error_Handler();}}void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle) {GPIO_InitTypeDef GPIO_InitStruct = {0};if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspInit 0 *//* USER CODE END USART1_MspInit 0 *//* USART1 clock enable */__HAL_RCC_USART1_CLK_ENABLE();__HAL_RCC_GPIOA_CLK_ENABLE();/**USART1 GPIO Configuration PA9 ------> USART1_TXPA10 ------> USART1_RX */GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;GPIO_InitStruct.Alternate = GPIO_AF7_USART1;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);/* USART1 DMA Init *//* USART1_RX Init */hdma_usart1_rx.Instance = DMA1_Channel5;hdma_usart1_rx.Init.Request = DMA_REQUEST_2;hdma_usart1_rx.Init.Direction = DMA_PERIPH_TO_MEMORY;hdma_usart1_rx.Init.PeriphInc = DMA_PINC_DISABLE;hdma_usart1_rx.Init.MemInc = DMA_MINC_ENABLE;hdma_usart1_rx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;hdma_usart1_rx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;hdma_usart1_rx.Init.Mode = DMA_NORMAL;hdma_usart1_rx.Init.Priority = DMA_PRIORITY_HIGH;if (HAL_DMA_Init(&hdma_usart1_rx) != HAL_OK){Error_Handler();}__HAL_LINKDMA(uartHandle,hdmarx,hdma_usart1_rx);/* USART1 interrupt Init */HAL_NVIC_SetPriority(USART1_IRQn, 3, 0);HAL_NVIC_EnableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspInit 1 *//* USER CODE END USART1_MspInit 1 */} }void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle) {if(uartHandle->Instance==USART1){/* USER CODE BEGIN USART1_MspDeInit 0 *//* USER CODE END USART1_MspDeInit 0 *//* Peripheral clock disable */__HAL_RCC_USART1_CLK_DISABLE();/**USART1 GPIO Configuration PA9 ------> USART1_TXPA10 ------> USART1_RX */HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);/* USART1 DMA DeInit */HAL_DMA_DeInit(uartHandle->hdmarx);/* USART1 interrupt Deinit */HAL_NVIC_DisableIRQ(USART1_IRQn);/* USER CODE BEGIN USART1_MspDeInit 1 *//* USER CODE END USART1_MspDeInit 1 */} } /* USER CODE BEGIN 1 *//******************************************* * Function Name : UART_IDLE_Callback * Creat Date : 2020/11/05 * Author/Corporation : Jason * Description : usart idle callback function * Para : huart: the usart user use * Return Code : null ------------------------------ * Revision History * Date Revised by Description * 2020/11/05 Jason the first verison *******************************************/ void UART_IDLE_Callback(UART_HandleTypeDef *huart) {if (__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE)){/* 計(jì)算接收到的字節(jié)數(shù) */uint8_t u8_recv_num = DMA_MAX_RECV_SIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); __HAL_UART_CLEAR_IDLEFLAG(huart); /* 清除串口空閑中斷標(biāo)志位 */ HAL_UART_DMAStop(huart); /* 停止串口DMA接收 */ /* 使用阻塞發(fā)送的方式將接收到的數(shù)據(jù)原封不動的返回至上位機(jī) */HAL_UART_Transmit(&huart1, gu8_dma_recv_buff_a, u8_recv_num, 1000);/* 重新使能USART1 DMA接收,最多接收DMA_MAX_RECV_SIZE個(gè)字節(jié),接收內(nèi)容存儲于gu8_dma_recv_buff_a緩沖區(qū) */HAL_UART_Receive_DMA(&huart1, gu8_dma_recv_buff_a, DMA_MAX_RECV_SIZE); } } /* USER CODE END 1 *//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    usart.h中修改部分如下紅框所示:

    /********************************************************************************* File Name : USART.h* Description : This file provides code for the configuration* of the USART instances.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************/ /* Define to prevent recursive inclusion -------------------------------------*/ #ifndef __usart_H #define __usart_H #ifdef __cplusplusextern "C" { #endif/* Includes ------------------------------------------------------------------*/ #include "main.h"/* USER CODE BEGIN Includes *//* USER CODE END Includes */extern UART_HandleTypeDef huart1;/* USER CODE BEGIN Private defines */ #define DMA_MAX_RECV_SIZE 128 /* DMA接收數(shù)據(jù)最大長度 */ /* USER CODE END Private defines */void MX_USART1_UART_Init(void);/* USER CODE BEGIN Prototypes */ extern volatile uint8_t gu8_dma_recv_buff_a[DMA_MAX_RECV_SIZE]; /* USER CODE END Prototypes */#ifdef __cplusplus } #endif #endif /*__ usart_H *//*** @}*//*** @}*//************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    stm32l4xx_it.c中修改部分如下紅框所示:

    /* USER CODE BEGIN Header */ /********************************************************************************* @file stm32l4xx_it.c* @brief Interrupt Service Routines.******************************************************************************* @attention** <h2><center>&copy; Copyright (c) 2020 STMicroelectronics.* All rights reserved.</center></h2>** This software component is licensed by ST under BSD 3-Clause license,* the "License"; You may not use this file except in compliance with the* License. You may obtain a copy of the License at:* opensource.org/licenses/BSD-3-Clause********************************************************************************/ /* USER CODE END Header *//* Includes ------------------------------------------------------------------*/ #include "main.h" #include "stm32l4xx_it.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes *//* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD *//* USER CODE END TD *//* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD *//* USER CODE END PD *//* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM *//* USER CODE END PM *//* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV *//* USER CODE END PV *//* Private function prototypes -----------------------------------------------*/ /* USER CODE BEGIN PFP *//* USER CODE END PFP *//* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 *//* USER CODE END 0 *//* External variables --------------------------------------------------------*/ extern DMA_HandleTypeDef hdma_usart1_rx; extern UART_HandleTypeDef huart1; /* USER CODE BEGIN EV */ extern void UART_IDLE_Callback(UART_HandleTypeDef *huart); /* 串口空閑中斷回調(diào)函數(shù) */ /* USER CODE END EV *//******************************************************************************/ /* Cortex-M4 Processor Interruption and Exception Handlers */ /******************************************************************************/ /*** @brief This function handles Non maskable interrupt.*/ void NMI_Handler(void) {/* USER CODE BEGIN NonMaskableInt_IRQn 0 *//* USER CODE END NonMaskableInt_IRQn 0 *//* USER CODE BEGIN NonMaskableInt_IRQn 1 *//* USER CODE END NonMaskableInt_IRQn 1 */ }/*** @brief This function handles Hard fault interrupt.*/ void HardFault_Handler(void) {/* USER CODE BEGIN HardFault_IRQn 0 *//* USER CODE END HardFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_HardFault_IRQn 0 *//* USER CODE END W1_HardFault_IRQn 0 */} }/*** @brief This function handles Memory management fault.*/ void MemManage_Handler(void) {/* USER CODE BEGIN MemoryManagement_IRQn 0 *//* USER CODE END MemoryManagement_IRQn 0 */while (1){/* USER CODE BEGIN W1_MemoryManagement_IRQn 0 *//* USER CODE END W1_MemoryManagement_IRQn 0 */} }/*** @brief This function handles Prefetch fault, memory access fault.*/ void BusFault_Handler(void) {/* USER CODE BEGIN BusFault_IRQn 0 *//* USER CODE END BusFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_BusFault_IRQn 0 *//* USER CODE END W1_BusFault_IRQn 0 */} }/*** @brief This function handles Undefined instruction or illegal state.*/ void UsageFault_Handler(void) {/* USER CODE BEGIN UsageFault_IRQn 0 *//* USER CODE END UsageFault_IRQn 0 */while (1){/* USER CODE BEGIN W1_UsageFault_IRQn 0 *//* USER CODE END W1_UsageFault_IRQn 0 */} }/*** @brief This function handles System service call via SWI instruction.*/ void SVC_Handler(void) {/* USER CODE BEGIN SVCall_IRQn 0 *//* USER CODE END SVCall_IRQn 0 *//* USER CODE BEGIN SVCall_IRQn 1 *//* USER CODE END SVCall_IRQn 1 */ }/*** @brief This function handles Debug monitor.*/ void DebugMon_Handler(void) {/* USER CODE BEGIN DebugMonitor_IRQn 0 *//* USER CODE END DebugMonitor_IRQn 0 *//* USER CODE BEGIN DebugMonitor_IRQn 1 *//* USER CODE END DebugMonitor_IRQn 1 */ }/*** @brief This function handles Pendable request for system service.*/ void PendSV_Handler(void) {/* USER CODE BEGIN PendSV_IRQn 0 *//* USER CODE END PendSV_IRQn 0 *//* USER CODE BEGIN PendSV_IRQn 1 *//* USER CODE END PendSV_IRQn 1 */ }/*** @brief This function handles System tick timer.*/ void SysTick_Handler(void) {/* USER CODE BEGIN SysTick_IRQn 0 *//* USER CODE END SysTick_IRQn 0 */HAL_IncTick();/* USER CODE BEGIN SysTick_IRQn 1 *//* USER CODE END SysTick_IRQn 1 */ }/******************************************************************************/ /* STM32L4xx Peripheral Interrupt Handlers */ /* Add here the Interrupt Handlers for the used peripherals. */ /* For the available peripheral interrupt handler names, */ /* please refer to the startup file (startup_stm32l4xx.s). */ /******************************************************************************//*** @brief This function handles DMA1 channel5 global interrupt.*/ void DMA1_Channel5_IRQHandler(void) {/* USER CODE BEGIN DMA1_Channel5_IRQn 0 *//* USER CODE END DMA1_Channel5_IRQn 0 */HAL_DMA_IRQHandler(&hdma_usart1_rx);/* USER CODE BEGIN DMA1_Channel5_IRQn 1 *//* USER CODE END DMA1_Channel5_IRQn 1 */ }/*** @brief This function handles USART1 global interrupt.*/ void USART1_IRQHandler(void) {/* USER CODE BEGIN USART1_IRQn 0 *//* HAL_UART_IRQHandler中不包括串口空閑中斷回調(diào)函數(shù),因此需要自己實(shí)現(xiàn)UART_IDLE_Callback */UART_IDLE_Callback(&huart1); /* USER CODE END USART1_IRQn 0 */HAL_UART_IRQHandler(&huart1);/* USER CODE BEGIN USART1_IRQn 1 *//* USER CODE END USART1_IRQn 1 */ }/* USER CODE BEGIN 1 *//* USER CODE END 1 */ /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

    修改完成后編譯,下載到開發(fā)板中。

    <Part 3 ?試驗(yàn)部分>

    使用正點(diǎn)原子串口調(diào)試助手和開發(fā)板進(jìn)行通訊,發(fā)現(xiàn)可以將發(fā)送的內(nèi)容原封不動的返回至上位機(jī),符合程序設(shè)計(jì)意圖,成功實(shí)現(xiàn)DMA+串口空閑中斷接收!

    實(shí)驗(yàn)結(jié)果如下圖所示:

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    ?

    總結(jié)

    以上是生活随笔為你收集整理的手把手教你从0创建STM32串口空闲+DMA数据接收工程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。