stm32f303 Le mode de conversion continue ADC multicanal ne démarre pas automatiquement la nouvelle séquence

marc

stm32f303 Le mode de conversion continue ADC multicanal ne démarre pas automatiquement la nouvelle séquence


J’utilise un STM32F303v avec 2 canaux réguliers ADC en mode cotinuous avec un DMA et je voudrais que la conversion continue ait lieu afin de permettre un flux de données.

Sur la base de la configuration de mon DMA et ADC ci-dessous, je ne peux pas effectuer de conversion continue. Lors du débogage, j’ai constaté que la toute première conversion est réussie, puis le bit ADSTART est remis à 0. Si je définis manuellement ADSTART = 1, la conversion démarre, DMA effectue le transfert à la fin, puis ADSTART revient à 0. Veuillez aider.

 DMAy_x = DMA1_Channel1; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)dest; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_BufferSize = 2; // in data unit DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADCx->DR; DMA_Init(DMAy_x, &DMA_InitStructure); DMA_Cmd(DMAy_x, ENABLE); ADCx = ADC1; ADC_Cmd(ADCx, DISABLE); while(ADCx->CR & ADC_CR_ADEN); ADC_DeInit(ADCx); ADC_InitTypeDef ADC_InitStructure; ADC_StructInit(&ADC_InitStructure); ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b; ADC_InitStructure.ADC_NbrOfRegChannel = 2; ADC_InitStructure.ADC_ExternalTrigEventEdge = ADC_ExternalTrigEventEdge_None; ADC_InitStructure.ADC_ExternalTrigConvEvent = ADC_ExternalTrigConvEvent_0; ADC_InitStructure.ADC_OverrunMode = ENABLE; ADC_InitStructure.ADC_AutoInjMode = DISABLE; ADC_Init(ADCx, &ADC_InitStructure); // Set up ADC channels for (uint16_t i = 0; i < nPins; ++i) { // make them regular channels with rank i +1, sample time is 19 ADC cycles ADC_RegularChannelConfig(ADCx, PIN_MAP[pinNames[i]].adcChannel, i + 1, ADC_SAMPLE_TIME); } ADC_DMAConfig(ADCx, ADC_DMAMode_Circular); ADC_DMACmd(ADCx, ENABLE); // Enable everything ADC_Cmd(ADCx, ENABLE); while (!(ADC_GetFlagStatus(ADCx, ADC_FLAG_RDY))); ADC_StartConversion(ADCx); 
SamGibson

Pour tous les lecteurs intéressés par ce sujet: La même question a maintenant été également posée sur les forums ST , donc les réponses / réponses pourraient être données par les lecteurs là-bas.

marc

Le bogue était dans cette ligne ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;

Réponses


 marc

Le bug était dans cette ligne

 ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 

Ça devrait être

 ADC_InitStructure.ADC_ContinuousConvMode = ADC_ContinuousConvMode_Enable; 
Bence Kaulics

Notez que vous pouvez accepter votre propre réponse.

 

#de, #la, #pas, ADC, automatiquement, continue, Conversion, démarre, Le, mode, multicanal, ne, Nouvelle, Séquence, stm32f303

 

google

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *