-
MM32F5277定时器从模式2(外部时钟)无法触发DMA进行数据传输 sos
PE7外接频率为6.25MHz的时钟线,需要在上升沿或高电平进行一次8位引脚电平状态到缓存数组的DMA传输,现在无法实现,DMA不受PE7时钟的控制,不初始化时钟部分也可以用软件开启DMA。以下为初始化代码: DMA_Channel_Init_Type dma_channel_init; dma_channel_init.XferMode = DMA_XferMode_MemoryToPeriphBurst; //内存到外设 dma_channel_init.ReloadMode = DMA_ReloadMode_AutoReload; /* DMA_AutoReloadMode_OneTime */ //循环模式 dma_channel_init.PeriphAddrIncMode = DMA_AddrIncMode_IncAfterXfer; //外设地址累加 dma_channel_init.MemAddrIncMode = DMA_AddrIncMode_StayAfterXfer; //内存地址不变 dma_channel_init.XferWidth = DMA_XferWidth_8b; //8位传输 dma_channel_init.Priority = DMA_Priority_Low; //中断优先级低 dma_channel_init.XferCount = 128; //累计传输128个数据 dma_channel_init.MemAddr = (uint32_t)(0x40040008 + 5*0x400 + 0); //引脚地址 dma_channel_init.PeriphAddr = (uint32_t)&Data[0][0]; //缓存地址 DMA_InitChannel(DMA1 , 3u, &dma_channel_init); DMA_EnableChannel(DMA1, 3u, true); GPIO_Init_Type gpio_init; RCC_EnableAPB2Periphs(RCC_APB2_PERIPH_TIM1, true); gpio_init.Pins = GPIO_PIN_7; gpio_init.PinMode = GPIO_PinMode_In_Floating; gpio_init.Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOE, &gpio_init); GPIO_PinAFConf(GPIOE, gpio_init.Pins, GPIO_AF_1); //管脚复用 定时器ETR TIM_Init_Type TIM_StructInit; TIM_StructInit.ClockFreqHz = CLOCK_SYS_FREQ; TIM_StructInit.StepFreqHz = CLOCK_SYS_FREQ; TIM_StructInit.Period = 1; // TIM_StructInit.EnablePreloadPeriod = false; //关闭周期预加载值 TIM_StructInit.PeriodMode = TIM_PeriodMode_Continuous; //循环工作 TIM_StructInit.CountMode = TIM_CountMode_Increasing; //周期 TIM_Init((TIM_Type *)TIM1, &TIM_StructInit); CLEAR_BIT(TIM1->SMCR, (0x01U << 14) ); //禁止外部时钟模式2 MODIFY_REG(TIM1->SMCR, (0x01U << 15) , (0x00U << 12)); //外部时钟高电平有效 MODIFY_REG(TIM1->SMCR, (0x03U << 12), 0); //关闭预分频 外部触发信号 ETRP 的频率必须低于 TIMx 主时钟 PCLK 频率的 1/4。 MODIFY_REG(TIM1->SMCR, (0x0FU << 8), 0 << 8); //采样频率 无滤波器 MODIFY_REG(TIM1->SMCR, (0x07U << 4), (0x07U << 4)); //触发源选择外部触发输入(ETR) MODIFY_REG(TIM1->SMCR, (0x07U << 0), (0x04U << 0)); //复位模式 - 选中的触发输入(TRGI) 的上升沿重新初始化计数器,并且产生一个更新事件。 MODIFY_REG(TIM1->SMCR, (0x01U << 7) , (0x01U << 7)); //主/从 模 式 SET_BIT(TIM1->SMCR, (0x01U << 14)); //使能外部时钟模式2 MODIFY_REG(TIM1->DIER, (0x01U << 8), (0x01U << 8)); //允许更新DMA请求 /* Start the counter. */ TIM_Start((TIM_Type *)TIM1); TIM_EnableDMA((TIM_Type *)TIM1, TIM_DIER_TDE_MASK, true); //(0x01U << TIM_DIER_TD_Pos)
1558浏览量 0回复量 关注量