OpenEdv-开源电子网

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

407 ADC DMA 2通道中断进不去

[复制链接]

1

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2021-4-28
在线时间
13 小时
发表于 2021-12-1 18:10:48 | 显示全部楼层 |阅读模式
1金钱
使用STM32f407进行2个通道采样,采用ADC1的通道12和13,软件触发DMA方式,DMA中断进行读取数据,但是实际过程中发现,不进入中断函数,找不到问题,求帮助

  1. static void ADC_GPIO_Config(void)
  2. {
  3.         GPIO_InitTypeDef        GPIO_InitStructure;
  4.        
  5.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);

  6.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
  7.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;
  8.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  9.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  10. }

  11. static void ADC_Adc_Config(void)
  12. {
  13.         ADC_CommonInitTypeDef        ADC_CommonInitStructure;
  14.         ADC_InitTypeDef                ADC_InitStructure;
  15.        
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  17. //        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);
  18. //        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);
  19.        
  20.         ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;
  21.         ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
  22.         ADC_CommonInitStructure.ADC_DMAAccessMode        =ADC_DMAAccessMode_Disabled;
  23.         ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_5Cycles;
  24.         ADC_CommonInit(&ADC_CommonInitStructure);
  25.        
  26.         ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
  27.         ADC_InitStructure.ADC_ScanConvMode=ENABLE;
  28.         ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
  29.         ADC_InitStructure.ADC_ExternalTrigConvEdge  =ADC_ExternalTrigConvEdge_None;
  30.         ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;
  31.         ADC_InitStructure.ADC_DataAlign =ADC_DataAlign_Right;
  32.         ADC_InitStructure.ADC_NbrOfConversion=ADC_NUMOFCHANNEL;
  33.         ADC_Init(ADC1,&ADC_InitStructure);
  34.        
  35.         ADC_RegularChannelConfig(ADC1,ADC_Channel_12,1,ADC_SampleTime_480Cycles);
  36.         ADC_RegularChannelConfig(ADC1,ADC_Channel_13,2,ADC_SampleTime_480Cycles);       
  37.        
  38.         ADC_SoftwareStartConv(ADC1);
  39.        
  40.         ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
  41.        
  42.         ADC_DMACmd(ADC1,ENABLE);
  43.        
  44.         ADC_Cmd(ADC1,ENABLE);       

  45. }
  46. static void ADC_DMA_Config(void)
  47. {
  48.        
  49.         DMA_InitTypeDef DMA_InitStructure;               

  50.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,        ENABLE);
  51.        
  52.         DMA_DeInit(DMA2_Stream0);
  53.        
  54.         DMA_InitStructure.DMA_Channel        =DMA_Channel_0;
  55.         DMA_InitStructure.DMA_PeripheralBaseAddr        =(uint32_t)(&(ADC1->DR));
  56.         DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)ADC_ConvertedValue;
  57.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;
  58.         DMA_InitStructure.DMA_BufferSize=ADC_NUMOFCHANNEL;
  59.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  60.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  61.         DMA_InitStructure.DMA_PeripheralDataSize        =DMA_PeripheralDataSize_HalfWord;
  62.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
  63.         DMA_InitStructure.DMA_Mode=DMA_Mode_Normal;    //DMA_Mode_Circular;
  64.         DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA_Priority_High;
  65.         DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
  66.         DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;
  67.         DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
  68.         DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
  69.         DMA_Init(DMA2_Stream0,&DMA_InitStructure);       
  70.        
  71.         DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
  72.        
  73.         DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
  74.        
  75.         DMA_Cmd(DMA2_Stream0,ENABLE);       
  76. }

  77. static void ADC_NVIC_Config(void)
  78. {
  79.         NVIC_InitTypeDef NVIC_InitStructure;
  80.        
  81.         //
  82.         NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;
  83.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority        =0;       
  84.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;       
  85.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  86.         NVIC_Init(&NVIC_InitStructure);
  87. }

  88. void Adc_Init(void)
  89. {       
  90.         ADC_GPIO_Config();       
  91.         ADC_DMA_Config();       
  92.         ADC_Adc_Config();
  93.         ADC_NVIC_Config();
  94. }

  95. void DMA2_Stream0_IRQHandler(void)
  96. {
  97.         if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
  98.         {
  99.                 LED1=!LED1;//
  100.                 Get_Adc_Average();
  101.                 printf("ddddddddddddddddd\r\n");
  102.                 DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
  103.         }
  104. }
复制代码

这些全部在adc.c中,在main.c中什么都没做


在中断函数DMA2_Stream0_IRQHandler()的if处打断点,不进入,LED1不闪烁,无打印信息



最佳答案

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

我自己已解决,找到了问题,多谢您提供的帮助
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2021-4-28
在线时间
13 小时
 楼主| 发表于 2021-12-1 18:10:49 | 显示全部楼层
hou18 发表于 2021-12-2 10:17
参考下这个:【探索者_ADC多通道(有使用DMA及不使用DMA的两个版本) 双重ADC+DMA规则同步 三重ADC+DMA交替 ...

我自己已解决,找到了问题,多谢您提供的帮助
回复

使用道具 举报

15

主题

1061

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
3606
金钱
3606
注册时间
2019-8-14
在线时间
1052 小时
发表于 2021-12-2 10:17:52 | 显示全部楼层
参考下这个:【探索者_ADC多通道(有使用DMA及不使用DMA的两个版本) 双重ADC+DMA规则同步 三重ADC+DMA交替采集同一通道】 http://www.openedv.com/forum.php?mod=viewthread&tid=290039
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2021-4-28
在线时间
13 小时
 楼主| 发表于 2021-12-3 13:02:29 | 显示全部楼层

经过多次尝试,发现将Adc_Init()中调用函数的代码全部放置在初始化函数中,而不采用函数调用的方式,代码的顺序小有改动,可以正常相应中断(可以证明之前的相关配置没有问题),目前还不确定是谁和谁的顺序引起问题,还需进一步验证,代码附下


  1. __IO uint16_t ADC_ConvertedValue[ADC_NUMOFCHANNEL];
  2. __IO uint16_t Adc_air_pressuer_value,Adc_pull_value;
  3. float Voltage_air_pressure,Voltage_pull,Voltage_pull_0;
  4. float P_air_pressure,F_pull,F_pull_0;
  5. extern u16 adc1,adc2;
  6. u16 sum1,sum2;

  7. void Adc_Init(void)
  8. {
  9.         GPIO_InitTypeDef                 GPIO_InitStructure;
  10.         ADC_CommonInitTypeDef        ADC_CommonInitStructure;       
  11.         ADC_InitTypeDef                ADC_InitStructure;       
  12.         DMA_InitTypeDef               DMA_InitStructure;               
  13.         NVIC_InitTypeDef              NVIC_InitStructure;       
  14.        
  15.                 //ADC1 NVIC ÅäÖÃ
  16.         NVIC_InitStructure.NVIC_IRQChannel=DMA2_Stream0_IRQn;
  17.         NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority        =0;
  18.         NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;
  19.         NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
  20.         NVIC_Init(&NVIC_InitStructure);
  21.        
  22.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);
  23.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  24.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2,ENABLE);
  25.        
  26.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2|GPIO_Pin_3;
  27.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN;
  28.         GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
  29.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  30.        
  31. //        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, ENABLE);
  32. //        RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1, DISABLE);

  33.         DMA_DeInit(DMA2_Stream0);
  34.        
  35.         DMA_InitStructure.DMA_Channel=DMA_Channel_0;
  36.         DMA_InitStructure.DMA_PeripheralBaseAddr        =(uint32_t)&(ADC1->DR);
  37.         DMA_InitStructure.DMA_Memory0BaseAddr=(uint32_t)ADC_ConvertedValue;
  38.         DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory;
  39.         DMA_InitStructure.DMA_BufferSize=ADC_NUMOFCHANNEL;
  40.         DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;
  41.         DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;
  42.         DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;
  43.         DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;
  44.         DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;    //DMA_Mode_Normal;
  45.         DMA_InitStructure.DMA_Priority=DMA_Priority_Medium;//DMA_Priority_High;
  46.         DMA_InitStructure.DMA_FIFOMode=DMA_FIFOMode_Disable;
  47.         DMA_InitStructure.DMA_FIFOThreshold=DMA_FIFOThreshold_HalfFull;
  48.         DMA_InitStructure.DMA_MemoryBurst=DMA_MemoryBurst_Single;
  49.         DMA_InitStructure.DMA_PeripheralBurst=DMA_PeripheralBurst_Single;
  50.         DMA_Init(DMA2_Stream0,&DMA_InitStructure);       
  51.         DMA_Cmd(DMA2_Stream0,ENABLE);       
  52.                
  53.         DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
  54.         DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);       
  55.        
  56.         ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent;
  57.         ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div4;
  58.         ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled;
  59.         ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles;
  60.         ADC_CommonInit(&ADC_CommonInitStructure);
  61.        
  62.         ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b;
  63.         ADC_InitStructure.ADC_ScanConvMode=ENABLE;
  64.         ADC_InitStructure.ADC_ContinuousConvMode=ENABLE;
  65.         ADC_InitStructure.ADC_ExternalTrigConvEdge =ADC_ExternalTrigConvEdge_None;
  66.         ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1;
  67.         ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;
  68.         ADC_InitStructure.ADC_NbrOfConversion=ADC_NUMOFCHANNEL;
  69.         ADC_Init(ADC1,&ADC_InitStructure);
  70.                
  71.         ADC_RegularChannelConfig(ADC1,ADC_Channel_12,1,ADC_SampleTime_480Cycles);
  72.         ADC_RegularChannelConfig(ADC1,ADC_Channel_13,2,ADC_SampleTime_480Cycles);       
  73.        
  74.         ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);       
  75.        
  76.         ADC_DMACmd(ADC1,ENABLE);
  77.        
  78.         ADC_Cmd(ADC1,ENABLE);       
  79.        
  80.         ADC_SoftwareStartConv(ADC1);
  81.        
  82. //        ADC_GPIO_Config();       
  83. //        ADC_DMA_Config();       
  84. //        ADC_Adc_Config();
  85. //        ADC_DMA_NVIC_Config();
  86. }

  87. void Get_Adc_Average(void) //忽略函数名的意思,调试程序,随意调用
  88. {
  89.         Adc_air_pressuer_value=ADC_ConvertedValue[0];
  90.         Adc_pull_value=ADC_ConvertedValue[1];

  91.         printf("Adc_air_pressuer_value:%u\t",Adc_air_pressuer_value);
  92.         printf("Adc_pull_value:%u\r\n",Adc_pull_value);
  93. }

  94. void DMA2_Stream0_IRQHandler(void)
  95. {       
  96.         if(DMA_GetITStatus(DMA2_Stream0, DMA_IT_TCIF0))
  97.         {
  98.                
  99.                 Get_Adc_Average();
  100.                
  101.                 DMA_ClearITPendingBit(DMA2_Stream0,DMA_IT_TCIF0);
  102.         }
  103. }
复制代码

串口打印数据也正确



串口打印数据,一个是电压3.3V的ADC值,一个是我自己的传感器采集到的值

串口打印数据,一个是电压3.3V的ADC值,一个是我自己的传感器采集到的值
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2021-4-28
在线时间
13 小时
 楼主| 发表于 2021-12-3 17:12:29 | 显示全部楼层
经过验证,ADC的软件转换启动使能函数ADC_SoftwareStartConv(ADC1)必须在开启ADC转换器 ADC_Cmd(ADC1,ENABLE)之后,与调用函数的先后顺序无关,采用函数调用的方式也可以进去中断
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-26 09:29

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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