OpenEdv-开源电子网

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

关于adc3+dma无法进入中断的问题

[复制链接]

4

主题

9

帖子

0

精华

新手入门

积分
11
金钱
11
注册时间
2022-1-25
在线时间
4 小时
发表于 2022-10-25 21:42:20 | 显示全部楼层 |阅读模式
需要做一两路独立adc采样,第一路用adc和dma1没有问题,第二路用adc3+dma2就出了问题,进不去中断。后来根据adc1代码改写了一个单独adc3+dma2的代码单独拿来用,还是进不去DMA2_Channel4_5_IRQHandler,网上找了可能的几个问题,都没解决,没有办法只能求助各位大佬能否帮我看看是配置的哪个步骤出了问题。

  1. #include "adc.h"

  2. u16 ADC_Value[NPT];

  3. //cndtr:数据传输量
  4. void MYDMA_Config(u16 cndtr)
  5. {
  6.                 NVIC_InitTypeDef NVIC_InitStructure;
  7.                 DMA_InitTypeDef DMA_InitStructure;
  8.     RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE);    //使能DMA时钟
  9.    
  10.     DMA_DeInit(DMA2_Channel5);   //重设DMA为缺省值

  11.     DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC3->DR;  //外设地址
  12.     DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADC_Value;  //存储器地址
  13.     DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;  //外设到存储器的传输模式
  14.     DMA_InitStructure.DMA_BufferSize = cndtr;  //数据量为1(应该为cndtr参数)
  15.     DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //
  16.     DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //存储器地址自增
  17.     DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord  ;  //16位!!!特别注意
  18.     DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord  ; //16位!!!特别注意
  19.     DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;  //循环模式DMA_Mode_Circular
  20.     DMA_InitStructure.DMA_Priority = DMA_Priority_High; //优先级高
  21.     DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //(内存到内存禁止)
  22.        
  23.                 DMA_ITConfig(DMA2_Channel5,DMA_IT_TC, ENABLE);                //使能传输完成中断
  24.                
  25.         //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);设置在主函数
  26.                 NVIC_InitStructure.NVIC_IRQChannel = DMA2_Channel4_5_IRQn;
  27.                 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  28.                 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  29.                 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  30.                 NVIC_Init(&NVIC_InitStructure);

  31.     DMA_Init(DMA2_Channel5,&DMA_InitStructure);  //初始化
  32.     DMA_SetCurrDataCounter(DMA2_Channel5,cndtr);//设置数据量(应该为cndtr参数,若有其它需要改变即
  33.                                             //可,我这里是为了直观)
  34.                 DMA_Cmd(DMA2_Channel5, ENABLE);       
  35. }

  36. //ADC初始化                                                                                                          
  37. void  Adc_Init(void)
  38. {        
  39.                 ADC_InitTypeDef ADC_InitStructure;
  40.                 GPIO_InitTypeDef GPIO_InitStructure;

  41.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC3        , ENABLE );          //相关时钟使能
  42.          

  43.                 RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置分频因子,ADC时间最大不过14M

  44.                 //PA1寄存器初始化                        
  45.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
  46.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入模式
  47.                 GPIO_Init(GPIOA, &GPIO_InitStructure);       
  48.        
  49.                
  50.                 ADC_DeInit(ADC3);   

  51.                 ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //独立模式,不与其它ADC协作
  52.                 ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //关闭多通道模式
  53.                 ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //关闭连续转换模式
  54.                 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T2_CC3;//使用外部触发模式
  55.                 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //数据右对齐
  56.                 ADC_InitStructure.ADC_NbrOfChannel = 1;        //
  57.                 ADC_Init(ADC3, &ADC_InitStructure);        //

  58.                 ADC_RegularChannelConfig(ADC3, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5 );                                 
  59.         //配置采样时间
  60.                 ADC_Cmd(ADC3, ENABLE);        //使能指定ADC
  61.                 ADC_DMACmd(ADC3, ENABLE);//使能ADC - DMA
  62.                
  63.                 ADC_ResetCalibration(ADC3);        //复位校准  
  64.                 while(ADC_GetResetCalibrationStatus(ADC3));        //等待复位校准
  65.                 ADC_StartCalibration(ADC3);         //开启AD校准
  66.           while(ADC_GetCalibrationStatus(ADC3));         //等待结束
  67.                
  68.                 ADC_ExternalTrigConvCmd(ADC3, ENABLE);                //设置外部触发模式使能
  69. }

  70. void TIM2_Init( u32 Fre )
  71. {
  72.        
  73.         u32 MaxData;
  74.         u16 div=1;       
  75.        
  76.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  77.         TIM_OCInitTypeDef TIM_OCInitStructure;
  78.        
  79.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);                 //时钟使能

  80.         while( (SystemCoreClock/2/Fre/div)>65535 )
  81.         {
  82.                 div++;
  83.         }
  84.         MaxData =  SystemCoreClock/2/Fre/div - 1;       
  85. //        printf("%d,%d\r\n",MaxData,div);
  86.         //定时器TIM2初始化
  87.         TIM_TimeBaseStructure.TIM_Period = MaxData;                 //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
  88.         TIM_TimeBaseStructure.TIM_Prescaler =div;                         //设置用来作为TIMx时钟频率除数的预分频值
  89.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                 //设置时钟分割:TDTS = Tck_tim
  90.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;                 //TIM向上计数模式
  91.         TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);                        //根据指定的参数初始化TIMx的时间基数单位
  92.        
  93.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                //选择定时器模式:TIM脉冲宽度调制模式1
  94.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;                //比较输出使能
  95.         TIM_OCInitStructure.TIM_Pulse = MaxData/2;
  96.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;                //输出极性:TIM输出比较极性低
  97.         TIM_OC2Init(TIM2, & TIM_OCInitStructure);                //初始化外设TIM2_CH2
  98.        
  99.         TIM_Cmd(TIM2, ENABLE);                         //使能TIMx
  100.         TIM_CtrlPWMOutputs(TIM2, ENABLE);
  101. }

  102. void all_init(){
  103.         TIM2_Init(100000);
  104.         Adc_Init();
  105.         MYDMA_Config(NPT);
  106. }

  107. void  DMA2_Channel4_5_IRQHandler(void)
  108. {
  109.        
  110.         u16 i=0;
  111.         for(i=0;i<NPT;i++){
  112.                         printf("%d\r\n",ADC_Value[i]);
  113.                 }
  114.         if(DMA_GetITStatus(DMA2_IT_TC1)!=RESET){
  115.                
  116. //                for(i=0;i<NPT;i++){
  117. //                        printf("%d\r\n",ADC_Value[i]);
  118. //                }
  119.                
  120.                 DMA_ClearITPendingBit(DMA2_IT_TC1);
  121.         }
  122. }



复制代码


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1960
金钱
1960
注册时间
2021-4-16
在线时间
500 小时
发表于 2022-10-26 10:03:01 | 显示全部楼层

回帖奖励 +2 金钱

要不先不用外部触发试试看?
回复 支持 反对

使用道具 举报

0

主题

668

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1926
金钱
1926
注册时间
2021-8-13
在线时间
262 小时
发表于 2022-10-26 15:54:53 | 显示全部楼层

回帖奖励 +2 金钱

帮顶   
回复 支持 反对

使用道具 举报

7

主题

480

帖子

0

精华

高级会员

Rank: 4

积分
771
金钱
771
注册时间
2021-4-15
在线时间
304 小时
发表于 2022-10-26 16:16:45 | 显示全部楼层

回帖奖励 +2 金钱

如果用定时器触发 采样 读取值还需要DAM 这样的操作么 这么麻烦
日常敲键--头秃一片
回复 支持 反对

使用道具 举报

14

主题

821

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2035
金钱
2035
注册时间
2021-7-17
在线时间
636 小时
发表于 2022-10-26 17:46:38 | 显示全部楼层

回帖奖励 +2 金钱

帮顶     
回复 支持 反对

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
13
金钱
13
注册时间
2021-12-24
在线时间
2 小时
发表于 2022-11-12 16:01:25 | 显示全部楼层

回帖奖励 +2 金钱

遇到差不多的问题,也是不知道怎么解决,帮顶
回复 支持 反对

使用道具 举报

0

主题

3

帖子

0

精华

新手入门

积分
17
金钱
17
注册时间
2022-11-23
在线时间
4 小时
发表于 2022-11-25 16:32:53 | 显示全部楼层
请问解决了吗,我也遇到相同的问题了
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
7
金钱
7
注册时间
2022-12-19
在线时间
1 小时
发表于 2023-1-30 18:37:15 | 显示全部楼层
Templatexiaobai 发表于 2022-11-25 16:32
请问解决了吗,我也遇到相同的问题了

解决了吗 大哥
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 18:40

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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