Перейти к содержанию
    

Проблема с LPTIMER

Все мне нравиться в кинетис за исключением их убогих таймеров.

Настраиваю таймер как счетчик милисекунд

void LPTMR_Setup(void)
{
    lptmr_config_t lptmr_config;

    lptmr_config.timerMode = kLPTMR_TimerModeTimeCounter;
    lptmr_config.pinSelect = kLPTMR_PinSelectInput_0;
    lptmr_config.pinPolarity = kLPTMR_PinPolarityActiveHigh;
    lptmr_config.enableFreeRunning = true;
    lptmr_config.bypassPrescaler = true;
    lptmr_config.prescalerClockSource = kLPTMR_PrescalerClock_1; //1Khz - 1ms
    lptmr_config.value = kLPTMR_Prescale_Glitch_0;

    LPTMR_Init(LPTMR0, &lptmr_config);

    LPTMR_SetTimerPeriod(LPTMR0, 0xFFFF);

    LPTMR_EnableInterrupts(LPTMR0, kLPTMR_TimerInterruptEnable);
    EnableIRQ(LPTMR0_IRQn);

    LPTMR_StartTimer(LPTMR0);
}

uint32_t LPTMR_GetCount(void)
{
	uint32_t count = LPTMR_GetCurrentTimerCount(LPTMR0);

	uint32_t total_ms = count + added_val;

	return total_ms;
}


void LPTMR0_IRQHandler(void)
{
    LPTMR_ClearStatusFlags(LPTMR0, kLPTMR_TimerCompareFlag);

    added_val += 0xFFFF;

    /*
    Workaround for TWR-KV58: because write buffer is enabled, adding
    memory barrier instructions to make sure clearing interrupt flag completed
    before go out ISR
    */
    __DSB();
    __ISB();
}

Проверяю

while(1)
{
   time_stamp = LPTMR_GetCount();
   if (time_stamp >= t1)
   {
       t1 = time_stamp + PERIOD_1;
       GPIO_PortToggle(LED_PORT, (1<<LEDR_PIN));
   }
}

LED красиво мигает... до первого прерывания. и все.

поначалу я подумал что прерывание отсыхает. поставил брекпоинт на added_val += 0xFFFF; вижу на каждое прерывание на added_val апдейтируется правильно.

поставил брекпоинт  на uint32_t count = LPTMR_GetCurrentTimerCount(LPTMR0); вижу  count  не апдейтируется.

LPTMR_GetCurrentTimerCount тоже хитромудрая функция

static inline uint32_t LPTMR_GetCurrentTimerCount(LPTMR_Type *base)
{
    /* Must first write any value to the CNR. This synchronizes and registers the current value
     * of the CNR into a temporary register which can then be read
     */
    base->CNR = 0U;
    return (uint32_t)((base->CNR & LPTMR_CNR_COUNTER_MASK) >> LPTMR_CNR_COUNTER_SHIFT);
}

Вобщем непонятно как то с этим таймером.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...