Hi, steige gerade auf den STM32 um und Teste den ADC im Scan Modus mit einem modifiziertem Beispiel Code. Die ADC Wandlung funktioniert einwandfrei, die 9 Werte werden im Array abgelegt, aber nach der Wandlung ist das EOC bit im Statusregister nicht gesetzt bzw. ich kann nicht in einer Schleife auf das Ende des Scanns deswegen warten. //--- // In Main nach anderen Inits: // DMA clock RCC_AHBPeriphClockCmd ( RCC_AHBPeriph_DMA1 , ENABLE ) ; DMA_InitStructure.DMA_BufferSize = 9; DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)ADCBuffer; DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR; DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; DMA_InitStructure.DMA_Priority = DMA_Priority_High; DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd ( DMA1_Channel1 , ENABLE ) ; // RCC_ADCCLKConfig ( RCC_PCLK2_Div6 ) ; RCC_APB2PeriphClockCmd ( RCC_APB2Periph_ADC1 , ENABLE ) ; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_NbrOfChannel = 9; ADC_InitStructure.ADC_ScanConvMode = ENABLE; ADC_Init(ADC1, &ADC_InitStructure); ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_28Cycles5); .... ADC_RegularChannelConfig(ADC1, ADC_Channel_9, 9, ADC_SampleTime_28Cycles5); ADC_Cmd ( ADC1 , ENABLE ) ; ADC_DMACmd ( ADC1 , ENABLE ) ; ADC_ResetCalibration(ADC1); while(ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while(ADC_GetCalibrationStatus(ADC1)); ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ; //--------------------------------------------------------------- // die Main Testschleife: while(1) { link_Usample.new_data = ADCBuffer[0]<<1; link_Temperatur.new_data = ADCBuffer[1]<<1; link_TemperaOpt.new_data = ADCBuffer[2]<<1; GPIO_WriteBit(TEST_PORT,TEST_PIN,Bit_SET); ADC_SoftwareStartConvCmd ( ADC1 , ENABLE ) ; //while ((ADC1->SR & ADC_FLAG_EOC) == 0 ); GPIO_WriteBit(TEST_PORT,TEST_PIN,Bit_RESET); int i; GPIO_WriteBit(LED_PORT,LED_PIN,Bit_SET); for (i=0;i<100000;i++); GPIO_WriteBit(LED_PORT,LED_PIN,Bit_RESET); for (i=0;i<100000;i++); } } //--- Wenn ich einen Breakpoint nach der ersten Delay Schleife setze und das ADC SR prüfe, ist EOC immer noch nicht gesetzt. Im Manual steht für das Control Register eins aber: Bit 8 SCAN: Scan mode This bit is set and cleared by software to enable/disable Scan mode. In Scan mode, the inputs selected through the ADC_SQRx or ADC_JSQRx registers are converted. 0: Scan mode disabled 1: Scan mode enabled Note: An EOC or JEOC interrupt is generated only on the end of conversion of the last channel if the corresponding EOCIE or JEOCIE bit is set (Den EOC interrupt habe ich auch probiert, da das EOC Bit nicht gesetzt wird, kam der natürlich auch nicht.) So das ich von einem Fehler meinerseits ausgehe, nur welcher? Gruß Ingo
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.