generated from Template/H563ZI-HAL-CMake-Template
新增BLE接收,DMA空闲中断
This commit is contained in:
50
Core/Inc/gpdma.h
Normal file
50
Core/Inc/gpdma.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file gpdma.h
|
||||
* @brief This file contains all the function prototypes for
|
||||
* the gpdma.c file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Define to prevent recursive inclusion -------------------------------------*/
|
||||
#ifndef __GPDMA_H__
|
||||
#define __GPDMA_H__
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "main.h"
|
||||
|
||||
/* USER CODE BEGIN Includes */
|
||||
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* USER CODE BEGIN Private defines */
|
||||
|
||||
/* USER CODE END Private defines */
|
||||
|
||||
void MX_GPDMA1_Init(void);
|
||||
|
||||
/* USER CODE BEGIN Prototypes */
|
||||
|
||||
/* USER CODE END Prototypes */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* __GPDMA_H__ */
|
||||
|
||||
@@ -52,6 +52,8 @@ void MemManage_Handler(void);
|
||||
void BusFault_Handler(void);
|
||||
void UsageFault_Handler(void);
|
||||
void DebugMon_Handler(void);
|
||||
void GPDMA1_Channel4_IRQHandler(void);
|
||||
void GPDMA1_Channel5_IRQHandler(void);
|
||||
void TIM1_UP_IRQHandler(void);
|
||||
void USART1_IRQHandler(void);
|
||||
/* USER CODE BEGIN EFP */
|
||||
|
||||
55
Core/Src/gpdma.c
Normal file
55
Core/Src/gpdma.c
Normal file
@@ -0,0 +1,55 @@
|
||||
/* USER CODE BEGIN Header */
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file gpdma.c
|
||||
* @brief This file provides code for the configuration
|
||||
* of the GPDMA instances.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
/* USER CODE END Header */
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "gpdma.h"
|
||||
|
||||
/* USER CODE BEGIN 0 */
|
||||
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* GPDMA1 init function */
|
||||
void MX_GPDMA1_Init(void)
|
||||
{
|
||||
|
||||
/* USER CODE BEGIN GPDMA1_Init 0 */
|
||||
|
||||
/* USER CODE END GPDMA1_Init 0 */
|
||||
|
||||
/* Peripheral clock enable */
|
||||
__HAL_RCC_GPDMA1_CLK_ENABLE();
|
||||
|
||||
/* GPDMA1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(GPDMA1_Channel4_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(GPDMA1_Channel4_IRQn);
|
||||
HAL_NVIC_SetPriority(GPDMA1_Channel5_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(GPDMA1_Channel5_IRQn);
|
||||
|
||||
/* USER CODE BEGIN GPDMA1_Init 1 */
|
||||
|
||||
/* USER CODE END GPDMA1_Init 1 */
|
||||
/* USER CODE BEGIN GPDMA1_Init 2 */
|
||||
|
||||
/* USER CODE END GPDMA1_Init 2 */
|
||||
|
||||
}
|
||||
|
||||
/* USER CODE BEGIN 1 */
|
||||
|
||||
/* USER CODE END 1 */
|
||||
@@ -19,6 +19,7 @@
|
||||
/* Includes ------------------------------------------------------------------*/
|
||||
#include "app_threadx.h"
|
||||
#include "main.h"
|
||||
#include "gpdma.h"
|
||||
#include "memorymap.h"
|
||||
#include "usart.h"
|
||||
#include "gpio.h"
|
||||
@@ -89,6 +90,7 @@ int main(void)
|
||||
|
||||
/* Initialize all configured peripherals */
|
||||
MX_GPIO_Init();
|
||||
MX_GPDMA1_Init();
|
||||
MX_USART1_UART_Init();
|
||||
/* USER CODE BEGIN 2 */
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@
|
||||
#include "stm32h5xx_it.h"
|
||||
/* Private includes ----------------------------------------------------------*/
|
||||
/* USER CODE BEGIN Includes */
|
||||
#include "headfile.h"
|
||||
/* USER CODE END Includes */
|
||||
|
||||
/* Private typedef -----------------------------------------------------------*/
|
||||
@@ -55,6 +56,10 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
/* External variables --------------------------------------------------------*/
|
||||
extern DMA_NodeTypeDef Node_GPDMA1_Channel5;
|
||||
extern DMA_QListTypeDef List_GPDMA1_Channel5;
|
||||
extern DMA_HandleTypeDef handle_GPDMA1_Channel5;
|
||||
extern DMA_HandleTypeDef handle_GPDMA1_Channel4;
|
||||
extern UART_HandleTypeDef huart1;
|
||||
extern TIM_HandleTypeDef htim1;
|
||||
|
||||
@@ -160,6 +165,34 @@ void DebugMon_Handler(void)
|
||||
/* please refer to the startup file (startup_stm32h5xx.s). */
|
||||
/******************************************************************************/
|
||||
|
||||
/**
|
||||
* @brief This function handles GPDMA1 Channel 4 global interrupt.
|
||||
*/
|
||||
void GPDMA1_Channel4_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN GPDMA1_Channel4_IRQn 0 */
|
||||
|
||||
/* USER CODE END GPDMA1_Channel4_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel4);
|
||||
/* USER CODE BEGIN GPDMA1_Channel4_IRQn 1 */
|
||||
|
||||
/* USER CODE END GPDMA1_Channel4_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles GPDMA1 Channel 5 global interrupt.
|
||||
*/
|
||||
void GPDMA1_Channel5_IRQHandler(void)
|
||||
{
|
||||
/* USER CODE BEGIN GPDMA1_Channel5_IRQn 0 */
|
||||
|
||||
/* USER CODE END GPDMA1_Channel5_IRQn 0 */
|
||||
HAL_DMA_IRQHandler(&handle_GPDMA1_Channel5);
|
||||
/* USER CODE BEGIN GPDMA1_Channel5_IRQn 1 */
|
||||
|
||||
/* USER CODE END GPDMA1_Channel5_IRQn 1 */
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief This function handles TIM1 Update interrupt.
|
||||
*/
|
||||
@@ -184,7 +217,21 @@ void USART1_IRQHandler(void)
|
||||
/* USER CODE END USART1_IRQn 0 */
|
||||
HAL_UART_IRQHandler(&huart1);
|
||||
/* USER CODE BEGIN USART1_IRQn 1 */
|
||||
|
||||
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE))
|
||||
{
|
||||
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
|
||||
//<2F><><EFBFBD><EFBFBD><EFBFBD>Ǽ<EFBFBD><C7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><D6B7><EFBFBD><EFBFBD><EFBFBD>
|
||||
uint16_t len = UART_DMA_RX_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart1.hdmarx);
|
||||
|
||||
for(uint16_t i = 0;i < len; i++)
|
||||
{
|
||||
ble_rx_ring.buffer[ble_rx_ring.head] = uart_dma_rx_buf[i];
|
||||
ble_rx_ring.head = (ble_rx_ring.head + 1) %RING_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
HAL_UART_AbortReceive(&huart1); //ֹͣ<CDA3><D6B9>ǰDMA
|
||||
HCBle_InitDMAReception();
|
||||
}
|
||||
/* USER CODE END USART1_IRQn 1 */
|
||||
}
|
||||
|
||||
|
||||
@@ -25,6 +25,10 @@
|
||||
/* USER CODE END 0 */
|
||||
|
||||
UART_HandleTypeDef huart1;
|
||||
DMA_NodeTypeDef Node_GPDMA1_Channel5;
|
||||
DMA_QListTypeDef List_GPDMA1_Channel5;
|
||||
DMA_HandleTypeDef handle_GPDMA1_Channel5;
|
||||
DMA_HandleTypeDef handle_GPDMA1_Channel4;
|
||||
|
||||
/* USART1 init function */
|
||||
|
||||
@@ -75,6 +79,7 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
{
|
||||
|
||||
GPIO_InitTypeDef GPIO_InitStruct = {0};
|
||||
DMA_NodeConfTypeDef NodeConfig= {0};
|
||||
RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0};
|
||||
if(uartHandle->Instance==USART1)
|
||||
{
|
||||
@@ -106,6 +111,89 @@ void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
|
||||
GPIO_InitStruct.Alternate = GPIO_AF4_USART1;
|
||||
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
|
||||
|
||||
/* USART1 DMA Init */
|
||||
/* GPDMA1_REQUEST_USART1_RX Init */
|
||||
NodeConfig.NodeType = DMA_GPDMA_LINEAR_NODE;
|
||||
NodeConfig.Init.Request = GPDMA1_REQUEST_USART1_RX;
|
||||
NodeConfig.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
|
||||
NodeConfig.Init.Direction = DMA_PERIPH_TO_MEMORY;
|
||||
NodeConfig.Init.SrcInc = DMA_SINC_FIXED;
|
||||
NodeConfig.Init.DestInc = DMA_DINC_FIXED;
|
||||
NodeConfig.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
|
||||
NodeConfig.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
|
||||
NodeConfig.Init.SrcBurstLength = 1;
|
||||
NodeConfig.Init.DestBurstLength = 1;
|
||||
NodeConfig.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT1|DMA_DEST_ALLOCATED_PORT1;
|
||||
NodeConfig.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
|
||||
NodeConfig.Init.Mode = DMA_NORMAL;
|
||||
NodeConfig.TriggerConfig.TriggerPolarity = DMA_TRIG_POLARITY_MASKED;
|
||||
NodeConfig.DataHandlingConfig.DataExchange = DMA_EXCHANGE_NONE;
|
||||
NodeConfig.DataHandlingConfig.DataAlignment = DMA_DATA_RIGHTALIGN_ZEROPADDED;
|
||||
if (HAL_DMAEx_List_BuildNode(&NodeConfig, &Node_GPDMA1_Channel5) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (HAL_DMAEx_List_InsertNode(&List_GPDMA1_Channel5, NULL, &Node_GPDMA1_Channel5) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (HAL_DMAEx_List_SetCircularMode(&List_GPDMA1_Channel5) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
handle_GPDMA1_Channel5.Instance = GPDMA1_Channel5;
|
||||
handle_GPDMA1_Channel5.InitLinkedList.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
|
||||
handle_GPDMA1_Channel5.InitLinkedList.LinkStepMode = DMA_LSM_FULL_EXECUTION;
|
||||
handle_GPDMA1_Channel5.InitLinkedList.LinkAllocatedPort = DMA_LINK_ALLOCATED_PORT1;
|
||||
handle_GPDMA1_Channel5.InitLinkedList.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
|
||||
handle_GPDMA1_Channel5.InitLinkedList.LinkedListMode = DMA_LINKEDLIST_CIRCULAR;
|
||||
if (HAL_DMAEx_List_Init(&handle_GPDMA1_Channel5) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
if (HAL_DMAEx_List_LinkQ(&handle_GPDMA1_Channel5, &List_GPDMA1_Channel5) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(uartHandle, hdmarx, handle_GPDMA1_Channel5);
|
||||
|
||||
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel5, DMA_CHANNEL_NPRIV) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
/* GPDMA1_REQUEST_USART1_TX Init */
|
||||
handle_GPDMA1_Channel4.Instance = GPDMA1_Channel4;
|
||||
handle_GPDMA1_Channel4.Init.Request = GPDMA1_REQUEST_USART1_TX;
|
||||
handle_GPDMA1_Channel4.Init.BlkHWRequest = DMA_BREQ_SINGLE_BURST;
|
||||
handle_GPDMA1_Channel4.Init.Direction = DMA_MEMORY_TO_PERIPH;
|
||||
handle_GPDMA1_Channel4.Init.SrcInc = DMA_SINC_INCREMENTED;
|
||||
handle_GPDMA1_Channel4.Init.DestInc = DMA_DINC_FIXED;
|
||||
handle_GPDMA1_Channel4.Init.SrcDataWidth = DMA_SRC_DATAWIDTH_BYTE;
|
||||
handle_GPDMA1_Channel4.Init.DestDataWidth = DMA_DEST_DATAWIDTH_BYTE;
|
||||
handle_GPDMA1_Channel4.Init.Priority = DMA_LOW_PRIORITY_LOW_WEIGHT;
|
||||
handle_GPDMA1_Channel4.Init.SrcBurstLength = 1;
|
||||
handle_GPDMA1_Channel4.Init.DestBurstLength = 1;
|
||||
handle_GPDMA1_Channel4.Init.TransferAllocatedPort = DMA_SRC_ALLOCATED_PORT0|DMA_DEST_ALLOCATED_PORT0;
|
||||
handle_GPDMA1_Channel4.Init.TransferEventMode = DMA_TCEM_BLOCK_TRANSFER;
|
||||
handle_GPDMA1_Channel4.Init.Mode = DMA_NORMAL;
|
||||
if (HAL_DMA_Init(&handle_GPDMA1_Channel4) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
__HAL_LINKDMA(uartHandle, hdmatx, handle_GPDMA1_Channel4);
|
||||
|
||||
if (HAL_DMA_ConfigChannelAttributes(&handle_GPDMA1_Channel4, DMA_CHANNEL_NPRIV) != HAL_OK)
|
||||
{
|
||||
Error_Handler();
|
||||
}
|
||||
|
||||
/* USART1 interrupt Init */
|
||||
HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
|
||||
HAL_NVIC_EnableIRQ(USART1_IRQn);
|
||||
@@ -132,6 +220,10 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
|
||||
*/
|
||||
HAL_GPIO_DeInit(GPIOB, GPIO_PIN_14|GPIO_PIN_15);
|
||||
|
||||
/* USART1 DMA DeInit */
|
||||
HAL_DMA_DeInit(uartHandle->hdmarx);
|
||||
HAL_DMA_DeInit(uartHandle->hdmatx);
|
||||
|
||||
/* USART1 interrupt Deinit */
|
||||
HAL_NVIC_DisableIRQ(USART1_IRQn);
|
||||
/* USER CODE BEGIN USART1_MspDeInit 1 */
|
||||
|
||||
Reference in New Issue
Block a user