реклама на сайте
подробности

 
 
> stm32 без cmsis
VictorR
сообщение Jan 14 2017, 08:51
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



Здравствуйте,
Контроллер 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 ?

Заранее благодарю за помощь
Виктор
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
amiller
сообщение Jan 14 2017, 12:37
Сообщение #2


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(VictorR @ Jan 14 2017, 12:51) *
Может дело в той части SystemInit() где производятся манипуляции с VTOR ?

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


Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 14 2017, 15:16
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

А если внутрисхемным отладчиком посмотреть?
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Jan 14 2017, 16:07
Сообщение #4


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(VictorR @ Jan 14 2017, 13:51) *
Написал обработчик

void USART1_IRQHandler(void)
{
}

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

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


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
VictorR
сообщение Jan 15 2017, 10:20
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



Цитата(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) *
А если внутрисхемным отладчиком посмотреть?


Отладчика, к сожалению, пока нет.
Go to the top of the page
 
+Quote Post
scifi
сообщение Jan 15 2017, 11:30
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



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

Если настраиваете такие вещи, как стартап, прерывания и т.п., без внутрисхемного отладчика тяжело. Это потом уже, когда всё задышало, можно ориентироваться по выводу диагностической информации в последовательный порт и т.п.
Go to the top of the page
 
+Quote Post
amiller
сообщение Jan 15 2017, 12:58
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 176
Регистрация: 20-02-14
Из: Томск
Пользователь №: 80 612



Цитата(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);}

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

Сообщение отредактировал amiller - Jan 15 2017, 13:01
Go to the top of the page
 
+Quote Post
VictorR
сообщение Jan 15 2017, 17:30
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?
Go to the top of the page
 
+Quote Post
Timmy
сообщение Jan 15 2017, 18:38
Сообщение #9


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(amiller @ Jan 15 2017, 15:58) *
Индикацию какую нибудь добавьте. Чтобы знать куда улетаете, если возникают исключения.

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

Цитата(VictorR @ Jan 15 2017, 20:30) *
Почему-то мой обработчик прерывания USART1_IRQHandler() находится по адресу 0x8000606, а соответствующий вектор указывает на 0x8000607. Может в этом дело?
Единица в младшем бите адреса перехода указывает, что переход происходит на Thumb код, а не ARM код, так и должно быть.
Go to the top of the page
 
+Quote Post
VictorR
сообщение Jan 17 2017, 14:33
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



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

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

setena1->SETENA37=1;

Еще один вопрос. Можно ли из IAR-a через ST-LINK прошивать контроллер не входя в режим debug ?
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 17 2017, 19:17
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(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 можно назначить на эту команду хоткей.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
VictorR
сообщение Jan 19 2017, 14:31
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



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

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


Спасибо, прошивается. Но запускается только после внешнего ресета.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Jan 19 2017, 17:27
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



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

Есть такая фигня, не поборол.
Сделал через Tools запуск командного файла, а в нём консольной ST-LINK_CLI.exe.
Там можно явно указать что делать после прошивки.


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
VictorR
сообщение Jan 21 2017, 08:25
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 28-03-05
Пользователь №: 3 738



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


А можно сделать так, чтобы IAR с проектом на одном компьютере, а ST-LINK с контроллером на другом и связывается с первым по RDP ?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 21 2017, 08:50
Сообщение #15


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 29th July 2025 - 05:34
Рейтинг@Mail.ru


Страница сгенерированна за 0.01475 секунд с 7
ELECTRONIX ©2004-2016