你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F429用定时器TRGO触发AD问题

[复制链接]
nanjinglsw-1310 提问时间:2014-9-2 11:51 /
想使用定时器触发AD转换,但是总是触发不了,AD只触发一次,应该是软件启动的时候触发一次,在主程序里面添加不停的触发ADC_SoftwareStartConv(ADC3);才能持续的转换,看了不少帖子和资料也未能解决,主要是没有和我很像的,偶尔遇到个很相近的也是没结局的,所以想请高手们帮忙看一下,问题到底出在什么地方,或者是可能出在什么地方。
这是AD和DMA配置
static void ADC3_CH13_DMA_Config(void)
{
  ADC_InitTypeDef       ADC_InitStructure;
  ADC_CommonInitTypeDef ADC_CommonInitStructure;
  DMA_InitTypeDef       DMA_InitStructure;
  GPIO_InitTypeDef      GPIO_InitStructure;
 
  /* Enable ADC3, DMA2 and GPIO clocks ****************************************/
  RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE);
 
  /* DMA2 Stream0 channel2 configuration **************************************/
  DMA_InitStructure.DMA_Channel = DMA_Channel_2;  
  DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC3_DR_ADDRESS;
  DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)uhADC3ConvertedValuex;
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  DMA_InitStructure.DMA_BufferSize = 5000;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  DMA_Init(DMA2_Stream0, &DMA_InitStructure);
  DMA_Cmd(DMA2_Stream0, ENABLE);
 
  /* Configure ADC3 Channel13 pin as analog input ******************************/
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
 
  /* ADC Common Init **********************************************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
 
  /* ADC3 Init ****************************************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;       
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC3, &ADC_InitStructure);
 
  /* ADC3 regular channel13 configuration *************************************/
  ADC_RegularChannelConfig(ADC3, ADC_Channel_13, 1, ADC_SampleTime_3Cycles);
 
 /* Enable DMA request after last transfer (Single-ADC mode) */
  ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE);
 
  /* Enable ADC3 DMA */
  ADC_DMACmd(ADC3, ENABLE);
 
  /* Enable ADC3 */
  ADC_Cmd(ADC3, ENABLE);
}
 
这是定时器配置
void TIM3_Config(void)
{
  TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;       
        RCC_TIMCLKPresConfig(RCC_TIMPrescActivated);
  PrescalerValue = (uint16_t) (SystemCoreClock / 20000000) - 1;
 
  /* TIM6 Periph clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
 
  /* Time base configuration */
//  TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);
  TIM_TimeBaseStructure.TIM_Period = 2000;
  TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
 
  TIM_ClearFlag(TIM3,TIM_FLAG_Update);   //必须先清除配置时候产生的更新标志
  TIM_Cmd(TIM3, ENABLE);
}
我的想法是用TIM3的TRGO 触发AD转换,使用DMA转移数据,改变TIM3更新时间来改变采样速率,因为开发板上引脚用得太多了,剩余的引脚很珍贵,所以不想用PWM输出触发,想用TRGO触发,按说应该是没有问题的,但是实际没有持续的转换进行。DMA应该没问题,因为我改成连续转换的模式是有数据的。
求助个位,看看有没有什么看法,谢谢了!!
收藏 评论4 发布时间:2014-9-2 11:51

举报

4个回答
nanjinglsw-1310 回答时间:2014-9-2 11:52:32

回复:STM32F429用定时器TRGO触发AD问题

拜求高手指点迷津
回答时间:2014-9-3 09:16:51

RE:STM32F429用定时器TRGO触发AD问题

DMA_InitStructure.DMA_BufferSize = 5000;
你这里写的要把buffer写满才会触发。你算算是不是?你把这个值改成1试试。
nanjinglsw-1310 回答时间:2014-9-5 12:45:41

回复:STM32F429用定时器TRGO触发AD问题

回复第 3 楼 于2014-09-03 09:16:51发表:
DMA_InitStructure.DMA_BufferSize = 5000;
你这里写的要把buffer写满才会触发。你算算是不是?你把这个值改成
不行,改成1也没有用,依然没有连续的转换输出,如果能进行转换的话,满5000个数据也是非常快的,应该不是这个问题,我在定时器中断里面 添加软件启动的语句就可以试验出来了。结果也确实如此,5000个数据是很快的。
 
xxq100822 回答时间:2017-4-5 17:39:43
你好,请问你这问题解决了吗?

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版