VictorR 0 4 января, 2017 Опубликовано 4 января, 2017 (изменено) · Жалоба Здравствуйте, в чем ошибка? (среда - IAR EWARM 7.10, чип - STM32F103C6) __irq void USART1IRQ(void); //объявляю свою функцию обработки прерывания //********* __irq void USART1IRQ(void) { ...... } //********* void main(void) { //вписываю адрес функции обработки в соответствующий вектор *(unsigned long*)0xd4=(unsigned long)USART1IRQ; //0xd4 - адрес вектора USART1 while(1); } компилируется без вопросов, но не работает Изменено 4 января, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Johnny81 0 4 января, 2017 Опубликовано 4 января, 2017 · Жалоба Странный код. Вы точно хотите писать адреса обработчиков в рантайме? Если да, то смотрите, как писать флэш в даташите. И кстати возможно будет много проще выделить область в ОЗУ для таблицы векторов и перенастроить туда VTOR... Если все же нет (как в 99,99% случаев), то вам надо при линковке создать таблицу векторов прерываний и разместить ее по адресу начала флэша. Как это сделать - читайте доку к IAR EWARM, я с ним не сталкивался... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 4 января, 2017 Опубликовано 4 января, 2017 · Жалоба Включите в проект файл "startup_stm32f10x_cl.s" (или другой, если я ошибся с принадлежностью Вашего контроллера этому семейству). Там все вектора уже объявлены. И посмотрите примеры, идут в комплекте с IAR. Скачайте CMSIS, посмотрите примеры оттуда. Это если нужно стандартное решение. Ну а куда может завести Ваш метод, боюсь даже предполагать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться