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

Обработчик прерывания срабатывает сразу после запуска таймера

Добавьте перед запуском таймера:

    // generate an update event to load the PSC and ARR values immediately
     TIM3->EGR = TIM_EGR_UG;

пробывал вот так:

/* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */
    TIM2->ARR=(6500); // загрузка рег-ра для сравнения 366,2109375/350=1 Hz
    TIM2->PSC=(65535-1);        // предделитель CK_CNT=24000000/65536=366,2109375 Hz
   
    TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера    
    TIM2->EGR = TIM_EGR_UG;
    TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания
    TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера

/* Разрешение прерывания TIM2 */
    NVIC_EnableIRQ(TIM2_IRQn);

Не работает, таймер также запускается при ресет

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


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

У вас прерывание назначено на событие обновления (UPDATE). Вы сначала разрешаете это прерывание, а потом генерируете событие обновления. Вот прерывание и возникает.

Надо сгенерировать событие обновления, потом сбросить флаг, а уже потом разрешать прерывания:

    TIM2->ARR = 6500;
    TIM2->PSC = 65535-1;
    TIM2->EGR  = TIM_EGR_UG;
    TIM2->SR = ~TIM_SR_UIF;
    TIM2->DIER |= TIM_DIER_UIE;
    TIM2->CR1 |= TIM_CR1_CEN;

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


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

Надо сгенерировать событие обновления, потом сбросить флаг, а уже потом разрешать прерывания:

    TIM2->ARR = 6500;
     TIM2->PSC = 65535-1;
     TIM2->EGR  = TIM_EGR_UG;
     TIM2->SR = ~TIM_SR_UIF;
     TIM2->DIER |= TIM_DIER_UIE;
     TIM2->CR1 |= TIM_CR1_CEN;

тоже самое

Похоже что

TIM2->SR =~(TIM_SR_UIF);

не сбразывает сам "запрос" на прерывание

Изменено пользователем MaxiMuz

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


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

тоже самое

Похоже что

TIM2->SR =~(TIM_SR_UIF);

не сбразывает сам "запрос" на прерывание

Попробуйте еще добавить:

    TIM2->ARR = 6500;
    TIM2->PSC = 65535-1;
    TIM2->EGR  = TIM_EGR_UG;
    TIM2->SR = ~TIM_SR_UIF;
NVIC_ClearPendingIRQ(TIM2_IRQn);
    TIM2->DIER |= TIM_DIER_UIE;
    TIM2->CR1 |= TIM_CR1_CEN;

Изменено пользователем KnightIgor

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


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

Выясненно опытным путем с использованием документа "Cortex-M3 programming manual".

Сброс флага статусного регистра

    TIM2->SR =~(TIM_SR_UIF);

не приводит к сбросу самого запроса на прерывание.

Чтобы сбросить запрос на прерывания делаем:

1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера

2. генерим событие таймера UG

3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера

4. Запускаем Таймер

5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx)

6. И только потом включаем разрешение на прерывание

/* Настройка таймера TIM2 на событие: Прерывание при совпадении с р-ром TIM2_ARR */
TIM2->ARR=(1500); // загрузка рег-ра для сравнения ~ 366/1500=0,244 Hz
    TIM2->PSC=(65535-1);        // предделитель CK_CNT=24000000/65536=366,2109375 Hz

TIM2->DIER|=(TIM_DIER_UIE); // разрешаем прерывание по срабатыванию таймера
TIM2->EGR = TIM_EGR_UG; // генерим событие таймера
__NOP();
TIM2->SR =~(TIM_SR_UIF);// сброс ф.прерывания
TIM2->CR1|=(TIM_CR1_CEN); // Запуск Таймера

NVIC_ClearPendingIRQ (TIM2_IRQn);

/* Разрешение прерывания TIM2 */
NVIC_EnableIRQ(TIM2_IRQn);

Если закоментить nop, то сброс события таймера не проходит.

Собственно вопрос такой , если мы в конце сбрасываем бит запроса на прерывания от таймера2 , тогда уже не важно какие события произошли до этого , прерывание по идее не ожидается, правильно ? Но если я убираю команду TIM2->EGR = TIM_EGR_UG; // генерим событие таймера , то таймер сразу после разрешения прерывания запускается.

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


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

1. После загрузки временных прарметров разрешаем прерывание по срабатыванию таймера

2. генерим событие таймера UG

3. Ждем один такт и только потом сбрасиываем флаг прерывания в регистре статуса таймера

4. Запускаем Таймер

5. Очищаем Interrupt clear-pending registers (NVIC_ICPRx)

6. И только потом включаем разрешение на прерывание

Как-то сложно всё это получается. Попробуйте просто:

1. Запустить таймер

2. Разрешить прерывание

Именно в такой последовательности.

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


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

Но если я убираю команду TIM2->EGR = TIM_EGR_UG;

смысл команды не сгенерить прерывание

смысл команды вызвать событие и обновить регистры таймера, обновление которых происходит по событию, которое в свою очередь и генерит прерывание.

Прерывание в данном случае - побочный эффект от обновления таймера.

 

Как-то сложно всё это получается. Попробуйте просто:

1. Запустить таймер

2. Разрешить прерывание

Именно в такой последовательности.

 

и будет исходная задача, без вызова события не произойдет настройки таймера,

а событие вызовет прерывание, потому сразу после разрешения прерывания в вашем случае полетите либо по таймеру работающему по старыми настройкам, либо если обновили настройки, то сразу по прерыванию...

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


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

правильно

DEFAULT_VAL равно не нулю, а тому чему оно должно быть равно для сохранения верных значений записываемых битиков.... это на случай если в регистры какие то битики обязаны записываться нулевыми, какие то единичками, правда я чет не припомню проца где это было нужно (в смысле где часть битов надо было оставлять 0, а часть 1, обычно все одинаковые)

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


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

DEFAULT_VAL равно не нулю, а тому чему оно должно быть равно для сохранения верных значений записываемых битиков....

Тогда уже лучше написать DEFAULT_VAL_MASK, где все биты с атрибутом RES должны быть нулями, а устанавливаемые флаги единицами... а не DEFAULT_VAL...

Я не ради докопаться... просто на другом форуме вопрошающий уже выдал непонимание происходящего...

Изменено пользователем HHIMERA

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


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

Тогда уже лучше написать DEFAULT_VAL_MASK, где все биты с атрибутом RES должны быть нулями, а устанавливаемые флаги единицами...

Их нельзя нулями. По мануалу нужно сохранять состояние после сброса. То есть "честное" формирование DEFAULT_VAL должно быть таким:

reg_def_val = reg | <все флаги типа w0c>

или

reg_def_val = reg & ~<все флаги типа w1c>

 

Не уверен, что кто-то так делает, конечно :)

 

я чет не припомню проца где это было нужно (в смысле где часть битов надо было оставлять 0, а часть 1, обычно все одинаковые)

Бывает, хотя в статусных регистрах тоже не встречал.

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


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

Их нельзя нулями. По мануалу нужно сохранять состояние после сброса.

В данном случае Reset value: 0x0000, согласно мануалу.

Если речь идет о TIMx_SR.

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


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

Не уверен, что кто-то так делает, конечно :)

Да... сомнения присутствуют...

А по поводу...

По мануалу нужно сохранять состояние после сброса.

Примеры SPL это отвергают напрочь... т.е. всё на совести и знаниях кодера...

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


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

да я тоже часто в ПЛИС делают некоторые резервные биты, которые не использую, и сам их нулю внутри автоматов, но на всякий случай, мало ли чего забуду, в описании требую такие биты в регистрах не трогать. Думаю тут также, если их трогать скорее всего ничего не будет, но мало ли что, потому и приписка такая, чтоб наверняка!

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


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

если их трогать скорее всего ничего не будет

В каком-то таймере STM32... точно уже не помню... где по референсу бит OPM отсутствует... попробовал как-то его установить... на авось... а вдруг...

Результат - таймер затыкался... т.е. все эти предупреждения... как бы и не на ровном месте...

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


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

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

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

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

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

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

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

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

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

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