打印
[STM32H7]

高效驱动!基于STM32H743的GPIO中断与DMA传输示例

[复制链接]
342|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
周半梅|  楼主 | 2024-11-26 07:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
DM, DMA, GPIO, IO, ST
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功能,提升嵌入式系统的实时性与效率。掌握这些技巧,能够为复杂应用奠定扎实基础。

使用特权

评论回复
沙发
公羊子丹| | 2024-11-26 07:36 | 只看该作者
哇,这个例子好清晰,改天试试用在我的项目里!

使用特权

评论回复
板凳
帛灿灿| | 2024-11-26 07:37 | 只看该作者
最近刚入手H743,这篇文章太及时了,感谢分享!

使用特权

评论回复
地板
童雨竹| | 2024-11-26 07:37 | 只看该作者
按键中断+DMA,感觉效率真的提高了不少!

使用特权

评论回复
5
万图| | 2024-11-26 07:37 | 只看该作者
STM32系列的功能真强,尤其是这种高性能的H743。

使用特权

评论回复
6
Wordsworth| | 2024-11-26 07:38 | 只看该作者
代码注释写得很详细,新手也能轻松理解!

使用特权

评论回复
7
Bblythe| | 2024-11-26 07:38 | 只看该作者
有没有推荐的UART调试工具?我还在用老版的。

使用特权

评论回复
8
Pulitzer| | 2024-11-26 07:38 | 只看该作者
DMA这块有点复杂,不过文章讲解得很到位!

使用特权

评论回复
9
Uriah| | 2024-11-26 07:38 | 只看该作者
H743用来跑实时应用真的很强大,点赞!

使用特权

评论回复
10
Clyde011| | 2024-11-26 07:39 | 只看该作者
有没有扩展的例子,比如加入ADC采集?

使用特权

评论回复
11
l63t89| | 2024-12-30 23:47 | 只看该作者
STM32H743 是一款高性能 MCU,适用于工业控制、图像处理以及实时应用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

41

主题

3737

帖子

0

粉丝