OpenEdv-开源电子网

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

求助一个定时器定时ADC采样 DMA传输的程序,我自己这个没有调通,参考下找找原因,谢谢!

[复制链接]

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
发表于 2015-11-16 21:24:26 | 显示全部楼层 |阅读模式
5金钱
求助一个定时器定时ADC采样 DMA传输的程序,我自己这个没有调通,参考下找找原因,谢谢!

最佳答案

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

dma对adc的传输只能用dma2传输,说明书上有
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

70

帖子

0

精华

高级会员

Rank: 4

积分
844
金钱
844
注册时间
2016-1-5
在线时间
208 小时
发表于 2015-11-16 21:24:27 | 显示全部楼层
dma对adc的传输只能用dma2传输,说明书上有
回复

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
 楼主| 发表于 2015-11-16 21:41:53 | 显示全部楼层
//ADC+DMA
void DMA1_Init()
{
DMA_InitTypeDef DMA_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);

DMA_DeInit(DMA1_Channel1);

DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&ADC1->DR; //外设基地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)AD_Value; //内存基地址[30]*2
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //外设通过DMA向内存存入数据
DMA_InitStructure.DMA_BufferSize=N; //一次DMA传输数据大小(DMA通道缓存) 30*2
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地址不自增
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址自增
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //外设数据位宽16位(AD转换数据为16位)
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //内存数据位宽16位
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //循环DMA模式(适合ADC扫描类)
DMA_InitStructure.DMA_Priority=DMA_Priority_High; //DMA通道优先级高
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//初始化DMA1_Channel1

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //DMA传输完成中断

DMA_Cmd(DMA1_Channel1,ENABLE);
}

void DMA1_Channel1_IRQHandler()
{
u8 i;
if(DMA_GetITStatus(DMA1_IT_TC1))
{
//filter(); ///均值滤波
//GetMedianNum(temp_u,N); //中值滤波
//GetMedianNum(temp_i,N);

DMA_ClearITPendingBit(DMA1_IT_TC1);
temp0=(float)AD_Value[0]*(3.3/4096);  //显示0号通道的转换值
temp1=(float)AD_Value[1]*(3.3/4096);  //显示1号通道的转换值
//printf("ADC_ConvertedValue[0]=%d\n",ADC_ConvertedValue[0]);
//printf("temp0:%fV\n",temp0);  //其余六通道一样处理 
printf("%f\n",temp0);  //其余六通道一样处理 
//printf("ADC_ConvertedValue[1]=%d\n",ADC_ConvertedValue[1]);
//printf("temp1:%fV\n",temp1);  //其余六通道一样处理
}
}
回复

使用道具 举报

25

主题

122

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
399
金钱
399
注册时间
2015-5-2
在线时间
59 小时
 楼主| 发表于 2015-11-16 21:48:09 | 显示全部楼层
void ADC1_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
ADC_InitTypeDef ADC_InitStructure;

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_ADC1,ENABLE);

GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;
// GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;  //设置为ADC模拟输入
GPIO_Init(GPIOB,&GPIO_InitStructure);

  ADC_DeInit(ADC1);
RCC_ADCCLKConfig(RCC_PCLK2_Div6);//设置ADC时钟(ADCCLK))

ADC_InitStructure.ADC_Mode=ADC_Mode_Independent;//ADC转换模式为独立
ADC_InitStructure.ADC_ScanConvMode=ENABLE;//开启扫描模式
ADC_InitStructure.ADC_ContinuousConvMode=DISABLE;//禁止连续转换(如果连续的话,就对其他I/O口有干扰)
ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T2_CC2;//开启定时器2触发
ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfChannel=2;//转换通道的数目为2
ADC_Init(ADC1,&ADC_InitStructure);

//设置2通道的采样顺序和采样时间
ADC_RegularChannelConfig(ADC1,ADC_Channel_8,1,ADC_SampleTime_239Cycles5);
ADC_RegularChannelConfig(ADC1,ADC_Channel_9,2,ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1,ADC_Channel_3,3,ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1,ADC_Channel_4,4,ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1,ADC_Channel_5,5,ADC_SampleTime_239Cycles5);
// ADC_RegularChannelConfig(ADC1,ADC_Channel_6,6,ADC_SampleTime_239Cycles5);

ADC_Cmd(ADC1,ENABLE);//使能ADC1

ADC_ResetCalibration(ADC1);//ADC复位校准
while(ADC_GetResetCalibrationStatus(ADC1));//等待复位校准结束

ADC_StartCalibration(ADC1);//ADC校准
while(ADC_GetCalibrationStatus(ADC1));//等待校准结束
ADC_ExternalTrigConvCmd(ADC1, ENABLE); //设置外部触发模式使能
}
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-11-17 23:12:46 | 显示全部楼层
帮顶......
回复

使用道具 举报

4

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
135
金钱
135
注册时间
2012-9-16
在线时间
21 小时
发表于 2016-1-11 22:08:57 | 显示全部楼层
试试看看可以不可以用,顺便学习一下ADC DMA的转换关系
回复

使用道具 举报

11

主题

40

帖子

0

精华

初级会员

Rank: 2

积分
138
金钱
138
注册时间
2016-1-21
在线时间
35 小时
发表于 2016-2-23 19:32:42 | 显示全部楼层
楼主是在哪里找的原因了?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-20 22:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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