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

Здравствуйте,

Контроллер 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 ?

 

Заранее благодарю за помощь

Виктор

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


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

Может дело в той части SystemInit() где производятся манипуляции с VTOR ?

Весьма вероятно.

В процессе инициализации не забывайте:

VTOR = (int32u)&__vector_table; // Vector Table Relocation

А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s

Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет.

Да и ещё заглушки поставить на стандартные исключения не забудьте.

 

 

 

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


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

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

Если убрать все связанное с прерываниями работает нормально.

А если внутрисхемным отладчиком посмотреть?

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


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

Написал обработчик

 

void USART1_IRQHandler(void)

{

}

 

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

Дык, надо же сбрасывать прерывание.

 

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


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

Весьма вероятно.

В процессе инициализации не забывайте:

VTOR = (int32u)&__vector_table; // Vector Table Relocation

А __vector_table должна быть объявлена в startup_stm32f10x_hd_vl.s

Я тоже из CMSIS использую только хидер с объявлениями регистров и стартап кастрированный, проблем нет.

Да и ещё заглушки поставить на стандартные исключения не забудьте.

 

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

 

Дык, надо же сбрасывать прерывание.

 

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

 

А если внутрисхемным отладчиком посмотреть?

 

Отладчика, к сожалению, пока нет.

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


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

Отладчика, к сожалению, пока нет.

Если настраиваете такие вещи, как стартап, прерывания и т.п., без внутрисхемного отладчика тяжело. Это потом уже, когда всё задышало, можно ориентироваться по выводу диагностической информации в последовательный порт и т.п.

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


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

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

В простейшем случае так:

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);}

Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения.

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

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


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

Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?

 

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


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

Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения.

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

 

Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?
Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть.

 

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


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

Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть.

 

Всем спасибо! Заработало.

Пришлось еще вставить

 

setena1->SETENA37=1;

 

Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ?

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


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

Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ?

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

Заливать через Project -> Download -> Download active application.

 

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

 

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


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

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

Заливать через Project -> Download -> Download active application.

 

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

 

Спасибо, прошивается. Но запускается только после внешнего ресета.

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


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

Спасибо, прошивается. Но запускается только после внешнего ресета.

Есть такая фигня, не поборол.

Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe.

Там можно явно указать что делать после прошивки.

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


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

Есть такая фигня, не поборол.

Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe.

Там можно явно указать что делать после прошивки.

 

А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?

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


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

А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?
Можно. Только не IAR, а gdb, не stlink.exe, а openocd, не RDP, а TCP ;)

 

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


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

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

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

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

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

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

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

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

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

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