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

 
 
> 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
 
Start new topic
Ответов
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
VictorR
сообщение Jan 15 2017, 10:20
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 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
amiller
сообщение Jan 15 2017, 12:58
Сообщение #4


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

Группа: Участник
Сообщений: 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
Сообщение #5


Участник
*

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



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



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

 


RSS Текстовая версия Сейчас: 26th August 2025 - 07:46
Рейтинг@Mail.ru


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