Добрый день, товарищи!
У меня такая проблема: настраиваю системный таймер с периодом 10мкс и АЦП с периодом преобразования 50 мкс, по отдельности все работает нормально. Когда вместе, при одинаковых приоритетах прерываний на осциллографе вижу только работу таймера, если у АЦП выше приоритет, то есть пропуски прерываний от таймера, т.е. между входами t = 20мкс. Тактирую от HSI. Проверяю это с помощью светодиода и сигнала на лапах.
CODE
void Init()
{
//------ System clock HSI = 16 MHz ----------------------------------------
// FLASH->ACR = 0x00000001;
RCC->CFGR = RCC_CFGR_SW_HSI;// | RCC_CFGR_PPRE2_DIV16;
RCC->CR = RCC_CR_HSION | RCC_CR_HSIDIVEN; // Âíóòðåííèé ãåíåðàòîð ñ äåëèòåëåì íà 4
while(!(RCC->CR & RCC_CR_HSIRDY)) ; // Îæèäàíèå ñòàáèëèçàöèè ÷àñòîòû âíóòðåííåãî ãåíåðàòîðà
while(!(RCC->CR & RCC_CR_HSIDIVF)) ;
RCC->IOPENR = RCC_IOPENR_GPIOAEN | RCC_IOPENR_GPIOBEN; // Òàêòèðîâàíèå ïîðòîâ À è Â
RCC->APB2ENR = RCC_APB2ENR_ADC1EN; // Òàêòèðîâàíèå ÀÖÏ
GPIOA->MODER = 0xE85EFDDF;
GPIOA->PUPDR = 0x25000000;
GPIOB->MODER = 0xFFFFDFFF;
ADC1->CR |= ADC_CR_ADCAL;
while(ADC1->CR & ADC_CR_ADCAL) ; // Îæèäàíèå îêîí÷àíèÿ êàëèáðîâêè
ADC1->IER |= ADC_IER_EOCIE; // Ðàçðåøåíèå ïðåðûâàíèÿ ïî çàâåðøåíèè ïðåîáðàçîâàíèÿ
ADC1->CFGR1 |= ADC_CFGR1_WAIT | ADC_CFGR1_CONT;
ADC1->CFGR2 |= ADC_CFGR2_OVSR_0 | ADC_CFGR2_OVSR_1;
ADC1->CHSELR |= ADC_CHSELR_CHSEL3; // 3 êàíàë - ïðèåìíèê
ADC1->SMPR = ADC_SMPR_SMPR;
ADC->CCR |= ADC_CCR_LFMEN; // Low Frequency Mode
ADC1->CR = ADC_CR_ADSTART | ADC_CR_ADEN;
//----------------------SysTick Timer--------------------------------
SysTick->LOAD = 5;
// NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0;
SysTick->CTRL |= 0x07;
// NVIC_SetPriority(ADC1_COMP_IRQn, (1<<__NVIC_PRIO_BITS) - 1);
NVIC_EnableIRQ(ADC1_COMP_IRQn);
}
//-------------------------------------------
void SysTick_Handler(void) // 10 ìêñ
{
f_blink ^= 0x01;
if(f_blink)
GREEN_LED_ON;
else
GREEN_LED_OFF;
}
//-------------------------------------------
void ADC1_COMP_IRQHandler()
{
uint16_t resADC = ADC1->DR;
f_blink1 ^= 0x01;
if(f_blink1)
RED_LED_ON;
else
RED_LED_OFF;
}
Подскажите, пожалуйста в чем проблема.
Сообщение отредактировал IgorKossak - Sep 24 2014, 08:45
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!