OpenEdv-开源电子网

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

SDADC多通道DMA采集分享

[复制链接]

13

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-9-11
在线时间
15 小时
发表于 2015-5-23 13:05:14 | 显示全部楼层 |阅读模式
目前采用的是F373的芯片,采用的是SDADC_InputMode_SEOffset模式,参考了论坛里的例程,今天刚调通,需要的朋友可以参考一下。
1)我猜测f3函数库中库函数SDADC_InjectedChannelSelect()是有问题的,如图1和图2,SDADC_JCHGR是配置注入组的,SDADC_InjectedChannelSelect使用的是赋值不是或运算,这样如果配置多个通道,后面配置的通道会把之前的覆盖了,导致只能配置一个通道。
2)例程如下:

void SDADC_Configuration(void)
{

SDADC_AINStructTypeDef ADC_AINStructure;
SDADC_InitTypeDef SDADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
int SDADCTimeout=0;
/* Enable clock */
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOB|RCC_AHBPeriph_GPIOE, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SDADC1,ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);
PWR_SDADCAnalogCmd(PWR_SDADCAnalog_1,ENABLE);

RCC_SDADCCLKConfig(RCC_SDADCCLK_SYSCLK_Div14);

//===============ADC 输入 端口设置 ==================================================
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL;
    GPIO_Init(GPIOB, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOE, &GPIO_InitStructure);

SDADC_DeInit(SDADC1);

SDADC_VREFSelect(SDADC_VREF_Ext);

Delay(5);
 
SDADC_Cmd(SDADC1, ENABLE); 

SDADC_InitModeCmd(SDADC1, ENABLE);

while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_INITRDY) == RESET)); 

//SDADC_DeInit(SDADC1);
/* ADC1 configuration ------------------------------------------------------*/
ADC_AINStructure.SDADC_InputMode=SDADC_InputMode_SEOffset;
ADC_AINStructure.SDADC_Gain=SDADC_Gain_1_2;
ADC_AINStructure.SDADC_CommonMode=SDADC_CommonMode_VSSA;
ADC_AINStructure.SDADC_Offset=0;
SDADC_AINInit(SDADC1,SDADC_Conf_0,&ADC_AINStructure);

SDADC_DMAConfig(SDADC1,SDADC_DMATransfer_Injected, ENABLE);

SDADC_ChannelConfig(SDADC1, SDADC_Channel_4, SDADC_Conf_0);
SDADC_ChannelConfig(SDADC1, SDADC_Channel_8, SDADC_Conf_0);

SDADC_InjectedChannelSelect(SDADC1,SDADC_Channel_8|SDADC_Channel_4);//必须这样才可以,分开配置的话后面配置的通道会覆盖前面的。

SDADC_InjectedContinuousModeCmd(SDADC1,ENABLE);

SDADC_InitModeCmd(SDADC1, DISABLE);

SDADC_CalibrationSequenceConfig(SDADC1, SDADC_CalibrationSequence_1);

SDADC_StartCalibration(SDADC1);
/* Set calibration timeout: 5.12 ms at 6 MHz in a single calibration sequence */
SDADCTimeout = 4*30720 ;

/* wait for PT100_SDADC Calibration process to end */
while((SDADC_GetFlagStatus(SDADC1, SDADC_FLAG_EOCAL) == RESET) && (--SDADCTimeout != 0));
if(SDADCTimeout == 0)
{
/* EOCAL flag can not set */
return ;
}
SDADC_SoftwareStartInjectedConv(SDADC1);

}

void DMA_Config(void)
{
DMA_InitTypeDef   DMA_InitStructure;

RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2,ENABLE);

DMA_DeInit(DMA2_Channel3); //恢复默认值,这个是必要的

/* DMA channel1 configuration ----------------------------------------------*/
DMA_InitStructure.DMA_PeripheralBaseAddr = SDADC1_DR_Address;
DMA_InitStructure.DMA_MemoryBaseAddr =(u32) SDADC_RegularConvertedValueTab;
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
DMA_InitStructure.DMA_BufferSize = SDAD_NUM;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // DMA_MemoryInc_Disable;
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_M2M = DMA_M2M_Disable;
DMA_Init(DMA2_Channel3, &DMA_InitStructure);

NVIC_Configuration();
DMA_ITConfig(DMA2_Channel3, DMA_IT_TC, ENABLE);        //DMA通道1传输完成中断
 
/* Enable DMA channel1 */
DMA_Cmd(DMA2_Channel3, ENABLE);

}



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

使用道具 举报

13

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-9-11
在线时间
15 小时
 楼主| 发表于 2015-5-23 13:06:36 | 显示全部楼层
好像图片没有发上去,图1是SDADC_JCHGR寄存器图,图2是函数SDADC_InjectedChannelSelect的,可以自己翻看一下
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165475
金钱
165475
注册时间
2010-12-1
在线时间
2115 小时
发表于 2015-5-23 23:16:34 | 显示全部楼层
帮顶....
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2014-4-12
在线时间
33 小时
发表于 2016-8-10 16:13:14 | 显示全部楼层
楼主您好,我也在尝试这个芯片。请问转换后的数据是交替放在SDADC_RegularConvertedValueTab中的吗? 数据手册中规则转换结果好像不能用DMA读取。盼复!
回复 支持 反对

使用道具 举报

4

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
267
金钱
267
注册时间
2014-4-12
在线时间
33 小时
发表于 2016-8-10 16:17:31 | 显示全部楼层
楼主您好,我也在尝试这个芯片。请问转换后的数据是交替放在SDADC_RegularConvertedValueTab中的吗?你的注入转换可以用DMA, 数据手册中规则转换结果好像不能用DMA读取是吧。盼复!
回复 支持 反对

使用道具 举报

19

主题

49

帖子

0

精华

高级会员

Rank: 4

积分
728
金钱
728
注册时间
2015-8-20
在线时间
58 小时
发表于 2016-8-31 21:47:56 | 显示全部楼层
很好很强大!
回复 支持 反对

使用道具 举报

13

主题

57

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2014-9-11
在线时间
15 小时
 楼主| 发表于 2016-9-2 15:27:52 | 显示全部楼层
九局下半 发表于 2016-8-10 16:17
楼主您好,我也在尝试这个芯片。请问转换后的数据是交替放在SDADC_RegularConvertedValueTab中的吗?你的注 ...

是放在SDADC_RegularConvertedValueTab中的,SDAD是可以使用DMA的
回复 支持 反对

使用道具 举报

8

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
193
金钱
193
注册时间
2015-9-1
在线时间
30 小时
发表于 2016-10-29 11:24:20 | 显示全部楼层
这芯片有SDADC的寄存器说明书发一份,我的里面都没有SDADC的说明书。出错了都不知道怎么办

回复 支持 反对

使用道具 举报

4

主题

23

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
272
金钱
272
注册时间
2016-10-31
在线时间
66 小时
发表于 2017-8-10 14:11:22 | 显示全部楼层
SDADC1_DR_Address 是多少啊
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-1 21:14

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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