打印

stm32f303 adc和dma一起使用,DMA只进一次中断问题求解

[复制链接]
8997|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
youlongltm|  楼主 | 2013-7-2 08:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 youlongltm 于 2013-7-2 13:19 编辑

配置如下

void ADC_Config(void)
{
        ADC_InitTypeDef       ADC_InitStructure;
        ADC_CommonInitTypeDef ADC_CommonInitStructure;
        uint16_t calibration_value;
        
        ADC_StructInit(&ADC_InitStructure);
        ADC_VoltageRegulatorCmd(ADC1, ENABLE);   
        /* Insert delay equal to 10 us */
       //Delay(10);
       ADC_SelectCalibrationMode(ADC1, ADC_CalibrationMode_Single);
       ADC_StartCalibration(ADC1);
        
       while(ADC_GetCalibrationStatus(ADC1) != RESET );
       calibration_value = ADC_GetCalibrationValue(ADC1);
        
        ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;                                                                    
        ADC_CommonInitStructure.ADC_Clock = ADC_Clock_AsynClkMode;               
        ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1;           
        ADC_CommonInitStructure.ADC_DMAMode = ADC_DMAMode_Circular;               
        ADC_CommonInitStructure.ADC_TwoSamplingDelay = 0x6;         
        ADC_CommonInit(ADC1, &ADC_CommonInitStructure);

        ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable;
        ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
        ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0;         
        ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_OverrunMode = ADC_OverrunMode_Disable;
        ADC_InitStructure.ADC_AutoInjMode = ADC_AutoInjec_Disable;  
        ADC_InitStructure.ADC_NbrOfRegChannel = 1;
        ADC_Init(ADC1, &ADC_InitStructure);
        
        

        ADC_RegularChannelConfig(ADC1, ADC_Channel_7, 1, ADC_SampleTime_7Cycles5);
        ADC_ITConfig(ADC1, ADC_IT_EOC, DISABLE);
        /* Enable ADC1 */         
       ADC_Cmd(ADC1, ENABLE);
       ADC_DMACmd(ADC1, ENABLE);
       /* wait for ADRDY */
       while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_RDY));
       ADC_StartConversion(ADC1);   
              
}

void ADC_DMA_Configuration(void)
{
        DMA_InitTypeDef        DMA_InitStructure;
        DMA_DeInit(DMA1_Channel1);
        DMA_InitStructure.DMA_PeripheralBaseAddr = ADC_CDR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&ADCDualConvertedValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 100;
        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;//ADC_DMAMode_OneShot;
        DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);
        
        DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE);
        DMA_Cmd(DMA1_Channel1, ENABLE);
            
}
沙发
youlongltm|  楼主 | 2013-7-2 08:49 | 只看该作者
自己顶下,配置仿照官方例程,求各位大神指教

使用特权

评论回复
板凳
youlongltm|  楼主 | 2013-7-2 08:52 | 只看该作者
本帖最后由 youlongltm 于 2013-7-2 13:22 编辑

中断服务函数

void DMA1_Channel1_IRQHandler(void)         
{
    if(DMA_GetITStatus(DMA1_IT_TC1)==SET)   
    {
              Send_Flag=1;
              GPIO_WriteBit(GPIOE,GPIO_Pin_13,1-GPIO_ReadOutputDataBit(GPIOE,GPIO_Pin_13));
              DMA_ClearITPendingBit(DMA1_IT_TC1);
              DMA_ClearITPendingBit(DMA1_IT_GL1);
              DMA_ClearFlag(DMA1_FLAG_TC1);
    }
    else
    if(DMA_GetITStatus(DMA1_IT_HT1) == SET)
    {
        DMA_ClearITPendingBit(DMA1_IT_HT1);
        DMA_ClearITPendingBit(DMA1_IT_GL1);                                
    }
}

        

使用特权

评论回复
地板
youlongltm|  楼主 | 2013-7-2 08:57 | 只看该作者
通过usb 发送给PC  ,采集的数据一直没变,说明,DMA只进了一次,并且用示波器观察PE13,一直是高电平,再初始化中,我将它清0了,也验证了这个问题

使用特权

评论回复
5
airwill| | 2013-7-2 12:55 | 只看该作者
采集是肯定没有问题的, 只是这么长的代码, 看着让人头大, 楼主慢慢调吧, 可能能实现任务的

使用特权

评论回复
6
youlongltm|  楼主 | 2013-7-2 13:11 | 只看该作者
airwill 发表于 2013-7-2 12:55
采集是肯定没有问题的, 只是这么长的代码, 看着让人头大, 楼主慢慢调吧, 可能能实现任务的 ...

     谢谢你的回复,单单只是AD,可以调的通,数据可以实时变化,但是加上dma后,发现dma中断只是进一次,数据就一直不变了,

使用特权

评论回复
7
woshiaokeman| | 2013-7-4 21:39 | 只看该作者
https://bbs.21ic.com/icview-570067-1-1.html
这个是我原来做的,你可以看看,我的可以多次进中单,但是采集的数据就是不对!
还有就是你弄好了记得回复一下我哈,我看看你的是怎么写的!

使用特权

评论回复
8
youlongltm|  楼主 | 2013-7-5 14:48 | 只看该作者
woshiaokeman 发表于 2013-7-4 21:39
https://bbs.21ic.com/icview-570067-1-1.html
这个是我原来做的,你可以看看,我的可以多次进中单,但是采 ...

已经找出问题了,ADC结果的地址设置的不对,然后配置严格按照官方历程的步骤做,就可以了。

使用特权

评论回复
9
youlongltm|  楼主 | 2013-7-5 14:52 | 只看该作者
woshiaokeman 发表于 2013-7-4 21:39
https://bbs.21ic.com/icview-570067-1-1.html
这个是我原来做的,你可以看看,我的可以多次进中单,但是采 ...

我们的片子和库不太一样,多谢你的回复

使用特权

评论回复
10
trumpxp| | 2013-7-5 18:47 | 只看该作者
问题解决了就好     楼主   很不错    有时间    希望能够多逛21ic    没有搞不定的问题     

使用特权

评论回复
11
youlongltm|  楼主 | 2013-7-5 19:56 | 只看该作者
trumpxp 发表于 2013-7-5 18:47
问题解决了就好     楼主   很不错    有时间    希望能够多逛21ic    没有搞不定的问题      ...

确实,有大家的支持,没有搞不定的问题

使用特权

评论回复
12
youlongltm|  楼主 | 2013-7-5 20:11 | 只看该作者
弱弱问句,分配好了,怎么不能结贴?

使用特权

评论回复
13
mm7989680| | 2017-3-21 22:56 | 只看该作者
stm32f303 adc和dma一起使用

使用特权

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

本版积分规则

3

主题

27

帖子

0

粉丝