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

Не выходит из прерывания таймера

Извеняюсь за идиотские вопросы, тк осваивать начал вчера,

В проге при старте имеем меандр 1 сек, затем тишина, такое ощущение что входит в прерывание таймера и не выходит, не пойму в чем дело.


void LED_toggle(void)
{
  GPIOA->ODR ^= (1<<GPIO_ODR_OD8_Pos);
}

//------------------------------------------------------------------------------

void TIM3_IRQHandler(void) 
{
    
    TIM3->SR &= ~TIM_SR_UIF;
    
    LED_toggle();
    
}


//------------------------------------------------------------------------------

int main(void) 
{
  
  
 RCC->IOPENR |=(0x01<<RCC_IOPENR_GPIOAEN_Pos); 
 GPIOA->BRR |= (0x01<<GPIO_BRR_BR8_Pos); 
 GPIOA->MODER &= ~(0x02<<GPIO_MODER_MODE8_Pos); 
  
  
  
 RCC->APBENR1 |=(0x01<<RCC_APBENR1_TIM3EN_Pos);
 TIM3->PSC = 60000 ;
 TIM3->ARR = 100;                                        
 TIM3->DIER |= (0x01<<TIM_DIER_UIE_Pos);                     

 TIM3->CR1 |=(0x01<<TIM_CR1_URS_Pos);                           
 TIM3->EGR |=(0x01<<TIM_EGR_UG_Pos);
 TIM3->CR1 &= ~TIM_CR1_URS; 
 
 TIM3->CR1 |=(0x01<<TIM_CR1_CEN_Pos);                      
  

  __enable_irq ();                                              

  NVIC_EnableIRQ(TIM3_IRQn);                                     

  
   
    while (1) 
    {
     //
     LED_toggle();
      
    }
}

//------------------------------------------------------------------------------

 

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

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


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

Такое ощущение что идет в прерывание-заглушку.

 

ps точно в прерывание для TIM3 не входит а входит куда то еще.

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

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


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

3 минуты назад, whale сказал:

Такое ощущение что идет в прерывание-заглушку.

Приобретите отладчик.

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


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

18 minutes ago, whale said:

ИМХО в прерывании:

- остановить таймер

- сбросить флаг прерывания

- выполнить нужное действие (мигнуть светодиодом)

- запустить таймер.

 

 

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


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

5 minutes ago, A.Lex said:

ИМХО в прерывании:

- остановить таймер

- сбросить флаг прерывания

- выполнить нужное действие (мигнуть светодиодом)

- запустить таймер.

 

 

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

Просто фантастика какая то 

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

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


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

7 минут назад, whale сказал:

он не зажигатеся,

А почему его состояние инвертируется у вас и в прерывании и в основном цикле? Он у вас наверно переключается с высокой частотой, и вам кажется, что он не зажигается.

31 минуту назад, whale сказал:

void TIM3_IRQHandler(void) {

TIM3->SR &= ~TIM_SR_UIF;

 

31 минуту назад, whale сказал:

while (1) {

// LED_toggle();

}

 

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


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

7 minutes ago, A.Lex said:

ИМХО в прерывании:

- остановить таймер

- сбросить флаг прерывания

- выполнить нужное действие (мигнуть светодиодом)

- запустить таймер.

 

 

Забыл. еще перед запуском таймера счетчик обнулить надо

 

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


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

Только что, A.Lex сказал:

Забыл. еще перед запуском таймера счетчик обнулить надо

А зачем сбрасывать? Ведь прерывание по переполнению. Таймер и так обнулится.

16 минут назад, whale сказал:

ps точно в прерывание для TIM3 не входит а входит куда то еще.

Как вы это без отладчика определили? Загляните в map-файл, посмотрите, линкуется ли ваш обработчик.

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


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

Не поверите, у меня осцилограф есть, 1 сек после старта идет меандр из while(), потом стоп.

 

Entry                     Address  Size  Type      Object
-----                     -------  ----  ----      ------
?main                  0x800'01e5        Code  Gb  cmain.o [3]
CSTACK$$Base          0x2000'0000         --   Gb  - Linker created -
CSTACK$$Limit         0x2000'0400         --   Gb  - Linker created -
IRQ_Init               0x800'00f3   0x4  Code  Gb  main.o [1]
LED_off                0x800'011b   0xe  Code  Gb  main.o [1]
LED_toggle             0x800'0129   0xe  Code  Gb  main.o [1]
MCU_init               0x800'00e3  0x10  Code  Gb  main.o [1]
PortInit               0x800'00f7  0x24  Code  Gb  main.o [1]
Region$$Table$$Base           0x0         --   Gb  - Linker created -
Region$$Table$$Limit          0x0         --   Gb  - Linker created -
TIM3_Init              0x800'013d  0x5c  Code  Gb  main.o [1]
__NVIC_EnableIRQ       0x800'0041  0x18  Code  Lc  main.o [1]
__NVIC_SetPriority     0x800'0059  0x8a  Code  Lc  main.o [1]
__cmain                0x800'01e5        Code  Gb  cmain.o [3]
__exit                 0x800'021d  0x14  Code  Gb  exit.o [4]
__iar_program_start    0x800'0231        Code  Gb  cstartup_M.o [3]
__low_level_init       0x800'0203   0x4  Code  Gb  low_level_init.o [2]
__vector_table         0x800'0000        Data  Gb  vector_table_M.o [3]
_call_main             0x800'01f1        Code  Gb  cmain.o [3]
_exit                  0x800'0211        Code  Gb  cexit.o [3]
_main                  0x800'01fb        Code  Gb  cmain.o [3]
exit                   0x800'0207   0x8  Code  Gb  exit.o [2]
main                   0x800'01d5  0x10  Code  Gb  main.o [1]

 

Я так понимаю функции TIM3_IRQHandler(void) тут нет ?

интересно и почему ? 

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

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


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

2 часа назад, A.Lex сказал:

- остановить таймер

- сбросить флаг прерывания

- выполнить нужное действие (мигнуть светодиодом)

- запустить таймер.

Вы меня простите, но еще бОльшую глупость придумать сложно. Таймер после переполнения отсчитал неизвестно сколько до вашего входа в прерывание, потом вы его зачем-то останавливаете и сбрасываете, в это время более приоритетные прерывания вносят еще более непредсказуемую задержку, потом вы таймер запускаете и в результате имеете совершенно непредсказуемый и нестабильный период прерываний, к тому же явно больший периода переполнения таймера. И самое главное - зачем? Чего вы пытаетесь добиться всеми этими действиями?

2 часа назад, whale сказал:

интересно и почему ? 

Вероятно потому, что в файле векторов прерываний обработчик имеет какое-то другое название.

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


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

2 часа назад, whale сказал:

интересно и почему ? 

А исходник вы каким компилятором собираете? Если Си++, то обзавите свой обработчик со словом extern

extern "C" void TIM3_IRQHandler(void) 
{
    
    TIM3->SR &= ~TIM_SR_UIF;
    
    LED_toggle();
    
}

Ну и проверьте, что имя функции обработчик тютелька в тютельку совпадает с тем, что у вас прописано в стартап-файле. Всякое бывает. Если не поможет, сбросте, пожалуйста исходник стартапа сюда.

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


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

IAR ARM 8.50.9 

на С

Если бы не совпадал тюлельку в тутельку он бы не откомпелировался

Где искать исходник стартапа ?

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

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


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

16 минут назад, whale сказал:

Если бы не совпадал тюлельку в тутельку он бы не откомпелировался

Откомпилировался. Функция как функция, раз нигде не вызывается, то и компилировать не надо.

Если не стартапа исходник, то весь проект.

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


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

23 минуты назад, whale сказал:

Если бы не совпадал тюлельку в тутельку он бы не откомпелировался

Скомплировался бы. Почему нет? Чем название обработчика отличается от обычной функции? Ничего. Более того, с точки зрения комплиятора обработчик - и есть обычная Си-функция. Так уж кортексы (Cortex-Mx) устроены. А обработчиком ему позволяет стать "слабое" объявление функции обработчика в стартапе, где по-умолчанию это обычно замкнутый цикл.

24 минуты назад, whale сказал:

Где искать исходник стартапа ?

Ваш проект. Я не знаю. Ищите средствами ОС за которой работаете по имени.

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


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

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

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

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

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

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

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

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

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

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