我需要在另一个外部信号的每个下降沿通过 DMA 从某些 GPIO 引脚读取数据。我将时钟信号设置为 TIMER 外部时钟(下降沿),并将 PSC 值和 ARR 值设置为 0。我将定时器更新事件设置为 DMA 请求。
问题是,根据公式
f = Fclock/((PSC+1)*(ARR+1))
,DMA根据来自引脚的时钟信号在每个下降沿触发。但没有触发发生。
当我将 ARR 值设置为 1 时,每 2 个下降沿触发 DMA 1 次。
这是我当前的配置:
DMA2_Stream5->NDTR = 20;
DMA2_Stream5->M0AR = (uint32_t) &buffer[0];
DMA2_Stream5->PAR = (uint32_t) &GPIOB->IDR;
DMA2_Stream5->CR = (6u << DMA_SxCR_CHSEL_Pos) | // select channel 6, see DMA request mapping in the reference manual
DMA_SxCR_MSIZE_1 | // 0b10:memory data size 32 bit
DMA_SxCR_PSIZE_1 | // 0b10:peripheral data size 32 bit
DMA_SxCR_MINC | // memory increment
DMA_SxCR_EN | // enable channel
DMA_SxCR_TCIE_Msk | // Transfer complete interrupt enable
0;
TIM1->DIER = TIM_DIER_UDE; //Update DMA request enable
TIM1->SMCR |= 1 << 15; //ETR is inverted,
TIM1->CR1 = TIM_CR1_CEN; //TIM1 enable
如何配置 DMA 在外部信号的每个下降沿触发?
哪个STM32?
下次,读出并发布所有相关外设寄存器的内容(这里是TIM和DMA/DMAMUX)。
ARR值为0
如果设置 ARR=0,定时器的计数器不会运行(即不会根据时钟更改其值,也不会生成更新事件),请参阅 RM 中 TIMx_ARR 寄存器的说明。
不要使用 ETR 和更新,而是将输入信号连接到定时器的通道之一,将该通道设置为输入捕获,并从该通道触发 DMA。
JW