STM32H743是STMicroelectronics高性能MCU系列中的一员,凭借其强大的性能和灵活的外设配置,在工业控制、图像处理以及实时应用中表现出色。本文将通过一个具体的示例,讲解如何结合GPIO中断和DMA进行数据采集与处理,为开发者提供高效解决方案。
示例功能说明本示例实现以下功能:
- 使用GPIO外部中断检测按键输入。
- 在中断服务函数中启动DMA,将数据从内存传输到UART进行串口输出。
- 配置高优先级任务,确保数据传输过程高效且不中断主要任务流。
硬件需求- STM32H743开发板(如Nucleo-H743ZI)。
- 一个外接按键和一个LED。
- USB转UART工具(用于调试串口输出)。
代码实现#include "stm32h7xx_hal.h"
#include "main.h"
UART_HandleTypeDef huart3; // 使用USART3
DMA_HandleTypeDef hdma_usart3_tx;
volatile uint8_t dmaBuffer[] = "Button Pressed!\r\n";
void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART3_UART_Init(void);
static void MX_DMA_Init(void);
int main(void) {
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();
MX_DMA_Init();
MX_USART3_UART_Init();
while (1) {
HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 闪烁LED
HAL_Delay(500);
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
if (GPIO_Pin == GPIO_PIN_13) { // 检测按键中断
HAL_UART_Transmit_DMA(&huart3, dmaBuffer, sizeof(dmaBuffer) - 1);
}
}
static void MX_GPIO_Init(void) {
GPIO_InitTypeDef GPIO_InitStruct = {0};
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOB_CLK_ENABLE();
// 配置按键输入
GPIO_InitStruct.Pin = GPIO_PIN_13;
GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
// 配置LED输出
GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
}
static void MX_USART3_UART_Init(void) {
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
if (HAL_UART_Init(&huart3) != HAL_OK) {
Error_Handler();
}
}
static void MX_DMA_Init(void) {
__HAL_RCC_DMA1_CLK_ENABLE();
hdma_usart3_tx.Instance = DMA1_Stream3;
hdma_usart3_tx.Init.Request = DMA_REQUEST_USART3_TX;
hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_usart3_tx.Init.Mode = DMA_NORMAL;
hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK) {
Error_Handler();
}
__HAL_LINKDMA(&huart3, hdmatx, hdma_usart3_tx);
}
void Error_Handler(void) {
while (1) {
// 错误处理
}
}
配置说明- GPIO按键中断:通过设置GPIO_MODE_IT_FALLING模式,当按键按下时触发中断。
- DMA传输:减少CPU资源占用,提高UART数据发送效率。
- USART3串口调试:常用波特率设置为115200。
总结通过本示例,可以直观了解如何结合STM32H743的GPIO中断与DMA功能,提升嵌入式系统的实时性与效率。掌握这些技巧,能够为复杂应用奠定扎实基础。
|