完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
通过DMA传输,彼此有对应关系,F4板子对应如下
DMA2(CH0 CH4)-------------->ADC1 DMA2(CH2 CH3)-------------->ADC2 DMA2(CH0 CH1)-------------->ADC3 1.通过软件触发连续adc转换 void Adc_Config(u32 cmar,u16 cndtr) { ADC_CommonInitTypeDef ADC_CommonInitStructure; ADC_InitTypeDef ADC_InitStructure; GPIO_InitTypeDef GPIO_InitStructure; DMA_InitTypeDef DMA_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能ADC1通道时钟 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2|RCC_AHB1Periph_GPIOA|RCC_AHB1Periph_GPIOB|RCC_AHB1Periph_GPIOC , ENABLE); DMA_DeInit(DMA2_Stream0); while(DMA_GetCmdStatus(DMA2_Stream0)!=DISABLE){} //等待DMA可配置 DMA_InitStructure.DMA_Channel= DMA_Channel_0; DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA外设基地址 DMA_InitStructure.DMA_Memory0BaseAddr=cmar; //内存中存储DMA传输过来的数据基地址 DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralToMemory; //以外设为数据源 DMA_InitStructure.DMA_BufferSize=cndtr; //缓存数据个数 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地不变 DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址要增加 DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //内存数据为半字 16位(ADC精度为12位) DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; //DMA外设数据宽度 DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //DMA工作在循环模式、、//用中断则正常模式,不用则循环模式 DMA_InitStructure.DMA_Priority=DMA_Priority_High; DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable; DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full; DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single; DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single; DMA_Init(DMA2_Stream0,&DMA_InitStructure); //DMA初始化 DMA_ClearFlag(DMA2_Stream0,DMA_IT_TC); DMA_ITConfig(DMA2_Stream0,DMA_IT_TC,ENABLE); while(DMA_GetCmdStatus(DMA2_Stream0)!=DISABLE){} DMA_Cmd(DMA2_Stream0, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_0|GPIO_Pin_1;// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN; //模拟输入引脚 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ; GPIO_Init(GPIOC, &GPIO_InitStructure); RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1 复位 RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束 ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式 ADC_CommonInitStructure.ADC_TwoSamplingDelay =ADC_TwoSamplingDelay_10Cycles;//两个采样阶段之间的延迟5个时钟 ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_1; //DMA 模式1 ADC_DMAAccessMode_1 ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;ADCCLK=PCLK2/4=84/4=21Mhz,ADC 最高不要过 36Mhz ADC_CommonInit(&ADC_CommonInitStructure); ADC_TempSensorVrefintCmd(ENABLE); ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式 ADC_InitStructure.ADC_ScanConvMode =ENABLE;//扫描模式,多通道需要扫描模式 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//一般右对齐 ADC_InitStructure.ADC_NbrOfConversion = 4; ADC_Init(ADC1, &ADC_InitStructure); // ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12位模式 // ADC_InitStructure.ADC_ScanConvMode = DISABLE;//扫描模式 // ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;//用定时器触发时不能使用连续转换 // ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_Rising;//查看寄存器,发现需要使能外部触发,就是开启并制定触发信号的极性 // ADC_InitStructure.ADC_ExternalTrigConv =ADC_ExternalTrigConv_T2_CC2;//定时器2触发检测 // ADC_InitStructure.ADC_DataAlign= ADC_DataAlign_Right;//右对齐 // ADC_InitStructure.ADC_NbrOfConversion = 1;// 几个通道传输就写几(DMA传输下要设置为通道数) // ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化 // ADC_Init(ADC2, &ADC_InitStructure); //设置传输顺序 ADC_RegularChannelConfig(ADC1,ADC_Channel_14, 1, ADC_SampleTime_144Cycles);//采样时间 ADC_RegularChannelConfig(ADC1,ADC_Channel_15, 2, ADC_SampleTime_144Cycles);// ADC_RegularChannelConfig(ADC1,ADC_Channel_10, 3, ADC_SampleTime_144Cycles);// ADC_RegularChannelConfig(ADC1,ADC_Channel_11, 4, ADC_SampleTime_144Cycles);// //ADC_MultiModeDMARequestAfterLastTransferCmd(ENABLE); //多重adc所需 /* Enable DMA request after last transfer (Single-ADC mode) */ //源数据变化时开启DMA传输 ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE); ADC_DMACmd(ADC1,ENABLE); ADC_Cmd(ADC1, ENABLE); ADC_SoftwareStartConv(ADC1);//使能指定的ADC1的软件转换启动功能 } |
|
|
|
只有小组成员才能发言,加入小组>>
3254 浏览 9 评论
2937 浏览 16 评论
3439 浏览 1 评论
8941 浏览 16 评论
4030 浏览 18 评论
1072浏览 3评论
556浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
550浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2285浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1843浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-5 10:27 , Processed in 1.125846 second(s), Total 49, Slave 39 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号