STM32G431外部GPIO中断触发DMA的形式读取GPIO组数据
时间: 2025-03-26 12:14:15 浏览: 57
### 配置概述
为了使STM32G431能够通过外部GPIO中断触发DMA来读取GPIO组的数据,需完成几个关键部分的设置:GPIO配置为输入模式[^1];初始化TIM3定时器用于生成周期性的触发信号;配置DMA通道以便在接收到TIM3触发信号时自动执行数据传输操作。
### GPIO配置
对于目标设备上的特定GPIO引脚,应将其设定为输入模式以准备接收来自外界的信息。这一步骤确保了微控制器可以精确捕捉到来自外设的变化情况。具体来说,在`stm32g4xx_hal_msp.c`文件中的相应函数里添加如下代码:
```c
__HAL_RCC_GPIOA_CLK_ENABLE();
GPIO_InitTypeDef GPIO_InitStruct = {0};
/* Configure the GPIO pin as input */
GPIO_InitStruct.Pin = GPIO_PIN_0 | GPIO_PIN_1;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
### TIM3定时器初始化
接下来要做的就是调整TIM3定时器的相关参数,使之能发出规律的时间脉冲作为后续动作的基础。这部分工作主要是在`main.c`内调用`MX_TIM3_Init()`函数之前定义好计数频率和其他必要属性,并开启更新事件中断允许位。下面给出了一段简化版的例子说明如何做这些事情:
```c
htim3.Instance = TIM3;
htim3.Init.Prescaler = 8399;
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
htim3.Init.Period = 999;
if (HAL_TIM_Base_Init(&htim3) != HAL_OK){
Error_Handler();
}
// Enable update event interrupt.
__HAL_TIM_ENABLE_IT(&htim3, TIM_IT_UPDATE);
```
### DMA配置
当上述准备工作完成后,则转向安排DMA服务。这里的目标是从选定的一系列GPIO端口中批量获取二进制数值序列。为此目的而编写的C语言片段展示了怎样建立一个循环缓冲区以及关联它至DMA流上:
```c
hdma_memtomem_dma1_channel1.Instance = DMA1_Channel1;
hdma_memtomem_dma1_channel1.Init.Request = DMA_REQUEST_MEMtMEM;
hdma_memtomem_dma1_channel1.Init.Direction = DMA_MEMORY_TO_MEMORY;
hdma_memtomem_dma1_channel1.InitPeriphInc = DMA_PINC_DISABLE;
hdma_memtomem_dma1_channel1.InitMemInc = DMA_MINC_ENABLE;
hdma_memtomem_dma1_channel1.InitPeriphDataAlignment = DMA_PDATAALIGN_BYTE;
hdma_memtomem_dma1_channel1.InitMemDataAlignment = DMA_MDATAALIGN_BYTE;
hdma_memtomem_dma1_channel1.InitMode = DMA_NORMAL;
hdma_memtomem_dma1_channel1.InitPriority = DMA_PRIORITY_HIGH;
if(HAL_DMA_Init(&hdma_memtomem_dma1_channel1)!= HAL_OK){
/* Initialization Error */
Error_Handler();
}
__HAL_LINKDMA(&hadc1,DMA_Handle, hdma_memtomem_dma1_channel1);
uint8_t buffer[4];
HAL_DMA_Start(&hdma_memtomem_dma1_channel1,(uint32_t)&buffer,(uint32_t)&(GPIOA->IDR),sizeof(buffer));
```
请注意以上例子假设使用的是内存到内存的方式模拟实际硬件间的转移过程,而在真实环境中应当依据具体情况修改源地址和目的地地址指向真实的寄存器位置。
### 外部中断配置
为了让系统能够在检测到按键按下或其他形式的边沿变化时启动DMA传输活动,还需要额外激活EXTI线路并与之对应的NVIC中断向量表条目相联结。此环节涉及到了对外围模块间协作机制的设计考量。以下是关于如何创建这种联系的一个实例展示:
```c
void MX_GPIO_Init(void)
{
__HAL_RCC_GPIOA_CLK_ENABLE();
// ...省略其他无关紧要的部分...
EXTI_HandleTypeDef hexti_key;
hexti_key.Line=EXTI_LINE_0|EXTI_LINE_1;
hexti_key.Mode = EXTI_MODE_INTERRUPT;
hexti_key.Trigger = EXTI_TRIGGER_RISING_FALLING;
hexti_key.GPIOSel = GPIOA;
if(MX_EXTI_Init(&hexti_key)!= HAL_OK){
Error_Handler();
}
HAL_NVIC_SetPriority(EXTI0_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI0_IRQn);
}
```
最后,在相应的中断处理程序中加入必要的逻辑去触发表单内的DMA请求即可达成预期的功能需求。
阅读全文
相关推荐


















