
通过DMA将采集的ADC->DR的数据向adc_dma_buf[6]这个变量传输(指定的内存地址为adc_dma_buff[0]),CHSELR寄存器的值依次为5,6,7,8,9,10,F,0,实际测试的时候,AIN5的ADC转换结果被传输到了adc_dma_buff[1],AIN6的ADC转换结果被传输到了adc_dma_buff[2],以此类推,AIN10的转换结果被传输到了adc_dma_buff[0],而且数值也都是正确的。网上又说把`ADC_CFGR1.DMACFG置0的,但是这个置0后就不会自动连续传输了,而且成功的转这次转换,也是如上述一样错位。 从现象来看,好像ADC首先开启的是AIN10的转换。有人知道这是啥原因么? 初始化代码如下: void MX_ADC1_Init(void) {/ USER CODE BEGIN ADC1_Init 0 / LL_DMA_InitTypeDef DMA_Init_Struct; LL_AHB1_GRP1_EnableClock(LL_AHB1_GRP1_PERIPH_DMA1); / USER CODE END ADC1_Init 0 / LL_ADC_InitTypeDef ADC_InitStruct = {0}; LL_ADC_REG_InitTypeDef ADC_REG_InitStruct = {0}; LL_GPIO_InitTypeDef GPIO_InitStruct = {0}; / Peripheral clock enable / LL_APB2_GRP1_EnableClock(LL_APB2_GRP1_PERIPH_ADC); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOA); LL_IOP_GRP1_EnableClock(LL_IOP_GRP1_PERIPH_GPIOB); GPIO_InitStruct.Pin = LL_GPIO_PIN_5; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_6; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_7; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOA, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_0; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_1; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); GPIO_InitStruct.Pin = LL_GPIO_PIN_2; GPIO_InitStruct.Mode = LL_GPIO_MODE_ANALOG; GPIO_InitStruct.Pull = LL_GPIO_PULL_NO; LL_GPIO_Init(GPIOB, &GPIO_InitStruct); / ADC1 DMA Init / / USER CODE BEGIN ADC1_DMA_Init 1 / DMA_Init_Struct.Direction = LL_DMA_DIRECTION_PERIPH_TO_MEMORY;
DMA_Init_Struct.MemoryOrM2MDstAddress = (uint32_t)(adc_dma_data);
DMA_Init_Struct.MemoryOrM2MDstDataSize = LL_DMA_MDATAALIGN_HALFWORD;
DMA_Init_Struct.MemoryOrM2MDstIncMode = LL_DMA_MEMORY_INCREMENT;
DMA_Init_Struct.Mode = LL_DMA_MODE_CIRCULAR;
DMA_Init_Struct.NbData = 6;
DMA_Init_Struct.PeriphOrM2MSrcAddress = (uint32_t)(&ADC1->DR);
DMA_Init_Struct.PeriphOrM2MSrcDataSize = LL_DMA_PDATAALIGN_HALFWORD;
DMA_Init_Struct.PeriphOrM2MSrcIncMode = LL_DMA_PERIPH_NOINCREMENT; LL_DMA_Init(DMA1,LL_DMA_CHANNEL_1,&DMA_Init_Struct); / USER CODE END ADC1_DMA_Init 1 / ADC_InitStruct.Clock = LL_ADC_CLOCK_SYNC_PCLK_DIV2;
ADC_InitStruct.Resolution = LL_ADC_RESOLUTION_12B;
ADC_InitStruct.DataAlignment = LL_ADC_DATA_ALIGN_RIGHT; / Poll for ADC channel configuration ready /
while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0)
{
}
LL_ADC_ClearFlag_CCRDY(ADC1);
ADC_REG_InitStruct.TriggerSource = LL_ADC_REG_TRIG_SOFTWARE;
ADC_REG_InitStruct.SequencerLength = LL_ADC_REG_SEQ_SCAN_ENABLE_6RANKS;
ADC_REG_InitStruct.SequencerDiscont = LL_ADC_REG_SEQ_DISCONT_DISABLE;
ADC_REG_InitStruct.ContinuousMode = LL_ADC_REG_CONV_CONTINUOUS;
ADC_REG_InitStruct.DMATransfer = LL_ADC_REG_DMA_TRANSFER_UNLIMITED;
ADC_REG_InitStruct.Overrun = LL_ADC_REG_OVR_DATA_OVERWRITTEN; LL_ADC_SetOverSamplingScope(ADC1, LL_ADC_OVS_DISABLE); LL_ADC_SetTriggerFrequencyMode(ADC1, LL_ADC_CLOCK_FREQ_MODE_HIGH); LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_COMMON_1, LL_ADC_SAMPLINGTIME_12CYCLES_5); LL_ADC_SetSamplingTimeCommonChannels(ADC1, LL_ADC_SAMPLINGTIME_COMMON_2, LL_ADC_SAMPLINGTIME_12CYCLES_5); LL_ADC_DisableIT_EOC(ADC1); LL_ADC_DisableIT_EOS(ADC1); / Enable ADC internal voltage regulator /
LL_ADC_EnableInternalRegulator(ADC1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_1, LL_ADC_CHANNEL_5); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_5, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_2, LL_ADC_CHANNEL_6); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_6, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_3, LL_ADC_CHANNEL_7); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_7, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_4, LL_ADC_CHANNEL_8); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_8, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_5, LL_ADC_CHANNEL_9); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_9, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_REG_SetSequencerRanks(ADC1, LL_ADC_REG_RANK_6, LL_ADC_CHANNEL_10); while (LL_ADC_IsActiveFlag_CCRDY(ADC1) == 0); LL_ADC_ClearFlag_CCRDY(ADC1); LL_ADC_SetChannelSamplingTime(ADC1, LL_ADC_CHANNEL_10, LL_ADC_SAMPLINGTIME_COMMON_1); LL_ADC_StartCalibration(ADC1); while(LL_ADC_IsCalibrationOnGoing(ADC1)) { } LL_ADC_Enable(ADC1); while(LL_ADC_IsActiveFlag_ADRDY(ADC1) == 0); LL_ADC_REG_StartConversion(ADC1); LL_DMA_EnableChannel(DMA1,LL_DMA_CHANNEL_1); } |
STM32G070 I2C主机只发送设备地址读测试是否产生stop位
STM32F405RGT6 ADC2+TIM4触发+DMA(DMA2_Stream2_CH1)+DMA中断会死机(取消中断后完全正常)
多DMA数据流问题
夜深了,睡不着
晚上好啊,兄弟们
第三季度啦,兄弟们
STM32407 使用串口闲时中断+DMA方式接收最大接收字节是多少
STM32L433VCT6 进入STOP模式2之后,功耗依然和正常运行模式没有差别,请教大神
STM32G070RBT6TR ADC采集定点电压误差较大,有没有优化方向
LIS2MDL X轴数据读取问题