打印

MM32F5277定时器从模式2(外部时钟)无法触发DMA进行数据传输

[复制链接]
1576|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xiao白de兔子|  楼主 | 2023-2-13 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

2

帖子

0

粉丝