VictorR 0 14 января, 2017 Опубликовано 14 января, 2017 · Жалоба Здравствуйте, Контроллер STM32F103C6, среда IAR 7.80.3, официальный с ограничением кода. Пытаюсь работать с прерываниями без CMSIS. К проекту подключены только файлы startup_stm32f10x_hd_vl.s, iostm32f10xxB.h, intrinsics.h Пользуясь определениями из iostm32f10xxB.h установил все необходимые регистры (тактирования, порты, прерывания). Установил глобальное разрешение прерываний (__enable_interrupt();) Чтоб не ругалась на отсутствие SystemInit (из отсутствующего в проекте system_stm32f10x.c) написал пустую функцию void SystemInit(void) {} поскольку все начальные установки уже сделал сам. Написал обработчик void USART1_IRQHandler(void) { } В симуляторе все работает и в прерывание заходит. А в жизни - виснет. Если убрать все связанное с прерываниями работает нормально. Может дело в той части SystemInit() где производятся манипуляции с VTOR ? Заранее благодарю за помощь Виктор Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 14 января, 2017 Опубликовано 14 января, 2017 · Жалоба Может дело в той части SystemInit() где производятся манипуляции с VTOR ? Весьма вероятно. В процессе инициализации не забывайте: VTOR = (int32u)&__vector_table; // Vector Table Relocation А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет. Да и ещё заглушки поставить на стандартные исключения не забудьте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 14 января, 2017 Опубликовано 14 января, 2017 · Жалоба В симуляторе все работает и в прерывание заходит. А в жизни - виснет. Если убрать все связанное с прерываниями работает нормально. А если внутрисхемным отладчиком посмотреть? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 14 января, 2017 Опубликовано 14 января, 2017 · Жалоба Написал обработчик void USART1_IRQHandler(void) { } В симуляторе все работает и в прерывание заходит. А в жизни - виснет. Дык, надо же сбрасывать прерывание. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VictorR 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Весьма вероятно. В процессе инициализации не забывайте: VTOR = (int32u)&__vector_table; // Vector Table Relocation А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет. Да и ещё заглушки поставить на стандартные исключения не забудьте. Можно подробнее про заглушки? Дык, надо же сбрасывать прерывание. Так я и сбрасываю записью в USART1_DR А если внутрисхемным отладчиком посмотреть? Отладчика, к сожалению, пока нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Отладчика, к сожалению, пока нет. Если настраиваете такие вещи, как стартап, прерывания и т.п., без внутрисхемного отладчика тяжело. Это потом уже, когда всё задышало, можно ориентироваться по выводу диагностической информации в последовательный порт и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
amiller 2 15 января, 2017 Опубликовано 15 января, 2017 (изменено) · Жалоба Можно подробнее про заглушки? В простейшем случае так: void NMI_Handler(void) {while(1);} void HardFault_Handler(void) {while(1);} void MemManage_Handler(void) {while(1);} void BusFault_Handler(void) {while(1);} void UsageFault_Handler(void) {while(1);} void SVC_Handler(void) {while(1);} void DebugMon_Handler(void) {while(1);} void PendSV_Handler(void) {while(1);} Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения. Изменено 15 января, 2017 пользователем amiller Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VictorR 0 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Timmy 1 15 января, 2017 Опубликовано 15 января, 2017 · Жалоба Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения. Ставить кучу заглушек на все прерывания не обязательно. Младшие 8 бит PSR содержат номер текущего прерывания, так что одного DefaultHandler с бесконечным циклом достаточно для идентификации всех прерываний. Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VictorR 0 17 января, 2017 Опубликовано 17 января, 2017 · Жалоба Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть. Всем спасибо! Заработало. Пришлось еще вставить setena1->SETENA37=1; Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 17 января, 2017 Опубликовано 17 января, 2017 · Жалоба Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ? Предварительно в Project -> Options -> Debugger -> Download поставить галку Use flash loader(s). Заливать через Project -> Download -> Download active application. В Tools -> Options можно назначить на эту команду хоткей. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VictorR 0 19 января, 2017 Опубликовано 19 января, 2017 · Жалоба Предварительно в Project -> Options -> Debugger -> Download поставить галку Use flash loader(s). Заливать через Project -> Download -> Download active application. В Tools -> Options можно назначить на эту команду хоткей. Спасибо, прошивается. Но запускается только после внешнего ресета. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SSerge 6 19 января, 2017 Опубликовано 19 января, 2017 · Жалоба Спасибо, прошивается. Но запускается только после внешнего ресета. Есть такая фигня, не поборол. Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe. Там можно явно указать что делать после прошивки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
VictorR 0 21 января, 2017 Опубликовано 21 января, 2017 · Жалоба Есть такая фигня, не поборол. Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe. Там можно явно указать что делать после прошивки. А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 136 21 января, 2017 Опубликовано 21 января, 2017 · Жалоба А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?Можно. Только не IAR, а gdb, не stlink.exe, а openocd, не RDP, а TCP ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться