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)
|