硬汉嵌入式论坛

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

[有问必答] TIM1+ADC1+DMA中断,进不去中断,大神们帮忙看看。

[复制链接]

1

主题

8

回帖

11

积分

新手上路

积分
11
发表于 2016-1-15 10:38:06 | 显示全部楼层 |阅读模式
void TIM1_Config(void)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);    
  
    TIM_Cmd(TIM1, DISABLE);    
    
    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);                                      
    TIM_TimeBaseStructure.TIM_Period =  84000000/21000000 - 1;
    TIM_TimeBaseStructure.TIM_Prescaler = 0;            
    TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;                
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;    
    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                    
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;    
    TIM_OCInitStructure.TIM_Pulse = 84000000/21000000 - 1;
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;          
    TIM_OC1Init(TIM1, &TIM_OCInitStructure);

   TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);    
  
    TIM_ARRPreloadConfig(TIM1, ENABLE);              
    TIM_Cmd(TIM1, ENABLE);    
    

    TIM_CtrlPWMOutputs(TIM1, ENABLE);          
}


void bsp_InitADC(void)
{  
    ADC_InitTypeDef       ADC_InitStructure;
    ADC_CommonInitTypeDef ADC_CommonInitStructure;
    DMA_InitTypeDef       DMA_InitStructure;
    GPIO_InitTypeDef      GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2 | RCC_AHB1Periph_GPIOC, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);    
   
     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
    
    
    
      DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
    DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_ADDRESS;
    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1test;
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
    DMA_InitStructure.DMA_BufferSize = 5;
    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_PeripheralDataSize_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);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn;
     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
     NVIC_Init(&NVIC_InitStructure);
    DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
    DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
    DMA_Cmd(DMA2_Stream0, ENABLE);
    
    ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
    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);
    

    ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;
    ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
    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 = 1;
    
    ADC_Init(ADC1, &ADC_InitStructure);
    ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);

    ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);


    ADC_DMACmd(ADC1, ENABLE);
    
    ADC_Cmd(ADC1, ENABLE);

    TIM1_Config();


}



void DMA2_Stream0_IRQHandler(void)//DMAChannel0_IRQHandler(void)
{
    int i;
    printf("DMAIRQ\r\n");

    if(DMA_GetITStatus(DMA2_Stream0,DMA_IT_TCIF0))
    {
    printf("adc is OK\r\n");
        for(i=0;i<5;i++)
        printf("i=%d   %d \r\n",i,((float)ADC1test)*2.5/4096);
    DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
    }
    
}
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2016-1-15 14:23:32 | 显示全部楼层
这是V5板!?
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-15 15:02:43 | 显示全部楼层
是啊,V5板。。。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-15 15:07:03 | 显示全部楼层

回 ptiinngg 的帖子

ptiinngg:这是V5板!? (2016-01-15 14:23) 
是的。。。。
回复

使用道具 举报

14

主题

109

回帖

151

积分

初级会员

积分
151
发表于 2016-1-15 15:42:42 | 显示全部楼层
我也是初学,
不过想跟lz研究研究

虽然不太明白代码目的是啥
不过可以先看一下配套范例..
还有 RM0090 跟 AN4031 也得看看..

看了下好像有几个问题,
1. ADC1 跟 TIM1 都是 DMA2 驱动,NVIC 却设置 DMA1??
2. TIM_ITConfig 没设定, 可以的话 NVIC 也设个
3. DMA_ITConfig(DMA_Channel_0,DMA_IT_TC, ENABLE); 应该是 DMA2_Stream0??
4. Timer config 在 ADC 里面调用??
5. 手册里说 DMA 流程重要,得多看看
还有缓冲的大小也得注意,不然肯定得跑飞了
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-15 15:59:13 | 显示全部楼层

回 ptiinngg 的帖子

ptiinngg:我也是初学,
不过想跟lz研究研究

虽然不太明白代码目的是啥
不过可以先看一下配套范例..
....... (2016-01-15 15:42) 
谢谢回复,1和3已经改正完,还是不行,我想是TIM1触发ADC采样,使用DMA传输,当传输的数据为设定的数据时,此时中断,处理数据,TIM1一直运行。。。
在STM32F103上有过ADC-DMA采集,没有定时器,可以用的。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-1-15 20:53:33 | 显示全部楼层
楼主,你整理的这个小错误稍多,除了楼上兄弟说的
1.  这个删掉 , ADC_SoftwareStartConv(ADC1); 这个是软启动,定时器触发不需要的。
2.  循环模式,这个函数必须调用ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
3.  NVIC中断不对,你用的是MA2_Stream0,而这里怎么是DMA1_Stream0_IRQn
4.  最最重要的是,你的中断入口函数不对!


   DMA的中断入口函数是这样的:
DMA2_Stream0_IRQHandler           ; DMA2 Stream 0                                   
DMA2_Stream1_IRQHandler           ; DMA2 Stream 1                                   
DMA2_Stream2_IRQHandler           ; DMA2 Stream 2                                   
DMA2_Stream3_IRQHandler           ; DMA2 Stream 3                                   
DMA2_Stream4_IRQHandler           ; DMA2 Stream 4   
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-17 20:48:41 | 显示全部楼层

回 eric2013 的帖子

eric2013:楼主,你整理的这个小错误稍多,除了楼上兄弟说的
1.  这个删掉 , ADC_SoftwareStartConv(ADC1); 这个是软启动,定时器触发不需要的。
2.  循环模式,这个函数必须调用ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
3.  NVIC中断不对,你用 .. (2016-01-15 20:53) 
谢谢老师,急了点,刚从F103过来,下次一定认真。。
已改正,明天下到板试试。。。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-20 13:39:51 | 显示全部楼层

回 eric2013 的帖子

eric2013:楼主,你整理的这个小错误稍多,除了楼上兄弟说的
1.  这个删掉 , ADC_SoftwareStartConv(ADC1); 这个是软启动,定时器触发不需要的。
2.  循环模式,这个函数必须调用ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
3.  NVIC中断不对,你用 .. (2016-01-15 20:53) 
我刚改了,重新编辑了,再帮我看看,还是不行啊,没中断。。。。
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2016-1-21 11:34:35 | 显示全部楼层

回 clong1321 的帖子

clong1321:我刚改了,重新编辑了,再帮我看看,还是不行啊,没中断。。。。 (2016-01-20 13:39) 
把你修改后的,发出来看下。
回复

使用道具 举报

1

主题

8

回帖

11

积分

新手上路

积分
11
 楼主| 发表于 2016-1-24 10:29:35 | 显示全部楼层

回 eric2013 的帖子

eric2013:把你修改后的,发出来看下。 (2016-01-21 11:34) 
那个程序已经被我重新编辑过了,现在采用安富来示波器例程修改,再做进一步测试看看满足要求,这个等有空再来看看,谢谢!
回复

使用道具 举报

6

主题

11

回帖

6

积分

新手上路

积分
6
发表于 2017-3-30 14:44:56 | 显示全部楼层
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1test;
这句话应该是:
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC1test;//它是数组吧?
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
117586
QQ
发表于 2017-3-31 00:13:35 | 显示全部楼层

回 霖之宇 的帖子

霖之宇:DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)&ADC1test;
这句话应该是:
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC1test;//它是数组吧? (2017-03-30 14:44) 
在这里,&ADC1test和ADC1test的结果是一样的。
回复

使用道具 举报

356

主题

2180

回帖

3253

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3253
发表于 2017-3-31 09:41:17 | 显示全部楼层
我以前F103升级到F407的时候,也有不少问题,你可以看看我写的这个注意事项。
https://forum.anfulai.cn/forum.php?mod=viewthread&tid=20854

尤其是最后两条,关于ADC的定时采样。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-8-16 15:06 , Processed in 0.048692 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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