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

 
 
> Висяк=Прерывыние+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
 
Start new topic
Ответов
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
demiurg_spb
сообщение Feb 25 2013, 18:15
Сообщение #5


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

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



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


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 23rd August 2025 - 18:24
Рейтинг@Mail.ru


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