Zaseknutý ADC pri externím přerušení

Zdravím, potřeboval bych radu.
Dělám program pro discovery kit s M4 v Keilu. Potřebuju ADC a přijímat externí přerušení od rot. enkoderu. Problém je, že jakmile inicializuju přerušení, tak při převodu napětí se nenastaví flag, že je převod dokončen a tak to pořád čeká. Když neinicializuju přerušení tak ADC pracuje perfektně. V obsluze přerušení není nic podstatného (jen blikáni LED a vyčištění bitu zdroje přerušení).

main:

while(1) { ADC_SoftwareStartConv(ADC1); //ADC zacatek konverze while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC) == RESET); //Cekani na konec konverze. TADY to zamrzne ADC1ConvertedValue = ADC_GetConversionValue(ADC1); }

Inicializace přerušení:

void EXTILine0_Config(void)
{
  EXTI_InitTypeDef   EXTI_InitStructure;
  NVIC_InitTypeDef   NVIC_InitStructure;

  /* Enable SYSCFG clock */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  
  /* Connect EXTI Line0 to PC0 pin */
  SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource0);

  /* Configure EXTI Line0 */
	
  EXTI_InitStructure.EXTI_Line = EXTI_Line0;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  
  EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  EXTI_Init(&EXTI_InitStructure);

  /* Enable and set EXTI Line0 Interrupt to the lowest priority */
  NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

inicializace ADC:

void ADC_Initialization(void)
{
ADC_InitTypeDef       ADC_InitStructure;
ADC_CommonInitTypeDef ADC_CommonInitStructure;
	
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
	
/* ADC Common init***************************/
  ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div2;
  ADC_CommonInitStructure.ADC_DMAAccessMode =   ADC_DMAAccessMode_Disabled;
  ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  ADC_CommonInit(&ADC_CommonInitStructure);
	
	/* ADC1 Init ****************************************/
  ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  ADC_InitStructure.ADC_NbrOfConversion = 1;
  ADC_Init(ADC1, &ADC_InitStructure);
	
	/* ADC1 regular channel0 configuration *************************************/
  ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_3Cycles);

	/* Enable ADC1 */
  ADC_Cmd(ADC1, ENABLE);
}

Když bude potřeba tak někam nahraju celej projekt, ale problem by snad měl bejt někde tady v tom.
Děkuju za každou nápomocnou radu :slight_smile:

Sice tohle neznám, ale co jsem tak kouknul na internet tak jsem viděl v inicializaci ještě:

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);

A čekání na ukončení konverze tímhle:

while(ADC_GetSoftwareStartConvStatus(ADC1) == SET);
// while(ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC) == SET);

Ten první příkaz slouží pro povolení hodin na port A kde je připojen ADC převodník. To i s inicializaci příslušného portu tam mám. Ten druhý příkaz, jestli se nepletu testuje jestli se začalo převádět, což by vlastně neplnilo funkci čekáni na konec převodu. Jen poprosím bylo by možné uvést odkaz, kde jste toto našel. Rád bych proštudoval kód. Jen teď sem zkoušel vytvořit uplně nevý projek a zkusit to tam. No vypadá to už troch líp, ale zas mě nefunguje přerušení :slight_smile: (asi sem neco přehlíd) Tak to vypadá, že v originálním programu je někde schovaná nějaká mrtvolka :frowning:

To jsem viděl tady: bitbucket.org/fabienroyer/nwaze … /adc/adc.c

:arrow_right: administrator: přiloženy externí soubory
adc.c (2.4 KB)

Děkuji za link.

Panda má pravdu, každá priférie v ST ARM musí mít svůj clk enable. Když jsem s ARM začínal, nic nefungovalo jak mělo (bez hodin) :slight_smile: