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

 
 
 
Reply to this topicStart new topic
> Висяк=Прерывыние+STM32, STM32 просто уходит в космос
drapoz
сообщение Feb 24 2013, 21:47
Сообщение #1





Группа: Участник
Сообщений: 13
Регистрация: 21-02-13
Из: Полтава
Пользователь №: 75 738



Привет народ нуждаюсь в вашей помощи, проблема с прерываниями на stm32 . Суть проблемы в следующем, когда осуществляться прерывание будь то RXNE или по нажатию кнопочки то в отладчике ,а это IAR, код выбрасывает в BusFault_Handler и тут полный висяк. Подскажите в чем проблема где я делаю ошибку ? В настройках компилятора в StdPeriph_Lib или в самом коде. Програмирую в IAR с StdPeriph_Lib ,а код мой вот:
CODE
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_rcc.h"
int main() {
GPIO_InitTypeDef PORT;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC , ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN , ENABLE);
PORT.GPIO_Pin = (GPIO_Pin_9 | GPIO_Pin_8);
PORT.GPIO_Mode = GPIO_Mode_Out_PP;
PORT.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOC, &PORT);

AFIO->EXTICR[0]|=AFIO_EXTICR1_EXTI1_PB;
//Прерывания от нулевой и первой ноги разрешены
EXTI->IMR|=(EXTI_IMR_MR0 | EXTI_IMR_MR1);
//Прерывания на обоих ногах по нарастающему фронту
EXTI->RTSR|=(EXTI_RTSR_TR0 | EXTI_RTSR_TR1);
//Разрешаем оба прерывания
NVIC_EnableIRQ (EXTI0_IRQn);
NVIC_EnableIRQ (EXTI1_IRQn);
while(1)
{

}
}

void EXTI0_IRQHandler(void)
{
GPIOC->ODR^=GPIO_Pin_8;
EXTI->PR|=0x01;
}

void EXTI1_IRQHandler(void)
{
GPIOC->ODR^=GPIO_Pin_9;
EXTI->PR|=0x02;
}

Огромное спасибо.

Пардон народ разобрался тема снята и закрыта спасибо. Проблема была в настройках компилятора, не указал путь
$PROJ_DIR$\CM3\STM32F10x\startup\iar\. Все работает

Сообщение отредактировал IgorKossak - Feb 25 2013, 09:56
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
juvf
сообщение Feb 25 2013, 02:37
Сообщение #2


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

Группа: Свой
Сообщений: 1 261
Регистрация: 14-05-09
Из: Челябинск
Пользователь №: 49 045



Цитата(drapoz @ Feb 25 2013, 03:47) *
void EXTI0_IRQHandler(void)
{
GPIOC->ODR^=GPIO_Pin_8;
EXTI->PR|=0x01;
}


Недавно тоже писал отладчик прерывания EXTI0 и EXTI1. А почему такой сброс флага PR?

если в обработчике нужно сбросить ВСЕ прерывания по EXTI, то можно EXTI->PR = EXTI->PR;

а если нужно сбросить ТОЛЬКО прерывание EXTI0, то нужно EXTI->PR = 0x01;

Иначе вы рискуете потерять одно прерывание. Допустим пришло 2 прерывания, 1 и 0. PR стал равен 0х03. В сбрасываете регистр PR, кодом EXTI->PR|=0x01;.
эквивалент этого кода

EXTI->PR = EXTI->PR | 0x01;
или
EXTI->PR = 0х03 | 0x01;

т.е. произойдёт сброс битов 0 и 1. а код "0х03 | 0x01" даст 0х03, поэтому операция "|" бессмысленна.

Или я что-то не понимаю?
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 25 2013, 05:32
Сообщение #3


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(juvf @ Feb 25 2013, 06:37) *
поэтому операция "|" бессмысленна.
+1
Видя в конце обработчика строчку сброса запроса на прерывание, хочется сказать об отсутствии DSB барьера.
Без этого можно будет нарваться на повторный залёт того же прерывания....
Либо ставьте барьер, либо двигайте ближе к началу обработчика сброс запроса прерывания.


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 25 2013, 16:28
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



Цитата(demiurg_spb @ Feb 25 2013, 09:32) *
+1
Видя в конце обработчика строчку сброса запроса на прерывание, хочется сказать об отсутствии DSB барьера.
Без этого можно будет нарваться на повторный залёт того же прерывания....
Либо ставьте барьер, либо двигайте ближе к началу обработчика сброс запроса прерывания.


можно чуть подробнее про этот барьер и что он делает?

и как повторно влететь в прерывание если в прерывании они обычно запрещены?
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Feb 25 2013, 17:02
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Golikov A. @ Feb 25 2013, 18:28) *
можно чуть подробнее про этот барьер и что он делает?


Цитата
DSB acts as a special data synchronization memory barrier. Instructions that come after the DSB, in
program order, do not execute until the DSB instruction completes. The DSB instruction completes when
all explicit memory accesses before it complete.


Цитата(Golikov A. @ Feb 25 2013, 18:28) *
и как повторно влететь в прерывание если в прерывании они обычно запрещены?

Повторный вход может произойти после выхода из прерывания - одно и то же событие будет обработано два раза.
И почему прерывания запрещены? Контроллер прерываний может обрабатывать вложенные прерывания.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Feb 25 2013, 18:15
Сообщение #6


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(Golikov A. @ Feb 25 2013, 20:28) *
можно чуть подробнее про этот барьер и что он делает?
и как повторно влететь в прерывание если в прерывании они обычно запрещены?
Даже если и запрещены. Выходите из обработчика, а на шине данных ещё не прошла зачистка бита в ОЗУ....
Нынче из-за такой сложной шинной архитектуры, кешей, акселераторов флеша, DMA и прочих полезностей можно наблюдать "чудеса".


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Golikov A.
сообщение Feb 26 2013, 03:08
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454



понятно...
Go to the top of the page
 
+Quote Post

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

 


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


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