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

 
 
> 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
Ответов
ViKo
сообщение Oct 30 2013, 18:18
Сообщение #2


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

Группа: Модераторы
Сообщений: 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
Сообщение #3





Группа: Новичок
Сообщений: 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
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 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



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

 


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


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