完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请各位帮我看看,我如下设置DMA及ADC后,DMA 32位DR数据到内存中,为什么只有低字节有数据,高字节全是零?
到底是那个地方有问题?请求帮助!! void DMA_Configuration(void) { DMA_InitTypeDef DMA_InitStructure; //DMA1 channel1 configuration ---------------------------------------------- DMA_DeInit(DMA1_Channel1);//将DMA1的通道1重新设置为缺省值 DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)ADC1_DR_Address;//定义DMA外设基地址 DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&ADCValue;//定义DMA内存基地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//规定外设是作为数据传输的目的地还是来源。DST=目的地/SRC=来源 DMA_InitStructure.DMA_BufferSize = 6;//定义指定DMA通道的DMA缓存的大小,单位为数据单位。 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//设定外设地址寄存器递增与否。Enable=外设地址寄存器递增/Disable=外设地址寄存器不变 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//设定内存地址寄存器递增与否。Enable=内存地址寄存器递增/Disable=内存地址寄存器不变 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;//设定外设数据宽度。Byte=8位/HalfWord=16位/Word=32位 DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Word;////设定内存数据宽度。Byte=8位/HalfWord=16位/Word=32位 DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//设置DMA的CAN的工作模式。Circular=工作在循环缓存模式/Normal=工作在正常缓存模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//设置DMA通道的软件优先级。VeryHigh=非常高优先级 High=高优先级 Medium中优先级 Low低优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//设置DMA通道的内存到内存传输。Enable=通道设置为内存到内存传输/Disable=通道没有设置为内存到内存传输 DMA_Init(DMA1_Channel1, &DMA_InitStructure);// // Enable DMA1 channel1 DMA_Cmd(DMA1_Channel1, ENABLE);//使能或者失能指定的DMA通道。使能DMA1的通道1 while(DMA_GetFlagStatus(DMA1_FLAG_TC1)); } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; /*ADC1设置*/ ADC_DeInit(ADC1);//复位 /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐 _Left数据左对齐 ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16 ADC_Init(ADC1, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间 /* ADC1 regular channel_0 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 /* ADC1 regular channel_1 configuration */ ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 /* Enable ADC1 DMA */ ADC_DMACmd(ADC1, ENABLE);//使能或失能指定的ADC的DMA请求。 /*ADC2设置*/ ADC_DeInit(ADC2);//复位 /* ADC1 configuration ------------------------------------------------------*/ ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;//设置ADC工作在独立或者双ADC模式。ADC_Mode_Independent独立模式;ADC_Mode_RegSimult双模式 ADC_InitStructure.ADC_ScanConvMode = ENABLE;//ENABLE模数转换工作在扫描模式(多通道);DISABLE模数转换工作在单次(单通道)模式。 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//ENABLE连续转换模式;DISABLE单次转换模式 ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//设置外部触发来启动规则通道的模数转换。_None转换由软件而不是外部触发启动 ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//设置ADC数据左/右边对齐。_Right数据右边对齐 _Left数据左对齐 ADC_InitStructure.ADC_NbrOfChannel = 2;//设置顺序进行规则转换的ADC通道的数目。取值范围1到16 ADC_Init(ADC2, &ADC_InitStructure);//。在调用完ADC_InitStructure后必须调用ADC_RegularChannelConfig()来配置每个所使用通道的转换次序和采样时间 /* ADC2 regular channel_8 configuration */ ADC_RegularChannelConfig(ADC2, ADC_Channel_8, 1, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 /* ADC2 regular channel_9 configuration */ ADC_RegularChannelConfig(ADC2, ADC_Channel_9, 2, ADC_SampleTime_239Cycles5);//设置指定ADC的规则组通道,设置它们的转化顺序和采样时间 ADC_ExternalTrigConvCmd(ADC2, ENABLE); /* Enable ADC1 */ ADC_Cmd(ADC1, ENABLE);//使能或失能指定的ADC。 /* Enable ADC1 reset calibaration register */ ADC_ResetCalibration(ADC1);//重置指定的ADC的校准寄存器。1=初始化校准寄存器 /* Check the end of ADC1 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC1));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化 /* Start ADC1 calibaration */ ADC_StartCalibration(ADC1);//指定ADC的A/D校准。1=开始校准 /* Check the end of ADC1 calibration */ while(ADC_GetCalibrationStatus(ADC1));//获取指定的ADC校准状态。0=校准完成 /* Enable ADC2 */ ADC_Cmd(ADC2, ENABLE);//使能或失能指定的ADC。 /* Enable ADC2 reset calibaration register */ ADC_ResetCalibration(ADC2);//重置指定的ADC的校准寄存器。1=初始化校准寄存器 /* Check the end of ADC2 reset calibration register */ while(ADC_GetResetCalibrationStatus(ADC2));//获取ADC重置校准寄存器的状态。0=校准寄存器已初始化 /* Start ADC2 calibaration */ ADC_StartCalibration(ADC2);//指定ADC的A/D校准。1=开始校准 /* Check the end of ADC2 calibration */ while(ADC_GetCalibrationStatus(ADC2));//获取指定的ADC校准状态。0=校准完成 /* Start ADC1 Software Conversion */ ADC_SoftwareStartConvCmd(ADC1, ENABLE);//ENABLE使能或者失能指定的ADC的软件转换启动功能。开始转换规则通道。 } |
|
相关推荐
6个回答
|
|
如果把ADC双模式,改成ADC独立模式,循环扫描所设置的通道时,所设置的通道都能采集出数据来,但到改为双ADC模式后只能读出ADC1下通道的数据来。
|
|
|
|
|
|
一样的问题,不知道咋办,能解决吗?
|
|
|
|
可以试试直接读取ADC1->DR的数据,最近也遇到这问题,好像出在DMA上。
|
|
|
|
刚刚碰到这个情况,需要在 ADC_SoftwareStartConvCmd(ADC1, ENABLE); 这句前面加上ADC_ExternalTrigConvCmd(ADC2, ENABLE);就可以了
|
|
|
|
楼主知道是什么问题了吗?我也遇到了相同的情况,能不能讲解一下呢?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1252 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1184 浏览 3 评论
2263 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1351 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1774 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-28 17:39 , Processed in 0.662955 second(s), Total 81, Slave 65 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号