Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32 без cmsis
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
VictorR
Здравствуйте,
Контроллер 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
Цитата(VictorR @ Jan 14 2017, 12:51) *
Может дело в той части SystemInit() где производятся манипуляции с VTOR ?

Весьма вероятно.
В процессе инициализации не забывайте:
VTOR = (int32u)&__vector_table; // Vector Table Relocation
А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s
Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет.
Да и ещё заглушки поставить на стандартные исключения не забудьте.


scifi
Цитата(VictorR @ Jan 14 2017, 11:51) *
В симуляторе все работает и в прерывание заходит. А в жизни - виснет.
Если убрать все связанное с прерываниями работает нормально.

А если внутрисхемным отладчиком посмотреть?
AHTOXA
Цитата(VictorR @ Jan 14 2017, 13:51) *
Написал обработчик

void USART1_IRQHandler(void)
{
}

В симуляторе все работает и в прерывание заходит. А в жизни - виснет.

Дык, надо же сбрасывать прерывание.
VictorR
Цитата(amiller @ Jan 14 2017, 15:37) *
Весьма вероятно.
В процессе инициализации не забывайте:
VTOR = (int32u)&__vector_table; // Vector Table Relocation
А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s
Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет.
Да и ещё заглушки поставить на стандартные исключения не забудьте.


Можно подробнее про заглушки?

Цитата(AHTOXA @ Jan 14 2017, 19:07) *
Дык, надо же сбрасывать прерывание.


Так я и сбрасываю записью в USART1_DR

Цитата(scifi @ Jan 14 2017, 18:16) *
А если внутрисхемным отладчиком посмотреть?


Отладчика, к сожалению, пока нет.
scifi
Цитата(VictorR @ Jan 15 2017, 13:20) *
Отладчика, к сожалению, пока нет.

Если настраиваете такие вещи, как стартап, прерывания и т.п., без внутрисхемного отладчика тяжело. Это потом уже, когда всё задышало, можно ориентироваться по выводу диагностической информации в последовательный порт и т.п.
amiller
Цитата(VictorR @ Jan 15 2017, 14:20) *
Можно подробнее про заглушки?

В простейшем случае так:
CODE
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);}

Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения.
VictorR
Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?
Timmy
Цитата(amiller @ Jan 15 2017, 15:58) *
Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения.

Ставить кучу заглушек на все прерывания не обязательно. Младшие 8 бит PSR содержат номер текущего прерывания, так что одного DefaultHandler с бесконечным циклом достаточно для идентификации всех прерываний.

Цитата(VictorR @ Jan 15 2017, 20:30) *
Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?
Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть.
VictorR
Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть.
[/quote]

Всем спасибо! Заработало.
Пришлось еще вставить

setena1->SETENA37=1;

Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ?
SSerge
Цитата(VictorR @ Jan 17 2017, 21:33) *
Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ?

Предварительно в Project -> Options -> Debugger -> Download поставить галку Use flash loader(s).
Заливать через Project -> Download -> Download active application.

В Tools -> Options можно назначить на эту команду хоткей.
VictorR
Цитата(SSerge @ Jan 17 2017, 22:17) *
Предварительно в Project -> Options -> Debugger -> Download поставить галку Use flash loader(s).
Заливать через Project -> Download -> Download active application.

В Tools -> Options можно назначить на эту команду хоткей.


Спасибо, прошивается. Но запускается только после внешнего ресета.
SSerge
Цитата(VictorR @ Jan 19 2017, 21:31) *
Спасибо, прошивается. Но запускается только после внешнего ресета.

Есть такая фигня, не поборол.
Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe.
Там можно явно указать что делать после прошивки.
VictorR
Цитата(SSerge @ Jan 19 2017, 20:27) *
Есть такая фигня, не поборол.
Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe.
Там можно явно указать что делать после прошивки.


А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?
Сергей Борщ
QUOTE (VictorR @ Jan 21 2017, 10:25) *
А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?
Можно. Только не IAR, а gdb, не stlink.exe, а openocd, не RDP, а TCP wink.gif
jcxz
Цитата(VictorR @ Jan 21 2017, 11:25) *
А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?

Можно. Только не ST-Link, а J-Link Pro.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.