完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
芯片是MM32F3277
用DMA读取ADC中的数据。现在可以进入DMA中断,但调试器中AD_value一直没有值。求大佬指点一下。 #include "DMA_ADC.h" uint16_t AD_value[10]; //ADC采样的数据经过DMA传输的数据放在这里 unsigned short LI_ADCflag=0; //ADC I/O口初始化 void LI_ADC_GPIO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBENR_GPIOA|RCC_AHBENR_GPIOB,ENABLE); //使能ADC I/O时钟 GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; //通道引脚 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; //电平输入 GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_InitStructure); } void LI_DMA_Init(void) { DMA_InitTypeDef DMA_InitStructure; NVIC_InitTypeDef NVIC_InitStruct; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE); //DMA1时钟使能 DMA_DeInit(DMA1_Channel1); DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&(ADC1->ADDATA); //ADC数据寄存器地址作为源 DMA_InitStructure.DMA_MemoryBaseAddr=(u32)&AD_value; //将ADC中的数据转移道AD_value中 DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC; //数据传输方向,外设作为源 DMA_InitStructure.DMA_BufferSize=10; //传输数据 DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable; //外设地址固定 DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable; //内存地址自增 DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord; //半字 DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_Mode=DMA_Mode_Circular; //循环传输 DMA_InitStructure.DMA_Priority=DMA_Priority_High; //通道优先级为最高级 DMA_InitStructure.DMA_M2M=DMA_M2M_Disable; //禁止内存到内存传输 DMA_Init(DMA1_Channel1,&DMA_InitStructure); DMA_Cmd(DMA1_Channel1,ENABLE); //DMA通道1使能 DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //DMA中断配置 NVIC_InitStruct.NVIC_IRQChannel =DMA1_Channel1_IRQn; NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; NVIC_Init(&NVIC_InitStruct); } void LI_ADC_Init(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE); //使能ADC1的时钟 ADC_InitStructure.ADC_Mode=ADC_Mode_Continuous_Scan; //连续扫描 ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; //数据右对齐 ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; //分辨率12 ADC_InitStructure.ADC_PRESCARE=ADC_PCLK2_PRESCARE_8; //时钟分频8 ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T1_CC1; ADC_Init(ADC1,&ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_4,0, ADC_SampleTime_239_5Cycles); ADC_DMACmd(ADC1,ENABLE); //向DMA发出请求 ADC_Cmd(ADC1,ENABLE); } void DMA1_Channel1_IRQHandler(void) { if(DMA_GetITStatus(DMA1_IT_TC1)!=RESET) { DMA_ClearITPendingBit(DMA1_IT_TC1); ADC_SoftwareStartConvCmd(ADC1, DISABLE); //DMA传输20个数据完成,标志置1 LI_ADCflag = 1; LED_Ctrl(LEDALL,RVS); //LED翻转闪烁 delayms(200); } } |
|
相关推荐
5个回答
|
|
读取值的问题已经解决。在DMA初始化中加上
DMA_InitStructure.DMA_Auto_reload = DMA_Auto_Reload_Enable; //自动重载 就可以看见ADC值。但又出现了另一个问题,我读多路ADC时,每次第一组数据总是错误的,后面的数据正常。 |
|
|
|
|
|
|
|
DMA_InitStructure.DMA_PeripheralBaseAddr=(u32)&(ADC1->ADDATA); //ADC数据寄这个改为ADC1->DR看看
|
|
|
|
ADC_RegularChannelConfig(ADC1, ADC_Channel_x, ADC_Channel_x, ADC_Samctl_239_5);多路adc需要配置这个
|
|
|
|
看你的DMA触发了几次啊,ADC的引脚上有没有接信号呢
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
621 浏览 1 评论
1962 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1068 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1487 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1924 浏览 1 评论
浏览过的版块 |
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 17:34 , Processed in 0.759046 second(s), Total 83, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号