硬汉嵌入式论坛

 找回密码
 立即注册
查看: 8918|回复: 9
收起左侧

[有问必答] F407怎么用定时器触发ADC??

[复制链接]

20

主题

110

回帖

170

积分

初级会员

积分
170
发表于 2019-7-23 21:39:54 | 显示全部楼层 |阅读模式
这功能网上没多少关于F407的,看了几个例程都没成功。
现在问题是复位后只触发了一次转换,仅使用DMA+ADC+软件触发是没问题的,问题就在定时器上

  1. void ADC_TIM2_Configuration(u16 arr)
  2. {
  3.         TIM_TimeBaseInitTypeDef TIM_initstructure;//定时器时基配置结构体变量
  4.         TIM_OCInitTypeDef TIM_OCinitstructure;
  5.        
  6.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//设置定时器TIM2时钟 使能外设时钟
  7.        
  8.         TIM_DeInit(TIM2);//先设置缺省
  9.        
  10.         TIM_initstructure.TIM_Period = arr;//计时周期
  11.         TIM_initstructure.TIM_Prescaler = 83;//预分频
  12.         TIM_initstructure.TIM_ClockDivision = TIM_CKD_DIV1; //时钟频率不分割
  13.         TIM_initstructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数模式
  14.         TIM_TimeBaseInit(TIM2,&TIM_initstructure);

  15.         TIM_OCinitstructure.TIM_OCMode = TIM_OCMode_PWM1;//使用PWM1模式
  16.         TIM_OCinitstructure.TIM_OutputState = TIM_OutputState_Enable;//使能输出比较模式
  17.         TIM_OCinitstructure.TIM_OCPolarity = TIM_OCPolarity_Low ;                                               
  18.         TIM_OCinitstructure.TIM_Pulse = arr / 2;//初始比较寄存器的值
  19.         TIM_OC2Init(TIM2,&TIM_OCinitstructure);
  20.         TIM_CtrlPWMOutputs(TIM2, ENABLE);
  21.        
  22.         TIM_ARRPreloadConfig(TIM2, ENABLE); //允许TIM2定时重载
  23.         TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC2Ref);
  24. }

  25. void ADC_DMA_Configuration()
  26. {
  27.         DMA_InitTypeDef DMA_InitStructure;
  28.        
  29.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE); //ADC1使用DMA2控制器
  30.        
  31.         DMA_InitStructure.DMA_Channel = DMA_Channel_0; //ADC1在通道0
  32.         DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_ADDR;
  33.         DMA_InitStructure.DMA_Memory0BaseAddr = (u32)adc_dat;
  34.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  35.         DMA_InitStructure.DMA_BufferSize = N;
  36.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  37.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  38.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  39.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  40.         DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;
  41.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  42.         DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; //关闭FIFO模式
  43.         DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull; //FIFO阈值
  44.         DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; //内存突发,单次传输
  45.     DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; //外设突发,单次传输
  46.         DMA_Init(DMA2_Stream0, &DMA_InitStructure); //F407的ADC1在通道0上有两个数据流,这里选择数据流0

  47.         /*dma中断配置*/
  48.         DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
  49.         DMA_ClearITPendingBit(DMA2_Stream0, DMA_IT_TCIF0);
  50.         DMA_ClearFlag(DMA2_Stream0, DMA_FLAG_TCIF0);
  51.         DMA_Cmd(DMA2_Stream0, ENABLE);//使能dma2通道0的数据流0
  52. }


  53. void ADC_Configuration(u16 sample_period)
  54. {
  55.         ADC_InitTypeDef ADC_initstructure;
  56.         ADC_CommonInitTypeDef ADC_CommonInitStructure;
  57.         GPIO_InitTypeDef GPIO_InitStructure;
  58.        
  59.         ADC_TIM2_Configuration(sample_period);
  60.         ADC_DMA_Configuration();
  61.         /* ***************************** */
  62.        
  63.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
  64.        
  65.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
  66.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入
  67.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  68.         GPIO_Init(GPIOC, &GPIO_InitStructure);
  69.        
  70.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//打开ADC1时钟
  71.        
  72.         ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//此处只用到一个ADC
  73.         ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles; //单ADC下随便设置
  74.         ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //不使用DMA
  75.         ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4; //ADC时钟分频
  76.         ADC_CommonInit(&ADC_CommonInitStructure);

  77.         ADC_initstructure.ADC_Resolution = ADC_Resolution_12b; //使用12为分辨率
  78.         ADC_initstructure.ADC_ScanConvMode = DISABLE;
  79.         ADC_initstructure.ADC_ContinuousConvMode = DISABLE;
  80.         ADC_initstructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC2; //使用外部触发,使用定时器2的捕获比较通道2来触发
  81.         ADC_initstructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;//使用上升沿触发
  82.         ADC_initstructure.ADC_DataAlign = ADC_DataAlign_Right;//数据右对齐
  83.         ADC_initstructure.ADC_NbrOfConversion = 1;//通道个数1
  84.         ADC_Init(ADC1,&ADC_initstructure);//初始化ADC1
  85.        
  86.         ADC_RegularChannelConfig(ADC1,ADC_Channel_11,1,ADC_SampleTime_84Cycles);
  87.         /*使用ADC触发DMA来传输*/
  88.         ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
  89.        
  90.         ADC_DMACmd(ADC1,ENABLE);//使能ADC1的DMA传输
  91.        
  92.         ADC_Cmd(ADC1,ENABLE);//使能ADC1外设
  93.        
  94.         TIM_Cmd(TIM2,ENABLE);//使能定时器2
  95. }
复制代码


回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2019-7-24 00:03:05 | 显示全部楼层
看我们一代示波器就可以,三个ADC都做了,全部采用的定时器触发,独立的DMA传输
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2019-7-24 15:54:31 | 显示全部楼层
eric2013 发表于 2019-7-24 00:03
看我们一代示波器就可以,三个ADC都做了,全部采用的定时器触发,独立的DMA传输

看了例程,照着配置还是这样,只触发了一次。不知道是不是定时器中断的问题,我也没开定时器中断
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-7-24 16:17:07 | 显示全部楼层
飛饵 发表于 2019-7-24 15:54
看了例程,照着配置还是这样,只触发了一次。不知道是不是定时器中断的问题,我也没开定时器中断

少壮不努力老大徒伤悲

DMA_Mode_Normal 肯定就转换一次啊,能连续转换才奇怪了

评分

参与人数 1金币 +10 收起 理由
飛饵 + 10 很给力!

查看全部评分

代码不规范,亲人两行泪!
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2019-7-24 17:17:17 | 显示全部楼层
missfox 发表于 2019-7-24 16:17
少壮不努力老大徒伤悲

DMA_Mode_Normal 肯定就转换一次啊,能连续转换才奇怪了

谢谢啊,解决了。这程序是从F103上移植过来的,103上设置成DMA_Mode_Normal 是可以连续转换的 。没想到407就不行。
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-7-26 11:06:22 | 显示全部楼层
飛饵 发表于 2019-7-24 17:17
谢谢啊,解决了。这程序是从F103上移植过来的,103上设置成DMA_Mode_Normal 是可以连续转换的 。没想到40 ...

那不会,你的F1就使错了
代码不规范,亲人两行泪!
回复

使用道具 举报

20

主题

110

回帖

170

积分

初级会员

积分
170
 楼主| 发表于 2019-7-26 11:10:12 来自手机 | 显示全部楼层
missfox 发表于 2019-7-26 11:06
那不会,你的F1就使错了

我不清楚了,看f103例程都这样,实际用也没问题的
回复

使用道具 举报

23

主题

1406

回帖

1475

积分

至尊会员

积分
1475
发表于 2019-7-27 10:11:54 | 显示全部楼层
飛饵 发表于 2019-7-26 11:10
我不清楚了,看f103例程都这样,实际用也没问题的

那看来一个在错着。
代码不规范,亲人两行泪!
回复

使用道具 举报

0

主题

2

回帖

2

积分

新手上路

积分
2
发表于 2021-3-23 10:19:47 | 显示全部楼层
飛饵 发表于 2019-7-24 17:17
谢谢啊,解决了。这程序是从F103上移植过来的,103上设置成DMA_Mode_Normal 是可以连续转换的 。没想到40 ...

您好,我也有这方面问题 可否看下例程呢
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107101
QQ
发表于 2021-3-23 11:03:30 | 显示全部楼层
wenyan 发表于 2021-3-23 10:19
您好,我也有这方面问题 可否看下例程呢

参考发布的V5板子一代示波器的bsp_adc.c文件即可,里面做了一个定时器同时触发ADC1,ADC2和ADC3的例子,DMA方式,你看下即可,比较好理解

http://www.armbbs.cn/forum.php?m ... &extra=page%3D1
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-17 16:28 , Processed in 0.315330 second(s), 29 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表