初级会员

- 积分
- 59
- 金钱
- 59
- 注册时间
- 2019-6-4
- 在线时间
- 13 小时
|
1金钱
本帖最后由 韩同学叫园园 于 2020-6-4 15:54 编辑
下面是我的ADC——dma配置
当dma采用DMA_NORMAL模式时,采集的信号是正确的,但是ad的缓冲区数据不刷新?
当dma采用DMA_CIRCULAR模式时,采集的信号错误,ad缓冲区依旧不刷新?
求大神指点!!!!
/* 方便Cache类的API操作,做32字节对齐 */
#pragma location = 0x38000000 //0011 1000 0000 0000 0000 0000 0000 0000
uint16_t adc0Buffer[adCountX2];
ALIGN_32BYTES(__attribute__((section (".RAM_D3"))) uint16_t adc0Buffer[adCountX2]);
/*ADC1 DMA1_Stream1 配置*/
void ad_dma_Config(void)
{
__HAL_RCC_DMA1_CLK_ENABLE();
DmaHandle.Instance = DMA1_Stream1; /* 使用的DMA1 Stream1 */
DmaHandle.Init.Request = DMA_REQUEST_ADC1; /* 请求类型采用DMA_REQUEST_ADC1 */
DmaHandle.Init.Direction = DMA_PERIPH_TO_MEMORY; /* 传输方向是从外设到存储器 */
DmaHandle.Init.PeriphInc = DMA_PINC_DISABLE; /* 外设地址自增禁止 */
DmaHandle.Init.MemInc = DMA_MINC_ENABLE; /* 存储器地址自增使能 */
DmaHandle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD; /* 外设数据传输位宽选择半字,即16bit */
DmaHandle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD; /* 存储器数据传输位宽选择半字,即16bit */
DmaHandle.Init.Mode = DMA_CIRCULAR; /* 循环模式 */
DmaHandle.Init.Priority = DMA_PRIORITY_HIGH; /* 优先级高 */
/* 初始化DMA */
HAL_DMA_DeInit(&DmaHandle);
HAL_DMA_Init(&DmaHandle);
/* 关联ADC句柄和DMA句柄 */
__HAL_LINKDMA(&ADC1_Handler, DMA_Handle, DmaHandle);
}
//========================================== 初始化ADC1 PA5 ch: ADC_channels 19
void ADC1_Init(void)
{
ADC1_Handler.Instance =ADC1;
ADC1_Handler.Init.ClockPrescaler =ADC_CLOCK_SYNC_PCLK_DIV4;
ADC1_Handler.Init.Resolution =ADC_RESOLUTION_12B; //12位模式
ADC1_Handler.Init.ScanConvMode =ADC_SCAN_DISABLE; //非扫描模式
ADC1_Handler.Init.EOCSelection =ADC_EOC_SINGLE_CONV; //关闭EOC中断
ADC1_Handler.Init.LowPowerAutoWait =DISABLE; //自动低功耗关闭
ADC1_Handler.Init.ContinuousConvMode =DISABLE; //关闭连续转换
ADC1_Handler.Init.NbrOfConversion = 1; //1个转换在规则序列中 也就是只转换规则序列1
ADC1_Handler.Init.DiscontinuousConvMode =DISABLE; //禁止不连续采样模式
ADC1_Handler.Init.NbrOfDiscConversion =0; //不连续采样通道数为0
ADC1_Handler.Init.ExternalTrigConv =ADC_EXTERNALTRIG_T6_TRGO; //定时器6触发
ADC1_Handler.Init.ExternalTrigConvEdge =ADC_EXTERNALTRIGCONVEDGE_RISING; //上升沿触发
ADC1_Handler.Init.BoostMode =ENABLE; //BOOT模式使能,ADC时钟超过20M的话,使能boost
ADC1_Handler.Init.Overrun =ADC_OVR_DATA_OVERWRITTEN; //有新的数据的死后直接覆盖掉旧数据
ADC1_Handler.Init.OversamplingMode =DISABLE; //过采样关闭
ADC1_Handler.Init.ConversionDataManagement =ADC_CONVERSIONDATA_DMA_CIRCULAR; //规则通道的数据仅仅保存在DR寄存器里面
HAL_ADC_Init(&ADC1_Handler); //初始化
HAL_ADCEx_Calibration_Start(&ADC1_Handler,ADC_CALIB_OFFSET,ADC_SINGLE_ENDED); //ADC校准
ADC1_ChanConf.Channel = ADC_CHANNEL_19; //通道
ADC1_ChanConf.Rank =ADC_REGULAR_RANK_1; //采样序列离得第一个
ADC1_ChanConf.SamplingTime =ADC_SAMPLETIME_2CYCLES_5; //采样周期 1.5+7.5
ADC1_ChanConf.SingleDiff =ADC_SINGLE_ENDED; //单边采集
ADC1_ChanConf.OffsetNumber =ADC_OFFSET_NONE; //无偏移
ADC1_ChanConf.Offset =0;
HAL_ADC_ConfigChannel(&ADC1_Handler,&ADC1_ChanConf); //通道配置
ad_dma_Config( );//DMA1_Stream1配置
HAL_ADC_Start_DMA(&ADC1_Handler, (uint32_t *)&adc0Buffer,adCountX2);
}
|
-
dma-nomal模式
-
dma-circular模式
|