Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: stm32f4 зависание при внешнем прерывании
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Камиль
stm32f407igt6
Пытаюсь внешнее прерывание с ножки. Но почему-то при попытке обработать прерывание контроллер зависает. При попытке отследить этот момент в отладчике, программа уходит не пойми куда.
Вот код.
main.c
Код
/* Includes */
#include "stm32f4xx.h"
#include "test.h"

int main( void ) {
    test_init ();
    EXTI_GenerateSWInterrupt(EXTI_Line3);
    while(1) {
;
    }
}

test.h
Код
#ifndef H_TEST
#define H_TEST

#include "stm32f4xx_exti.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_syscfg.h"


void test_init(void);

#endif


test.c

CODE
#include "test.h"
#include "stm32f4xx_syscfg.h"
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_exti.h"

EXTI_InitTypeDef EXTI_InitStructure;

void test_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;

/* Enable GPIOG clock */
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOG, ENABLE);
/* Enable SYSCFG clock */
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

/* Configure PA0 pin as input floating */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3;
GPIO_Init(GPIOG, &GPIO_InitStructure);

/* Connect EXTI Line3 to PG3 pin */
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOG, EXTI_PinSource3);

/* Configure EXTI Line3 */
EXTI_InitStructure.EXTI_Line = EXTI_Line3;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);

/* Enable and set EXTI Line3 Interrupt to the lowest priority */
NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}

void EXTI3_IRQHandler(void)
{
if(EXTI_GetITStatus(EXTI_Line3) != RESET)
{
/* Clear the EXTI line 3 pending bit */
EXTI_ClearITPendingBit(EXTI_Line3);
}
}


После EXTI_GenerateSWInterrupt(EXTI_Line3) программа виснет.
Если в обработчике EXTI3_IRQHandler попробовать зажечь светоид или отправить что-нибудь по usart светоид не загорится, сообщение не отправится.

Что я настроил не так?
adnega
Цитата(Камиль @ Oct 30 2013, 20:14) *
Что я настроил не так?

Как вариант Вы не разрешили генерацию пользовательских прерываний и проц уходит в исключение.
Камиль
А как её разрешить?
ViKo
У меня есть такие строчки.
Код
/* External Interrupt/event configuration */
  EXTI->EMR = EXTI_EMR_MR15;    // Event Mask on line 15
  EXTI->FTSR = EXTI_FTSR_TR15;    // Falling trigger event configuration bit of line 15
Камиль
Цитата(ViKo @ Oct 30 2013, 21:39) *
У меня есть такие строчки.
Код
/* External Interrupt/event configuration */
  EXTI->EMR = EXTI_EMR_MR15;    // Event Mask on line 15
  EXTI->FTSR = EXTI_FTSR_TR15;    // Falling trigger event configuration bit of line 15

EXTI_Init как раз так и делает.
А можете скинуть всю настройку внешнего прерывания, 100% рабочий вариант?
ViKo
Все не скину, оно разбросано. У меня по прерыванию работает АЦП. Еще есть (для GPIO свой макрос):
Код
  RCC->APB2ENR =            // 60 MHz
...
    RCC_APB2ENR_SYSCFGEN * 1 |
...;

/* Инициализировать GPIOG */
  GPIO_INIT(G,
...
    MD_IN, OT_OD, SP_02, PL_PU, AF_SYSTEM);    // PG15 - ITST_N (Start?)

/* Источник внешнего прерывания (события) EXTI15 - вывод PG15 */
  SYSCFG->EXTICR[3] = SYSCFG_EXTICR4_EXTI15_PG;    // PG[15] pin
Камиль
Понятно, так я уже делал.

Пойдём по другому пути. А может кто-то знает, как отследить, куда ушла программа, или какая ошибка возникла при этом?
adnega
Цитата(Камиль @ Oct 30 2013, 22:52) *
Пойдём по другому пути. А может кто-то знает, как отследить, куда ушла программа, или какая ошибка возникла при этом?

Сделайте обработчик HardHault.
И еще:
Цитата
By default,a user program cannot write to the NVIC; however, if it is necessary for a user program to write to this
register, the bit 1 (USERSETMPEND) of the NVIC Configuration Control register (0xE000ED14) can
be set to allow user access to the NVIC’s STIR.

хотя не факт, что Вы используете пользовательские привелегии.
demiurg_spb
Цитата(adnega @ Oct 31 2013, 02:21) *
Сделайте обработчик HardFault.

+1
Caruso
Вот мой вариант. Внешнее прерывание заведено на ножку F10.

CODE
#include "stm32f4xx_rcc.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_fsmc.h"
#include "stm32f4xx_exti.h"
#include "stm32f4xx_syscfg.h"


GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStruct;
NVIC_InitTypeDef NVIC_InitStruct;

int main() {
//------------------------------------------------------------------------//
//------------------------------------------------------------------------//

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;

GPIO_Init (GPIOF, &GPIO_InitStructure);

SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOF, EXTI_PinSource10);

EXTI_InitStruct.EXTI_Line = EXTI_Line10;
EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStruct.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStruct);

NVIC_InitStruct.NVIC_IRQChannel = EXTI15_10_IRQn;
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x00;
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x01;
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStruct);

while(1) {

}
}

void EXTI15_10_IRQHandler(void) {
if(EXTI_GetITStatus(EXTI_Line10) != RESET) {
// здесь обработка прерывания

/* Clear the EXTI line 0 pending bit */
EXTI_ClearITPendingBit(EXTI_Line10);
}
}
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.