Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Висяк=Прерывыние+STM32
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
drapoz
Привет народ нуждаюсь в вашей помощи, проблема с прерываниями на 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\. Все работает
juvf
Цитата(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, поэтому операция "|" бессмысленна.

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


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

и как повторно влететь в прерывание если в прерывании они обычно запрещены?
_Артём_
Цитата(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) *
и как повторно влететь в прерывание если в прерывании они обычно запрещены?

Повторный вход может произойти после выхода из прерывания - одно и то же событие будет обработано два раза.
И почему прерывания запрещены? Контроллер прерываний может обрабатывать вложенные прерывания.
demiurg_spb
Цитата(Golikov A. @ Feb 25 2013, 20:28) *
можно чуть подробнее про этот барьер и что он делает?
и как повторно влететь в прерывание если в прерывании они обычно запрещены?
Даже если и запрещены. Выходите из обработчика, а на шине данных ещё не прошла зачистка бита в ОЗУ....
Нынче из-за такой сложной шинной архитектуры, кешей, акселераторов флеша, DMA и прочих полезностей можно наблюдать "чудеса".
Golikov A.
понятно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.