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

 
 
> stm32f4 зависание при внешнем прерывании
Камиль
сообщение Oct 30 2013, 16:14
Сообщение #1





Группа: Новичок
Сообщений: 5
Регистрация: 5-03-13
Пользователь №: 75 908



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 светоид не загорится, сообщение не отправится.

Что я настроил не так?

Сообщение отредактировал IgorKossak - Oct 31 2013, 19:20
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 9)
adnega
сообщение Oct 30 2013, 16:43
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



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

Как вариант Вы не разрешили генерацию пользовательских прерываний и проц уходит в исключение.
Go to the top of the page
 
+Quote Post
Камиль
сообщение Oct 30 2013, 16:53
Сообщение #3





Группа: Новичок
Сообщений: 5
Регистрация: 5-03-13
Пользователь №: 75 908



А как её разрешить?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 30 2013, 17:39
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



У меня есть такие строчки.
Код
/* 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
Go to the top of the page
 
+Quote Post
Камиль
сообщение Oct 30 2013, 18:02
Сообщение #5





Группа: Новичок
Сообщений: 5
Регистрация: 5-03-13
Пользователь №: 75 908



Цитата(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% рабочий вариант?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Oct 30 2013, 18:18
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Все не скину, оно разбросано. У меня по прерыванию работает АЦП. Еще есть (для 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
Go to the top of the page
 
+Quote Post
Камиль
сообщение Oct 30 2013, 18:52
Сообщение #7





Группа: Новичок
Сообщений: 5
Регистрация: 5-03-13
Пользователь №: 75 908



Понятно, так я уже делал.

Пойдём по другому пути. А может кто-то знает, как отследить, куда ушла программа, или какая ошибка возникла при этом?

Сообщение отредактировал IgorKossak - Oct 31 2013, 19:21
Причина редактирования: избыточное цитирование
Go to the top of the page
 
+Quote Post
adnega
сообщение Oct 30 2013, 22:21
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 724
Регистрация: 14-05-07
Из: Ярославль, Россия
Пользователь №: 27 702



Цитата(Камиль @ 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.

хотя не факт, что Вы используете пользовательские привелегии.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Oct 31 2013, 05:32
Сообщение #9


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

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



Цитата(adnega @ Oct 31 2013, 02:21) *
Сделайте обработчик HardFault.

+1


--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post
Caruso
сообщение Oct 31 2013, 05:53
Сообщение #10


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

Группа: Участник
Сообщений: 88
Регистрация: 15-12-09
Пользователь №: 54 266



Вот мой вариант. Внешнее прерывание заведено на ножку 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);
}
}


Сообщение отредактировал IgorKossak - Oct 31 2013, 19:22
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!!!
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 21st July 2025 - 13:16
Рейтинг@Mail.ru


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