OpenEdv-开源电子网

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

STM32F4 ADC+DMA DMA DMA中断进不去

[复制链接]

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
发表于 2014-5-14 16:12:54 | 显示全部楼层 |阅读模式
5金钱
楼主你好!(ADC+DMA) 我使用的是单个ADC多通道采集。 在配置的时候,使用了DMA 发送过半中断


这是stm32f4xx_it.c
中断程序
void DMA2_Stream0_IRQHandler(void)
{
//??????·???DMA·?????°?????
   if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_HTIF0)==SET) 
   {  
     int i;
 printf("ok");
for(i=0;i<256;i++)
{
data= (ADC_ConvertedValue >> 8) & 0xff;
}
printf("%f ",Rx_Buffer*16*3.3*2/4096);
  SPI_FLASH_PageWrite(data, MyWriteAddr, 256);
MyWriteAddr+=256;
// printf("ok");
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_HTIF0);
}else if(DMA_GetFlagStatus(DMA2_Stream0,DMA_FLAG_TCIF0)==SET) 
    {  
int i;
for(i=256;i<512;i++)
{
data= (ADC_ConvertedValue >> 8) & 0xff;
}
SPI_FLASH_PageWrite(data, MyWriteAddr, 256);
MyWriteAddr+=256;
// printf("yes");
DMA_ClearFlag(DMA2_Stream0,DMA_FLAG_TCIF0);  

if(MyWriteAddr>=0x3fffff)
{
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC | DMA_IT_HT,DISABLE);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
printf("\r\n -------ADC×????á???????????­????------\r\n");
}
}
贴过来乱码出无关紧要!

这个是ADC配置 用了DMA中断!

#include "adc.h"

#define ADC1_DR_Address    ((uint32_t)0x4001224C)
__IO uint16_t ADC_ConvertedValue[CH_NUM]={0};
//__IO u16 ADC_ConvertedValueLocal;


/*
 * ????????ADC1_GPIO_Config
 * ?è??  ??????ADC1??DMA2???±??????????PC.01
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */



/* ????????ADC1_Mode_Config
 * ?è??  ??????ADC1???¤×÷??????DMA????
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */
 
 
 
 /* ????????ADC1_Config
 * ?è??  ??????ADC1???¤×÷??????DMA????
 * ????: ??
 * ????  ????
 * ?÷??  ???????÷??
 */
 static void ADC1_Config(void)
{

GPIO_InitTypeDef GPIO_InitStructure;
DMA_InitTypeDef DMA_InitStructure;
ADC_InitTypeDef ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;


/* Enable DMA clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);

/* Enable GPIOC clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);

/* Enable ADC1 clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);


/* DMA channel0 configuration */
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_Channel = DMA_Channel_0;  
DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;  //ADC???·
DMA_InitStructure.DMA_Memory0BaseAddr = (u32)&ADC_ConvertedValue;//???????·
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = CH_NUM;
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_HalfFull;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
//DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
//DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE);
DMA_Cmd(DMA2_Stream0, ENABLE);


/* Configure C.01  as analog input */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOC, &GPIO_InitStructure); // C0,PC1,PC2,?????±?????è??????



  /* ADC1 configuration */
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;//ADC?±??21MHz
  ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);


ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//????ADC????
ADC_InitStructure.ADC_ScanConvMode = ENABLE;   //?????¨?è???????¨?è?????????à?¨??????
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; //????????×?????????????????????ADC×???
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//????????????·?×???
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Left;  //????????×ó????
ADC_InitStructure.ADC_NbrOfConversion = 4;   //??×??????¨??????4
ADC_Init(ADC1, &ADC_InitStructure);

 
/*????ADC1???¨??10,11,12??3?????ù???????ò????1,2,3,4 */ 
ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_3Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_13, 4, ADC_SampleTime_3Cycles);

//ADC_DMARequestAfterLastTransferCmd(ADC1, ENABLE);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);

/*??????×??????÷ */   
/*ADC_ResetCalibration(ADC1);*/
/*??????×??????÷?????ê?? */
/*while(ADC_GetResetCalibrationStatus(ADC1));*/

/* ADC??×? */
/*ADC_StartCalibration(ADC1);*/
/* ??????×??ê??*/
/*while(ADC_GetCalibrationStatus(ADC1));*/


}

void NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
  
/* Configure one bit for preemption priority */
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
/* ????P[A|B|C|D|E]0???????? */
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);

}

/*
 * ????????ADC1_Init
 * ?è??  ????
 * ????  ????
 * ????  ????
 * ?÷??  ???????÷??
 */

 void ADC_start(void)
 {
 /* ??????????????????·????ù???????í????·?ADC×??? */ 
ADC_SoftwareStartConv(ADC1);
/* Enable ADC1 DMA */
ADC_DMACmd(ADC1, ENABLE);

/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable DMA channel0 */
DMA_Cmd(DMA2_Stream0, ENABLE);
DMA_ITConfig(DMA2_Stream0,DMA_IT_TC | DMA_IT_HT,ENABLE);
 }
void ADC1_Init(void)
{
ADC1_Config();
NVIC_Config();
}


求解为什么我的DMA中断进不去,还是我的ADC没有工作,本人做的是一个数据采集,其他led exti usart 均已调试成功!
跪求大神指点。

最佳答案

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

这个是我弄得DMA方式,可以循环采集多个通道,没有什么问题,你看看吧。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2014-2-25
在线时间
44 小时
发表于 2014-5-14 16:12:55 | 显示全部楼层
这个是我弄得DMA方式,可以循环采集多个通道,没有什么问题,你看看吧。

adc.c

4.09 KB, 下载次数: 3919

回复

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
 楼主| 发表于 2014-5-14 16:12:55 | 显示全部楼层
我的问题已解决,呵呵!我用了SPI_FLASH (W25Q16),之前ADC采集太快了,中断来得太快,结果向FLASH数据还没写完呢,就又进了了中断,所以在中断函数printf的时候,串口看不到我的的现象,以为是没有进中断。ADC 的DMA就像ADC的助理,是独立于ADC且为ADC服务的,主要做传输数据工作,不管你的ADC多快DMA都跟得上,不然这个助理就被fired,要他干嘛。呵呵!之后将采样周期给大,就能看到printf的输出了,证明DMA进了中断。楼主积攒的经验不愿独享,感谢在贴吧大神的帮助,谢谢你们!
回复

使用道具 举报

16

主题

110

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
329
金钱
329
注册时间
2014-2-25
在线时间
44 小时
发表于 2014-5-14 16:20:20 | 显示全部楼层
帮顶。。。。。
回复

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
 楼主| 发表于 2014-5-14 16:37:11 | 显示全部楼层
回复【3楼】jinstm32:
---------------------------------
DMA模式1:ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1 这里不是用与多个ADC模式吗?现在你用的独立ADC,能不能解释一下?
回复

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
 楼主| 发表于 2014-5-15 08:54:46 | 显示全部楼层
对于二楼回答 我是懂得 但是我用的DMA 半中断 然后通过spi协议 向片外FLASH写数 之后方便掉电数据不丢失,用于读取啊!可是我现在DMA半中断都进不去。。。帮帮忙啊~!
回复

使用道具 举报

17

主题

59

帖子

0

精华

初级会员

Rank: 2

积分
161
金钱
161
注册时间
2014-4-16
在线时间
5 小时
 楼主| 发表于 2014-5-15 09:06:08 | 显示全部楼层
原子哥呢?求解啊!
回复

使用道具 举报

0

主题

3

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2014-8-14
在线时间
1 小时
发表于 2014-8-14 21:23:02 | 显示全部楼层
学习了,谢谢各位大虾!
回复

使用道具 举报

1

主题

5

帖子

0

精华

新手上路

积分
29
金钱
29
注册时间
2014-7-25
在线时间
0 小时
发表于 2014-12-12 10:05:20 | 显示全部楼层
回复【7楼】天使的诺言:
---------------------------------
顶顶顶顶顶
回复

使用道具 举报

0

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
83
金钱
83
注册时间
2013-10-22
在线时间
15 小时
发表于 2015-5-17 16:35:13 | 显示全部楼层
学习了,谢谢各位大虾!
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-11
在线时间
0 小时
发表于 2015-11-3 16:07:13 | 显示全部楼层
回复【3楼】jinstm32:
---------------------------------
回复【2楼】jinstm32:
---------------------------------
回复

使用道具 举报

2

主题

8

帖子

0

精华

新手上路

积分
36
金钱
36
注册时间
2014-7-11
在线时间
0 小时
发表于 2015-11-3 16:14:26 | 显示全部楼层
回复【3楼】jinstm32:
---------------------------------
sum+=adc_value[j*ADC_CONV_COUNT+i];
这一句有点问题吧
应该是sum+=adc_value[j*(ADC_CONV_COUNT-1)+i];吧
回复

使用道具 举报

0

主题

0

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2018-2-28
在线时间
10 小时
发表于 2015-12-7 15:14:29 | 显示全部楼层
#define ADC1_DR_Address    ((uint32_t)0x4001224C)有问题吧,
这个地方应该是#define ADC1_DR_Address    ((uint32_t)0x4001204C)
由于ADC1_DR_Address = ADC1_BASE + 0x4c, 
/***stm32f4xxx.h******************************/
#define ADC1_BASE             (APB2PERIPH_BASE + 0x2000)
#define ADC3_BASE             (APB2PERIPH_BASE + 0x2200)
#define APB2PERIPH_BASE       (PERIPH_BASE + 0x00010000)
#define ERIPH_BASE           ((uint32_t)0x40000000)
/*******************************************/
故而,你所给的宏定义的值得应该为ADC3_DR_Address。
回复

使用道具 举报

19

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
253
金钱
253
注册时间
2015-4-29
在线时间
38 小时
发表于 2015-12-8 11:49:49 | 显示全部楼层
学习了,谢谢分享
回复

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-2-18 02:47:37 | 显示全部楼层
jinstm32 发表于 2014-5-14 16:12
这个是我弄得DMA方式,可以循环采集多个通道,没有什么问题,你看看吧。

很好,试过能用DMA中断吗?
逆水行舟不进则退
回复

使用道具 举报

1

主题

78

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
211
金钱
211
注册时间
2015-12-10
在线时间
49 小时
发表于 2016-2-18 02:54:07 | 显示全部楼层
没看见1楼的DMA2_Stream0_IRQHandler啊?
逆水行舟不进则退
回复

使用道具 举报

1

主题

4

帖子

0

精华

新手上路

积分
24
金钱
24
注册时间
2016-4-7
在线时间
3 小时
发表于 2016-4-7 16:50:39 | 显示全部楼层
静秋 发表于 2015-11-3 16:14
回复【3楼】jinstm32:
---------------------------------
sum+=adc_value[j*ADC_CONV_COUNT+i];
这一句有 ...

应该是sum += ADC_Value[i+j*ADC_CH_COUNT];
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手上路

积分
43
金钱
43
注册时间
2022-1-18
在线时间
12 小时
发表于 2022-4-1 11:16:32 | 显示全部楼层
jinstm32 发表于 2014-5-14 16:12
这个是我弄得DMA方式,可以循环采集多个通道,没有什么问题,你看看吧。

您好,我想请教一下,在读出转换数据的时候ADC转换和DMA是不是还在运行着,会不会干扰读出数据的正确性呢
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 23:56

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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