我想使用 DMA 和定时器来控制 GPIO 输出。目标生成 1MHz 的 CLK 信号并控制与 CLK 同步的 PB0。
我使用Nucleo-F411RE作为开发板。我已按照论坛的说明并配置了程序。
配置:
HCLK:100MHz
定时器3:
main.c中的程序:
uint32_t dummy_data[7] = {0} ;
dummy_data[0] = 0x00000001 ;
dummy_data[1] = 0x00010000 ;
dummy_data[2] = 0x00000000 ;
dummy_data[3] = 0x00000000 ;
dummy_data[4] = 0x00000001 ;
dummy_data[5] = 0x00010000 ;
dummy_data[6] = 0x00000000 ;
HAL_DMA_Start(&hdma_tim3_ch4_up, (uint32_t)dummy_data, (uint32_t)&(GPIOB->BSRR), 7) ;
HAL_TIM_Base_Start(&htim3) ;
HAL_TIM_OC_Start(&htim3, TIM_CHANNEL_4) ;
TIM3->DIER |= (1 << 8 ) ;
我期望在 PB0 中看到与 PC9(输出比较引脚)PWM 同步的脉冲。 但作为输出,我在 PC9 中仅获得 1MHz PWM,并且 PB0 没有变化。 我错过了什么吗?任何建议都会有帮助。
对于 STM32 F4,没有从 DMA1 到 AHB 外设的连接。因此,我配置了 TIM1 PWM CN1 (APB2) 来触发内存中的 DMA2 Stream 5 到外设模式,以在 GPIOB->BSRR 中写入字,而不是 TIM3 中的 DMA1。现在可以了(可以成功写入GPIOB->BSRR寄存器)。
仅适用于STM32 F411RE:
GPIOB(AHB1) is connected with DMA2 (DMA2 Stream 5)
DMA2 is connected with APB2 (So TIM1 PWM CN1)