|
STM8S-Discovery не получается зайти в обработчик прерывания, STVD, Raisonance |
|
|
|
Jan 3 2012, 20:55
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Как ни стараюсь, а в обработчик прерывания от таймера не попадаю. Подскажите в чем может быть проблема? Спасибо. Код #include <stm8s105c6.h> //Бибилиотека описаний периферии //#include <intrins.h> #include <intrist7.h> #define enableInterrupts() _rim_() /* enable interrupts */ #define disableInterrupts() _sim_() /* disable interrupts */
unsigned char a,b,c,Timer4;
void TIM4_UPD_OVF_IRQHandler(void) interrupt 23 //обработчик прерывания по таймеру 4 { TIM4_SR &= ~(1<<0); //Сбросим признак прерывания if(Timer4) Timer4--; //Программный таймер }
void Timer4_1ms_set (void) //инициализация таймера { TIM4_SR &= ~(1<<0); //Сбросим признак прерывания TIM4_PSCR=0x07; //Предделитель на 2^7=128 16000000/128 = 125000 Hz TIM4_ARR=125; //Регистр автозагрузки таймера при переполнении 125000 / 250 = 500 Hz TIM4_IER |= (1<<0); //Разрешаем генерацию прерывания при переполнеини CLK_PCKENR1 |= (1<<4); //Подключаем тактовый генератор к таймеру 4 TIM4_CR1 |= (1<<0); //Разрешаем счет }
_rim_(); //разрешить глобально прерывания В отладчике видно, что флаг прерывания устанавливается, но обработчик не выполняется. В чем может быть причина? Спасибо.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
 |
Ответов
(1 - 8)
|
Jan 4 2012, 02:43
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
Цитата(smk @ Jan 4 2012, 03:55)  Как ни стараюсь, а в обработчик прерывания от таймера не попадаю Насколько я понял, кусок кода взят отсюда? http://eugenemcu.ru/publ/11-1-0-67Если все так, как написано в вашем посте, то очевидно не хватает #pragma vector=TIM4_OVR_UIF_vector для захода в прерывание.
|
|
|
|
|
Jan 4 2012, 05:48
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Mareng @ Jan 4 2012, 04:43)  Насколько я понял, кусок кода взят отсюда? http://eugenemcu.ru/publ/11-1-0-67Если все так, как написано в вашем посте, то очевидно не хватает #pragma vector=TIM4_OVR_UIF_vector для захода в прерывание. Идея взята оттуда, но писана самостоятельно. Там под IAR, а у меня Raisonance. Кстати, посмотрел пример от ST, там правда другие прерывания используются, так явных отличий в реализации не нашел. Что бы это значило?
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 4 2012, 06:09
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
У вас в компиляторе указан какой-нить аналог иаровской #pragma vector? Вектор прерывания указывает на вашу функцию-обработчик?
|
|
|
|
|
Jan 4 2012, 06:13
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Цитата(Mareng @ Jan 4 2012, 08:09)  У вас в компиляторе указан какой-нить аналог иаровской #pragma vector? Вектор прерывания указывает на вашу функцию-обработчик? Код void TIM4_UPD_OVF_IRQHandler(void) interrupt 23 Вот та цифра 23 ,судя по документации на компилятор, и указывает на вектор. Перед ней обязательно ключевое слово interrupt. Компилируется без ошибок и предупреждений, но не работает.
RCSTM8.pdf ( 952.35 килобайт )
Кол-во скачиваний: 2710
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 4 2012, 06:14
|
Участник

Группа: Участник
Сообщений: 53
Регистрация: 19-02-07
Пользователь №: 25 487

|
Цитата(smk @ Jan 4 2012, 13:13)  Вот та цифра 23 просмотрел...
|
|
|
|
|
Jan 4 2012, 06:17
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
В документе, что прикрутил к предыдущему посту на с.44 написано: Цитата 4.5.1 Interrupts An interrupt function must be declared with a specific syntax: ● void funcname(void) interrupt intnumber ● There must be no parameters and no return value. ● The keyword “interrupt” must follow the function header. ● After the “interrupt” keyword you can specify the interrupt number handled by the function. ● intnumber is the interrupt number taken by the function (from 0 to 13 on ST7, from 0 to 31 on STM8). Делаю вроде бы точно по науке.
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
Jan 5 2012, 07:06
|
Гуру
     
Группа: Свой
Сообщений: 2 246
Регистрация: 17-03-05
Из: Украина, Киев
Пользователь №: 3 446

|
Конечно удобнее если кто подскажет, то не так много времени уходит на поиски ошибок. Я так понял, что я по ошибке разрешил прерывания при переключении тактирования и после это самое переключение разрешал. Предполагаю, что в итоге контроллер уходил в прерывание, обработчик которого не описан и не определен никак. Вероятно там контроллер и оставался. Не знаю насколько это возможно, но другого объяснения не нахожу. Привожу архив с рабочим проектом, может кому поможет сэкономить время. И еще вопрос к знающим людям. У меня в проект пришлось скопировать stm8s105c6.h и stm8s105c_s.h. Я так понимаю, это из библиотеки компилятора. Почему он сам их не видит и как сделать чтобы видел? Спасибо.
Irq2_T4.rar ( 69.95 килобайт )
Кол-во скачиваний: 223
--------------------
Живи днем так, чтобы ночью ты спал спокойно.
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|