реклама на сайте
подробности

 
 
> STM32L051K8T6 + SysTick + ADC
Борис 1984
сообщение Sep 23 2014, 05:32
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 23-09-14
Пользователь №: 82 902



Добрый день, товарищи!

У меня такая проблема: настраиваю системный таймер с периодом 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] - для короткого!!!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 15:26
Рейтинг@Mail.ru


Страница сгенерированна за 0.01354 секунд с 7
ELECTRONIX ©2004-2016