打印
[STM32F4]

有人用过F407双ADC规则同步间断模式吗(求助版主)?

[复制链接]
3500|37
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yzzly|  楼主 | 2014-5-9 10:25 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 yzzly 于 2014-5-9 16:26 编辑

老系统是F103VET6,双ADC规则同步模式,使用TIM4的CC4触发,每周波采样32个数据(也就是TIM4每20毫秒触发ADC 32次,如果开中断的话,可以看到TIM4每625微妙中断一次),一次触发转换5个通道,转换结果由DMA读取,每20毫秒DMA需要读取32*5=160个数据,DMA计数到后中断,中断周期为正确的20毫秒;系统工作一直很好;
最近开始产品升级设计,选用F407VET6,还是双ADC模式,TIM4的CC4触发,每周波采样32个数据(也就是TIM4每20毫秒触发ADC 32次,如果开中断的话,可以看到TIM4每625微妙中断一次),DMA的中断周期完全不正确!当为一个通道时DMA中断周期是20毫秒,而为5个通道时DMA的中断周期为100毫秒!好像一次触发只转换了1个通道的数据,没有连续转换5个通道!能否给予提示?谢谢!
系统时钟168M,APB1CLK、APB2CLK分别是42M和84M,ADCCLK是14M。
沙发
yzzly|  楼主 | 2014-5-9 14:16 | 只看该作者
要想达到设计目的,我的初始化有什么问题呢???
ADC1->SQR3 |= UL1AinCH << 0;        //ÉèÖùæÔòÐòÁÐÖÐÿ¸öת»»µÄͨµÀºÅ,ת»»ºÅÓëͨµÀºÅ¿ÉÒÔ²»¶ÔÓ¦,ÀýÈç:µÚ
ADC1->SQR3 |= UczAinCH << 5;        //Ò»¸öת»»Í¨µÀ16»òÕßÆäËûͨµÀ¶ø²»Ò»¶¨¾ÍÊÇͨµÀ1,ÕâÑù×öµÄºÃ´¦ÊÇ:Éè¼Æ
ADC1->SQR3 |= UaAinCH << 10;        //ͼֽʱģÄâÊäÈëÒý½Å¾ÍûÓÐ˳ÐòÒªÇó,¸øÉè¼Æ´øÀ´¼«´óµÄ·½±ã.
ADC1->SQR3 |= UbAinCH << 15;
ADC1->SQR3 |= UcAinCH << 20;
ADC1->SQR3 |= U0AinCH << 25;
ADC1->SQR2 |= 7 << 0;                //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC1->SQR2 |= 8 << 5;
ADC1->SQR2 |= 9 << 10;
ADC1->SQR2 |= 10 << 15;
ADC1->SQR2 |= 11 << 20;
ADC1->SQR2 |= 12 << 25;
ADC1->SQR1 |= 13 << 0;                //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC1->SQR1 |= 14 << 5;
ADC1->SQR1 |= 15 << 10;
ADC1->SQR1 |= 16 << 15;
ADC1->SQR1 |= (AdcChNum-1) << 20;//ÉèÖùæÔò×éÄ£ÄâÊäÈëͨµÀÊý
        
ADC1->CR1 = 0;
ADC1->CR1 |= AdcChNum << 13;        //DISCNUM
ADC1->CR1 |= 1 << 11;                //DISCEN
ADC1->CR2 = 0;
ADC1->CR2 |= 1 << 28;                //EXTEN
ADC1->CR2 |= 9 << 24;                //EXTSEL
ADC1->CR2 |= 1 << 10;                //EOCS
ADC1->CR2 |= 1 << 9;                //DDS
ADC1->CR2 |= 1 << 8;                //DMA

ADC2->SQR3 |= UL2AinCH << 0;        //ÉèÖùæÔòÐòÁÐÖÐÿ¸öת»»µÄͨµÀºÅ,ת»»ºÅÓëͨµÀºÅ¿ÉÒÔ²»¶ÔÓ¦,ÀýÈç:µÚ
ADC2->SQR3 |= UdcAinCH << 5;        //Ò»¸öת»»Í¨µÀ16»òÕßÆäËûͨµÀ¶ø²»Ò»¶¨¾ÍÊÇͨµÀ1,ÕâÑù×öµÄºÃ´¦ÊÇ:Éè¼Æ
ADC2->SQR3 |= IaAinCH << 10;        //ͼֽʱģÄâÊäÈëÒý½Å¾ÍûÓÐ˳ÐòÒªÇó,¸øÉè¼Æ´øÀ´¼«´óµÄ·½±ã.
ADC2->SQR3 |= IbAinCH << 15;
ADC2->SQR3 |= IcAinCH << 20;
ADC2->SQR3 |= I0AinCH << 25;
ADC2->SQR2 |= 7 << 0;                //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC2->SQR2 |= 8 << 5;
ADC2->SQR2 |= 9 << 10;
ADC2->SQR2 |= 10 << 15;
ADC2->SQR2 |= 11 << 20;
ADC2->SQR2 |= 12 << 25;
ADC2->SQR1 |= 13 << 0;        //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC2->SQR1 |= 14 << 5;
ADC2->SQR1 |= 15 << 10;
ADC2->SQR1 |= 16 << 15;
ADC2->SQR1 |= (AdcChNum-1) << 20;//ÉèÖùæÔò×éÄ£ÄâÊäÈëͨµÀÊý
        
ADC2->CR1 = 0;
ADC2->CR1 |= AdcChNum << 13;        //DISCNUM
ADC2->CR1 |= 1 << 11;                //DISCEN
ADC2->CR2 = 0;
//ADC2->CR2 |= 1 << 28;                //EXTEN
ADC2->CR2 |= 9 << 24;                //EXTSEL
ADC2->CR2 |= 1 << 10;                //EOCS
ADC2->CR2 |= 1 << 9;                //DDS
ADC2->CR2 |= 1 << 8;                //DMA

ADC->CCR = 0;
ADC->CCR |= 2 << 16;                //ADCPRE
ADC->CCR |= 2 << 14;                //DMA
ADC->CCR |= 1 << 13;                //DDS
ADC->CCR |= 1 << 8;                //DELAY
ADC->CCR |= 6 << 0;                //MULTI40
        
ADC1->CR2 |= 1 << 0;                //ADON
ADC2->CR2 |= 1 << 0;                //ADON

使用特权

评论回复
板凳
yzzly|  楼主 | 2014-5-9 14:59 | 只看该作者
在F103系统把DISCEN位设置为0后,DMA中断周期由20毫秒变为100毫秒,就是说在这种状态下TIM4的每次触发只转换1次,而当DISCEN位=1的时候,TIM4的每次触发会转换5次;
在F407系统,无论DISCEN位是0还是1,DMA的中断周期都是100毫秒,就是说DISCEN位好像根本没有起作用!!!

使用特权

评论回复
地板
yzzly|  楼主 | 2014-5-9 15:26 | 只看该作者
论坛上看上去热热闹闹的,是不是很少有人如此复杂的应用???

使用特权

评论回复
5
yzzly|  楼主 | 2014-5-9 16:30 | 只看该作者
顶起!

使用特权

评论回复
6
mmuuss586| | 2014-5-9 19:27 | 只看该作者
                /* ADC Common configuration *************************************************/
                ADC_CommonInitStructure.ADC_Mode = ADC_TripleMode_RegSimult;
                ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
                ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;
                ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
                ADC_CommonInit(&ADC_CommonInitStructure);

                /* ADC1 regular channel 12 configuration ************************************/
                ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
                ADC_InitStructure.ADC_ScanConvMode = ENABLE;
                ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
                ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
                ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
                ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
                ADC_InitStructure.ADC_NbrOfConversion = 3;
                ADC_Init(ADC1, &ADC_InitStructure);

使用特权

评论回复
7
mmuuss586| | 2014-5-9 19:27 | 只看该作者
试试这段函数,你写寄存器看的我头晕

使用特权

评论回复
8
mmuuss586| | 2014-5-9 19:42 | 只看该作者
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
这句你咋写的?

使用特权

评论回复
9
yzzly|  楼主 | 2014-5-9 20:53 | 只看该作者
用库函数设置过,不行才仔细研究寄存器的,ADC_InitStructure.ADC_ScanConvMode = ENABLE;这一句必须为DISABLE

使用特权

评论回复
10
wallace_tsou| | 2014-5-12 11:11 | 只看该作者
本帖最后由 wallace_tsou 于 2014-5-12 11:12 编辑

    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4  | GPIO_Pin_5;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
    ADC_InitStructure.ADC_ExternalTrigConv     = ADC_ExternalTrigConv_T8_TRGO;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 2;
    ADC_Init(ADC2, &ADC_InitStructure);

    ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_144Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 2, ADC_SampleTime_144Cycles);

    ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
    ADC_DMACmd(ADC2, ENABLE);
    ADC_Cmd(ADC2, ENABLE);
使用STM32F205,和STM32F407是相似的。
雙通道取樣程式,已可運作。

使用特权

评论回复
11
yzzly|  楼主 | 2014-5-12 11:22 | 只看该作者
谢谢wallace_tsou,与你的工作模式是不同的!让ADC工作简单,需要按逻辑要求正确工作!

使用特权

评论回复
12
wallace_tsou| | 2014-5-12 11:45 | 只看该作者
是確定一次觸發二次轉換的程式碼。
只是
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
就是這樣設。

使用特权

评论回复
13
yzzly|  楼主 | 2014-5-12 11:59 | 只看该作者
没用,ENABLE、DISABLE都试过!在老产品的103系统上是管用的!

使用特权

评论回复
14
wallace_tsou| | 2014-5-12 13:07 | 只看该作者
本帖最后由 wallace_tsou 于 2014-5-12 13:13 编辑

    GPIO_StructInit(&GPIO_InitStructure);
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4  | GPIO_Pin_5;
    GPIO_Init(GPIOC, &GPIO_InitStructure);

    ADC_StructInit(&ADC_InitStructure);
    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = ENABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
//    ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
    ADC_InitStructure.ADC_ExternalTrigConv     = ADC_ExternalTrigConv_T8_TRGO;
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
    ADC_InitStructure.ADC_NbrOfConversion = 2;
    ADC_Init(ADC2, &ADC_InitStructure);

    ADC_DiscModeChannelCountConfig(ADC2,2);
//    ADC_DiscModeChannelCountConfig(ADC2,1);
    ADC_DiscModeCmd(ADC2, ENABLE);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_144Cycles);
    ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 2, ADC_SampleTime_144Cycles);
//    ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 1, ADC_SampleTime_15Cycles);
//    ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 2, ADC_SampleTime_15Cycles);

    ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
    ADC_DMACmd(ADC2, ENABLE);
    ADC_Cmd(ADC2, ENABLE);
用這樣的程式
使用在
ADC_DiscModeChannelCountConfig(ADC2,1);
設定下,一次觸發ADC出一個。
使用在
ADC_DiscModeChannelCountConfig(ADC2,2);
設定下,一次觸發ADC出二個。
但前面的程式沒有設定,就自己設定為ADC_DiscModeCmd(ADC2, ENABLE);的行為。



使用特权

评论回复
15
yzzly|  楼主 | 2014-5-12 14:02 | 只看该作者
扫描模式与间断模式不是一回事!

使用特权

评论回复
16
yzzly|  楼主 | 2014-5-12 14:57 | 只看该作者
规则组的间断模式
Discontinuous mode
Regular group
This mode is enabled by setting the DISCEN bit in the ADC_CR1 register. It can be used to
convert a short sequence of n conversions (n ≤ 8) that is part of the sequence of
conversions selected in the ADC_SQRx registers. The value of n is specified by writing to
the DISCNUM[2:0] bits in the ADC_CR1 register.
When an external trigger occurs, it starts the next n conversions selected in the ADC_SQRx
registers until all the conversions in the sequence are done. The total sequence length is
defined by the L[3:0] bits in the ADC_SQR1 register.

使用特权

评论回复
17
wallace_tsou| | 2014-5-12 15:01 | 只看该作者
文件上沒有衝突。
在STM32F2xx上,若是將Scan關閉,只會對單一通道取樣。變成無法對多通道取樣。
你何不將scan打開試試看。

使用特权

评论回复
18
yzzly|  楼主 | 2014-5-12 15:25 | 只看该作者
打开了,结果不对

使用特权

评论回复
19
wallace_tsou| | 2014-5-12 15:31 | 只看该作者
Scan未打開的話,連Injected group也是單通道,我的應用上反而是不行的。
剛在STM32F401上測Injected group,Scan是是打開regular及injected使用多通道的開關。

使用特权

评论回复
20
yzzly|  楼主 | 2014-5-12 15:59 | 只看该作者
本帖最后由 yzzly 于 2014-5-12 16:08 编辑

终于可以了!
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = AdcChNum;
ADC_Init(ADC1,&ADC_InitStructure);
        
ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
        
ADC_DiscModeChannelCountConfig(ADC1,AdcChNum);                 //¼ä¶ÏģʽͨµÀ¸öÊýÅäÖÃ
ADC_DiscModeCmd(ADC1, ENABLE);                                             //¼ä¶ÏģʽʹÄÜ
ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
ADC_EOCOnEachRegularChannelCmd(ADC1,ENABLE);
ADC_DMACmd(ADC1, ENABLE);                                                   //ADC1µÄDMAʹÄÜ
ADC_Cmd(ADC1, ENABLE);

ADC1->SQR3 |= UL1AinCH << 0;
ADC1->SQR3 |= UczAinCH << 5;
ADC1->SQR3 |= UaAinCH << 10;
ADC1->SQR3 |= UbAinCH << 15;
ADC1->SQR3 |= UcAinCH << 20;
ADC1->SQR3 |= U0AinCH << 25;
ADC1->SQR2 |= 7 << 0;                                    //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC1->SQR2 |= 8 << 5;
ADC1->SQR2 |= 9 << 10;
ADC1->SQR2 |= 10 << 15;
ADC1->SQR2 |= 11 << 20;
ADC1->SQR2 |= 12 << 25;
ADC1->SQR1 |= 13 << 0;                                     //ÉèÖùæÔòÐòÁÐÖеÄͨµÀºÅ
ADC1->SQR1 |= 14 << 5;
ADC1->SQR1 |= 15 << 10;
ADC1->SQR1 |= 16 << 15;
ADC1->SQR1 |= (AdcChNum-1) << 20;

ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfConversion = AdcChNum;
ADC_Init(ADC2,&ADC_InitStructure);
        
ADC_CommonInitStructure.ADC_Mode = ADC_DualMode_RegSimult;
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div6;
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_2;
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_10Cycles;
ADC_CommonInit(&ADC_CommonInitStructure);
        
ADC_DiscModeChannelCountConfig(ADC2,AdcChNum);                    //¼ä¶ÏģʽͨµÀ¸öÊýÅäÖÃ
ADC_DiscModeCmd(ADC2, ENABLE);                                                 //¼ä¶ÏģʽʹÄÜ
ADC_DMARequestAfterLastTransferCmd(ADC2, ENABLE);
ADC_EOCOnEachRegularChannelCmd(ADC2,ENABLE);
ADC_DMACmd(ADC2, ENABLE);                                                        //ADC2µÄDMAʹÄÜ
ADC_Cmd(ADC2, ENABLE);

ADC2->SQR3 |= UL2AinCH << 0;
ADC2->SQR3 |= UdcAinCH << 5;
ADC2->SQR3 |= IaAinCH << 10;
ADC2->SQR3 |= IbAinCH << 15;
ADC2->SQR3 |= IcAinCH << 20;
ADC2->SQR3 |= I0AinCH << 25;


使用特权

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

本版积分规则

427

主题

1178

帖子

3

粉丝