 
ADC(1、2除通道不同其他均一致)使用如图配置,TIM1主要配置为
TIM_InitStruct.Prescaler = 0;
TIM_InitStruct.CounterMode = LL_TIM_COUNTERMODE_CENTER_DOWN;
TIM_InitStruct.Autoreload = 4249;
TIM_InitStruct.ClockDivision = LL_TIM_CLOCKDIVISION_DIV1;
TIM_InitStruct.RepetitionCounter = 0;
LL_TIM_Init(TIM1, &TIM_InitStruct);
LL_TIM_OC_EnablePreload(TIM1, LL_TIM_CHANNEL_CH4);
TIM_OC_InitStruct.CompareValue = 170;
LL_TIM_OC_Init(TIM1, LL_TIM_CHANNEL_CH4, &TIM_OC_InitStruct);
LL_TIM_OC_DisableFast(TIM1, LL_TIM_CHANNEL_CH4);
LL_TIM_SetTriggerOutput(TIM1, LL_TIM_TRGO_OC4REF);
LL_TIM_SetTriggerOutput2(TIM1, LL_TIM_TRGO2_OC4);
主函数调用
LL_TIM_EnableIT_CC4(TIM1);
LL_ADC_EnableIT_JEOS(ADC1);
LL_ADC_EnableIT_JEOS(ADC2);
LL_ADC_Enable(ADC1);
LL_ADC_Enable(ADC2);
// 使能时钟
LL_TIM_EnableCounter(TIM1);
LL_TIM_EnableCounter(TIM2);
可以触发TIM1_CC4中断,但是ADC中断不触发,且ADC采集值不更新。
在TIM1_CC4中断中调用SET_BIT(ADC1->CR, ADC_CR_JADSTART);ADC有采集可以触发中断且值更新。
尝试使用TIM3配置使用ITR0(TIM1_TRGO)触发,TIM3可以启动,说明TIM1_TRGO触发没问题,但是ADC注入采集却一直没有通过他触发。 |
从你给出的信息来看,使用TIM1-CH4的ocref信号作为TRGO 去出发ADC,一般来讲是可以的。
我这边也验证了。你选择这个配置,有个小要求,那就你得保证有PWM波形可以实现,当然并非一定要输出。换言之,CH4理论上应该有上下沿的变化,否则会出现无触发情形。
签到
[md]我在查找问题时有想过可能是
TIM1_TRGO没有触发导致的,所以尝试过添加TIM1_CC4中断,TIM1_CC4中断可以正常触发。在此基础上有尝试使用TIM1_TRGO来触发TIM3,配置TIM3从模式TriggerMode,触发源ITR0(TIM1_TRGO),TIM3可以正常触发。此过程中ADC都没有触发。[md]好吧,我找到原因了,我没有开启注入序列
嗯? 没开启注入序列,软件触发能成功?那触发的是啥呢?
软件触发实质上就是开启了注入队列,因为我使用触发不是单次的,所以我以为是软件触发的采集,实际上是软件触发只是使能了注入队列,还是硬件触发的采集。
之前使用F4系列开发它没有这个设置,只需要使能ADC就可以了,软件触发使用的是
ADC_CR2_JSWSTART他只管软件触发。但是在G431上的
ADC_CR_JADSTART位的作用变了,描述变成了如果配置位软件触发则立即采集,如果ADC触发器已设置为外部触发器,则ADC转换将在下一个触发事件(在选定的触发边缘)开始。所以我在G431上开启软件触发,实质上是使能了注入序列,让他可以正常通过外部触发器触发了。[md]嗯。
STM32不同系列的同名外设操作上的确可能不一样。