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

[复制链接]
1618|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工具(用于调试串口输出)。
代码实现
  1. #include "stm32h7xx_hal.h"
  2. #include "main.h"

  3. UART_HandleTypeDef huart3; // 使用USART3
  4. DMA_HandleTypeDef hdma_usart3_tx;
  5. volatile uint8_t dmaBuffer[] = "Button Pressed!\r\n";

  6. void SystemClock_Config(void);
  7. static void MX_GPIO_Init(void);
  8. static void MX_USART3_UART_Init(void);
  9. static void MX_DMA_Init(void);

  10. int main(void) {
  11.     HAL_Init();
  12.     SystemClock_Config();
  13.     MX_GPIO_Init();
  14.     MX_DMA_Init();
  15.     MX_USART3_UART_Init();

  16.     while (1) {
  17.         HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_0); // 闪烁LED
  18.         HAL_Delay(500);
  19.     }
  20. }

  21. void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
  22.     if (GPIO_Pin == GPIO_PIN_13) { // 检测按键中断
  23.         HAL_UART_Transmit_DMA(&huart3, dmaBuffer, sizeof(dmaBuffer) - 1);
  24.     }
  25. }

  26. static void MX_GPIO_Init(void) {
  27.     GPIO_InitTypeDef GPIO_InitStruct = {0};

  28.     __HAL_RCC_GPIOC_CLK_ENABLE();
  29.     __HAL_RCC_GPIOB_CLK_ENABLE();

  30.     // 配置按键输入
  31.     GPIO_InitStruct.Pin = GPIO_PIN_13;
  32.     GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
  33.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  34.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  35.     // 配置LED输出
  36.     GPIO_InitStruct.Pin = GPIO_PIN_0;
  37.     GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  38.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  39.     GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
  40.     HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);

  41.     HAL_NVIC_SetPriority(EXTI15_10_IRQn, 0, 0);
  42.     HAL_NVIC_EnableIRQ(EXTI15_10_IRQn);
  43. }

  44. static void MX_USART3_UART_Init(void) {
  45.     huart3.Instance = USART3;
  46.     huart3.Init.BaudRate = 115200;
  47.     huart3.Init.WordLength = UART_WORDLENGTH_8B;
  48.     huart3.Init.StopBits = UART_STOPBITS_1;
  49.     huart3.Init.Parity = UART_PARITY_NONE;
  50.     huart3.Init.Mode = UART_MODE_TX_RX;
  51.     huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  52.     huart3.Init.OverSampling = UART_OVERSAMPLING_16;
  53.     huart3.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  54.     huart3.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  55.     if (HAL_UART_Init(&huart3) != HAL_OK) {
  56.         Error_Handler();
  57.     }
  58. }

  59. static void MX_DMA_Init(void) {
  60.     __HAL_RCC_DMA1_CLK_ENABLE();

  61.     hdma_usart3_tx.Instance = DMA1_Stream3;
  62.     hdma_usart3_tx.Init.Request = DMA_REQUEST_USART3_TX;
  63.     hdma_usart3_tx.Init.Direction = DMA_MEMORY_TO_PERIPH;
  64.     hdma_usart3_tx.Init.PeriphInc = DMA_PINC_DISABLE;
  65.     hdma_usart3_tx.Init.MemInc = DMA_MINC_ENABLE;
  66.     hdma_usart3_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;
  67.     hdma_usart3_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;
  68.     hdma_usart3_tx.Init.Mode = DMA_NORMAL;
  69.     hdma_usart3_tx.Init.Priority = DMA_PRIORITY_LOW;
  70.     if (HAL_DMA_Init(&hdma_usart3_tx) != HAL_OK) {
  71.         Error_Handler();
  72.     }

  73.     __HAL_LINKDMA(&huart3, hdmatx, hdma_usart3_tx);
  74. }

  75. void Error_Handler(void) {
  76.     while (1) {
  77.         // 错误处理
  78.     }
  79. }
配置说明
  • 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,感觉效率真的提高了不少!
万图 发表于 2024-11-26 07:37 来自手机 | 显示全部楼层
STM32系列的功能真强,尤其是这种高性能的H743。
Wordsworth 发表于 2024-11-26 07:38 来自手机 | 显示全部楼层
代码注释写得很详细,新手也能轻松理解!
Bblythe 发表于 2024-11-26 07:38 来自手机 | 显示全部楼层
有没有推荐的UART调试工具?我还在用老版的。
Pulitzer 发表于 2024-11-26 07:38 来自手机 | 显示全部楼层
DMA这块有点复杂,不过文章讲解得很到位!
Uriah 发表于 2024-11-26 07:38 来自手机 | 显示全部楼层
H743用来跑实时应用真的很强大,点赞!
Clyde011 发表于 2024-11-26 07:39 来自手机 | 显示全部楼层
有没有扩展的例子,比如加入ADC采集?
l63t89 发表于 2024-12-30 23:47 | 显示全部楼层
STM32H743 是一款高性能 MCU,适用于工业控制、图像处理以及实时应用。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

167

主题

6128

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部