基本描述:本意打算利用ADC+DMA采集直流电压值,打算连续采样10次再求其平均,定义了u16 data[10]数组,为何传到数组data[10]时只有前5个元素有值,且data[10]数组的值像是内存缓冲区地址递增时只增加1个字节。有关代码如下:
DMA_DeInit(DMA1_Channel1); // 恢复缺省值
DMA_InitStructure.DMA_PeripheralBaseAddr = (CPU_INT32U)(&ADC1->DR);// 设置串口发送数据寄存器
DMA_InitStructure.DMA_MemoryBaseAddr = (CPU_INT32U)&data[0]; // 设置发送缓冲区首地址
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; // 设置外设为源,外设寄存器->内存缓冲区
DMA_InitStructure.DMA_BufferSize = 10; // 需要发送的字节数,这里其实可以设置为0,因为在实际要发送的时候,会重新设置次值
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; // 外设地址不做增加调整,调整不调整是DMA自动实现的
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; // 内存缓冲区地址增加调整
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; // 外设数据宽度16位,2个字节
DMA_InitStructure.DMA_MemoryDataSize = DMA_PeripheralDataSize_HalfWord; // 内存数据宽度16位,2个字节
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; // 循环传输模式
DMA_InitStructure.DMA_Priority = DMA_Priority_High; // 优先级设置
DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; // 关闭内存到内存的DMA模式
DMA_Init(DMA1_Channel1, &DMA_InitStructure); // 写入配置
ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
ADC_InitStructure.ADC_ScanConvMode = DISABLE; // 不启用扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_NbrOfChannel = 1;
ADC_Init(ADC1, &ADC_InitStructure);
BSP_IntVectSet(BSP_INT_ID_DMA1_CH1, DMA1_Channel1_IRQHandler);
/* ADC1 regular channel3 configuration */
ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 1, ADC_SampleTime_239Cycles5);
/* Enable ADC Interrupt */
//ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE);
/* Enable ADC1 */
ADC_Cmd(ADC1, ENABLE);
/* Enable ADC1 DAM*/
ADC_DMACmd(ADC1, ENABLE);
/* Enable ADC1 reset calibaration register */
ADC_ResetCalibration(ADC1);
/* Check the end of ADC1 reset calibration register */
while(ADC_GetResetCalibrationStatus(ADC1));
/* Start ADC1 calibaration */
ADC_StartCalibration(ADC1);
/* Check the end of ADC1 calibration */
while(ADC_GetCalibrationStatus(ADC1));
// ADC自动校准结束---------------
//ADC_ExternalTrigConvCmd(ADC1, ENABLE);
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); // 开启发送DMA通道中断
DMA_Cmd(DMA1_Channel1, ENABLE); // 开启DMA
ADC_SoftwareStartConvCmd(ADC1, ENABLE); //ADC启动
//DMA_Cmd(DMA1_Channel1, ENABLE); // 开启DMA
DMA_ITConfig(DMA1_Channel1, DMA_IT_TC, ENABLE); // 开启发送DMA通道中断
怎样让内存缓存地址递增按数据单元DMA_PeripheralDataSize_HalfWord大小进行?现在怀疑是实际按1字节递增的。
|