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功能,提升嵌入式系统的实时性与效率。掌握这些技巧,能够为复杂应用奠定扎实基础。
|