OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3176|回复: 1

STM32F401定时器3更新触发ADC并通过DMA传输问题

[复制链接]

48

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2013-4-23
在线时间
165 小时
发表于 2020-10-15 10:34:44 | 显示全部楼层 |阅读模式
10金钱
用的STM32F401的TIM3的更新事件去触发ADC转换,然后通过DMA去搬运到内存,现在发现DMA中断只能进去一次,请教一下是什么问题啊?
void TIM3_Configuration(void)
{  
    TIM_TimeBaseInitTypeDef   TIM_TimeBaseStructure;
//                NVIC_InitTypeDef NVIC_InitStructure;                  
    /* Enable TIM3 clock */
    RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3, ENABLE);
    TIM_TimeBaseStructure.TIM_Period = 780-1;        //计数值   
    TIM_TimeBaseStructure.TIM_Prescaler = 42;          //42M 时钟预分频42 1M
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //不分割时钟
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);      
    TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);     
                TIM_ARRPreloadConfig(TIM3, ENABLE);       
//                TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);       
//                        //中断优先级NVIC设置
//        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
//        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
//        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
//        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
//        NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器
    TIM_Cmd(TIM3, ENABLE);      
}

void DMA_NVIC_Config(void)
{
    NVIC_InitTypeDef NVIC_InitStructure;
    /* Configure one bit for preemption priority */
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}
/***************************************************************
* 函数名:DMA_Config
* 输入  :void
* 输出  :void
* 功能  :
****************************************************************/
void DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;              
    /* Enable DMA2 */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
    /* DMA2_Stream0_Channel_0  Configuration ------------------------------*/
    DMA_DeInit(DMA2_Stream0);
    DMA_InitStructure.DMA_Channel = DMA_Channel_0;
    DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)(&ADC1->DR);         
    DMA_InitStructure.DMA_Memory0BaseAddr = (u32)ADC_ConvertedValue;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = CHANNEL_BUF_TOTAL_SIZE;               
    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_Full;
                DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
                DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;            
    DMA_Init(DMA2_Stream0, &DMA_InitStructure);            
    DMA_NVIC_Config();
    DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
    DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);
    /* Enable DMA2 steam0  */
    DMA_Cmd(DMA2_Stream0, ENABLE);
}

void DMA2_Stream0_IRQHandler(void)
{
    if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0) != RESET )
    {
        DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);       
        FinshFlag=1;
    }
}

void ADC_Configuration(void)        //ADC配置函数
{
    ADC_InitTypeDef ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;               
    /* Enable ADC1 clock */
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
                /* Single ADC mode */
                ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
                /* ADCCLK = PCLK2/4 */
                ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;                 //4分频21M
                /* Available only for multi ADC mode */
                ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled ;
                /* Delay between 2 sampling phases */
                ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
                ADC_CommonInit(&ADC_CommonInitStructure);
                                                                                                               
                /* Configure ADC1 to convert continously channel14 ***********/
                ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
                ADC_InitStructure.ADC_ScanConvMode = DISABLE;
                ADC_InitStructure.ADC_ContinuousConvMode =DISABLE;
                ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T3_TRGO;         
                ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;
                ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
                ADC_InitStructure.ADC_NbrOfConversion = 1;
                ADC_Init(ADC1, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_0,  1, ADC_SampleTime_56Cycles); //8
//    ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE);
//    ADC_ClearFlag(ADC1,ADC_FLAG_EOC);        
    /* Enable ADC1 */
    ADC_Cmd(ADC1, ENABLE);
    ADC_DMACmd(ADC1, ENABLE);
//    ADC_SoftwareStartConv(ADC1);
       
}

最佳答案

查看完整内容[请看2#楼]

已解决,需要加一句ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
努力做,耐心等
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

48

主题

177

帖子

0

精华

高级会员

Rank: 4

积分
778
金钱
778
注册时间
2013-4-23
在线时间
165 小时
 楼主| 发表于 2020-10-15 10:34:45 | 显示全部楼层
已解决,需要加一句ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
努力做,耐心等
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-29 23:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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