Страница 1 из 2
STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 02:55:02
sx386
Пытаюсь запрограммировать прерывание на ноге PA0
Прерывание как бы срабатывает, но походу "зависает" на переходе в функцию прерывания.
Насколько я понял необходимо установить вектор прерывания.
Но не могу понять как.
Вот так инициализирую:
Код: Выделить всё
void EXTILine0_Config(void) {
//***********GPIOA**************
RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN;
// GPIOA->MODER =0x0; //Input (reset state)
GPIOA->OSPEEDR =0xFF; //100 MHz
//***********EXTI***************
SYSCFG->EXTICR[1] = 0x0; //перые 4 ноги для прерываний, порта А
EXTI->IMR |=(EXTI_IMR_MR0); //разрешаем прерывание для нулевой ноги EXTI_IMR_MR0=1
EXTI->RTSR |=(EXTI_RTSR_TR0); //прерывания по спаду
//************NVIC**************
// NVIC->ISER[0] |=(1<<6); //6 settable EXTI0 Line0 interrupt
// NVIC->IP[1] =0xF000; //установка приоритета 15 для 6-й Position
NVIC_EnableIRQ(EXTI0_IRQn);
NVIC_SetPriority(EXTI0_IRQn,1);
}
/* прерывание */
void EXTI0_IRQHandler (void) {
EXTI->PR = EXTI_PR_PR0; // Сбросить флаг
}

Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 06:12:18
balmer
А стек можно показать? Возможно проблема совсем в другом месте.
Объявления функции с правильным названием достаточно для того, чтобы она стала прерыванием.
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 11:54:55
misyachniy
balmer писал(а):Объявления функции с правильным названием достаточно для того, чтобы она стала прерыванием.
Не всегда, не известно какой компилятор.
Для Атмел в IAR требуется вызвать фукцию которая пропишет адрес преривания в таблицу векторов, для Luminary/TI, нужно вручную прописать вектора в структуру описывающую VIC.
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 12:56:57
Myp3ik
Код: Выделить всё
void InitEXTI(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_DeInit(GPIOA);
GPIO_StructInit(&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
SYSCFG_DeInit();
SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA, EXTI_PinSource0);
EXTI_StructInit(&EXTI_InitStructure);
EXTI_InitStructure.EXTI_Line = EXTI_Line0;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStructure.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 4;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/**
* @brief обработчик внешних прерываний
* @param None
* @retval None
*/
void EXTI0_IRQHandler(void)
{
if (EXTI_GetITStatus(EXTI_Line0))
{
EXTI_ClearITPendingBit(EXTI_Line0);
}
}
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 15:28:05
sx386
Myp3ik, код такого формата у меня не работает.
Error[Pe020]: identifier "RCC_AHBPeriph_GPIOA" is undefined C:\Ecom\i330lcd\Project\main.cpp 126
Да и честно говоря, не хотелось бы его использовать. Ужасно не нравится мне этот формат. Переименованные регистры - ужас....сейчас начну ругаться....бесит жутко.
balmer, вот стэк:

Была такая-же проблема с stm32f100, но решил подключением файла векторов startup_stm32f10x_md_vl.s
Для stm32f407 такого файла найти не могу
IAR 6.30
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 18, 2013 17:18:46
Myp3ik
В папке (у Вас может отличаться путь, если версия 6,3 и виндовс не х64)
c:\Program Files (x86)\IAR Systems\Embedded Workbench 6.5\arm\examples\ST\STM32F4xx\STM32F4xx_DSP_StdPeriph_Lib\Libraries\CMSIS\Device\ST\STM32F4xx\Source\Templates\iar\
А еще лучше скачайте с оф сайта библиотеку под Ваш МК, там есть все необходимое
http://www.st.com/st-web-ui/static/active/en/st_prod_software_internet/resource/technical/software/firmware/stm32f4_dsp_stdperiph_lib.zip
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Пн авг 19, 2013 13:52:55
sx386
Да что терерь компилятору нужно ?

Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Пн авг 19, 2013 21:05:12
sx386
И что мне теперь делать ?
Пойду вешаться.

Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вт авг 20, 2013 19:39:17
ut1wpr
sx386 писал(а):И что мне теперь делать ?
Пойду вешаться.

Следовать завещаниям ВИЛ.
Вам подсказали, что делать, вы этот путь забраковали.
Да и честно говоря, не хотелось бы его использовать. Ужасно не нравится мне этот формат. Переименованные регистры - ужас....сейчас начну ругаться....бесит жутко.
Вы как хотели? Чтобы все было именно так, как вы можете это воспринять, или как вам удобнее воспринимать?
Если вы останетесь при своих убеждениях, то хозяйственный магазин вам поможет...

Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вт авг 20, 2013 20:36:15
sx386
CMSIS я подключил ! Не работает !
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вт авг 20, 2013 21:55:46
ut1wpr
sx386 писал(а):CMSIS я подключил ! Не работает !
Спойлер
Код: Выделить всё
Example Description
This example shows how to configure external interrupt lines.
In this example, 2 EXTI lines (EXTI Line0 and Line15) are configured to generate
an interrupt on each rising and falling edge, respectively.
In the interrupt routine a led connected to a specific GPIO pin is toggled.
In this example:
- EXTI Line0 is connected to PA0 pin
- EXTI Line15 is connected to PG15 pin
After EXTI configuration, a software interrupt is generated on the EXTI0 toggles LED1.
After that:
- when falling edge is detected on EXTI Line0, LED1 toggles
- when falling edge is detected on EXTI Line15, LED2 toggles
On STM324xG-EVAL/STM32437I-EVAL:
- EXTI Line0 is connected to Wakeup push-button
- EXTI Line15 is connected to Key push-button
@note In this example, EXTILine15_Config() function can be substituted by
STM_EVAL_PBInit(Button_KEY, Mode_EXTI) provided in the STM324xG-EVAL/
STM32437I-EVAL driver.
@par Directory contents
- EXTI/EXTI_Example/stm32f4xx_conf.h Library Configuration file
- EXTI/EXTI_Example/stm32f4xx_it.h Interrupt handlers header file
- EXTI/EXTI_Example/stm32f4xx_it.c Interrupt handlers
- EXTI/EXTI_Example/main.h Header for main.c module
- EXTI/EXTI_Example/main.c Main program
- EXTI/EXTI_Example/system_stm32f4xx.c STM32F4xx system source file
@note The "system_stm32f4xx.c" is generated by an automatic clock configuration
tool and can be easily customized to your own configuration.
To select different clock setup, use the "STM32F4xx_Clock_Configuration_V1.1.0.xls"
provided with the AN3988 package available on <a href="http://www.st.com/internet/mcu/family/141.jsp"> ST Microcontrollers
Последний раз советую библиотеки. Абсолютно не больно и не страшно.

Скомпилируйте, пошагайте по либе, разберитесь, сведите все к минимально-необходимому.
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вт авг 20, 2013 22:45:38
sx386
Последний раз советую библиотеки.
Это звучит как угроза !
Я ж говорю подключил библиотеки. Они не работают !
Код: Выделить всё
$PROJ_DIR$\StdPeriph\inc\
$PROJ_DIR$\StdPeriph\src\
$PROJ_DIR$\CMSIS\Include\
$PROJ_DIR$\CMSIS\Device\ST\STM32F4xx\Include\
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вт авг 20, 2013 23:00:01
Myp3ik
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Ср авг 21, 2013 08:22:35
ut1wpr
sx386 писал(а):Последний раз советую библиотеки.
Это звучит как угроза !
Я ж говорю подключил библиотеки. Они не работают !
Код: Выделить всё
$PROJ_DIR$\StdPeriph\inc\
$PROJ_DIR$\StdPeriph\src\
$PROJ_DIR$\CMSIS\Include\
$PROJ_DIR$\CMSIS\Device\ST\STM32F4xx\Include\
Это я сам себе говорил.. Наверное, все-таки предпоследний раз было.
Как-то странно вы двигатесь. Начните от печки.
1. Создайте собственный проект. С пустым main(). Добейтесь безошибочно компиляции.
2. В главной программе сделайте собственный ногодрыг. Без библиотек. Проверьте в работе. Осциллографом проверьте.
3. Подключите минимальную библиотеку, только те модули, которые нужны для ногодрыга и клокирования. Добейтесь компиляции и работы.
И только тогда переходите к прерываниям.
А то, что вы написали, никак не тянет на подключение библиотек. Это лишь сообщения компилятору путей поиска. А модули библиотеки в рабочий проект еще включать надо.
Пройдя начальные пункты моей рекомендации, вы уясните (немного) организацию и взаимодействие файлов и модулей проекта.
Хватать довольно сложный к пониманию проект в качестве стартапа - моветон. Нифига не въедете сходу..

На этот раз последний. Я не умею учить. Выдохся.
(Научить нельзя, можно лишь научится.)
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Сб авг 24, 2013 18:59:00
dosikus
sx386 писал(а):Я ж говорю подключил библиотеки. Они не работают !
Код: Выделить всё
$PROJ_DIR$\StdPeriph\inc\
$PROJ_DIR$\StdPeriph\src\
$PROJ_DIR$\CMSIS\Include\
$PROJ_DIR$\CMSIS\Device\ST\STM32F4xx\Include\
CMSIS в IAR подключаются установкой галки в опциях проекта, соответственно иметь дубли в папке проекта - на нужно.
Ваша долбанная SPL, подключается не просто вписыванием хэдеров но и подключением исходников и редактированием хэдера stm32f4xx_conf.h
А так все нормально, сразу видны последствия CVAVR и AVR вообще - пациент не осознает парадигму ...
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 25, 2013 20:49:11
ut1wpr
dosikus писал(а): А так все нормально, сразу видны последствия CVAVR и AVR вообще - пациент не осознает парадигму ...
Ага. Это лечится, но долго и больно. Особенно первое. Оно хуже язвы въедается..

Иногда лечению не поддается.

Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс авг 25, 2013 23:22:47
bishop-strip
1. ВОзмонжо у вас не добавлены файлы system_stm32f4xx.c и startup_stm32f40x.s
2. необходимо настроить ножки на прерывания:
Спойлер
/* Включаем порт А */
RCC_APB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &GPIO_InitStructure);
SYSCFG_EXTILineConfig((uint8_t)GPIOA, EXTI_PinSource0);
EXTI_InitTypeDef EXTI_InitStucture;
EXTI_InitStucture.EXTI_Line = EXTI_Line0;
EXTI_InitStucture.EXTI_Mode = EXTI_Mode_Interrupt;
EXTI_InitStucture.EXTI_Trigger = EXTI_Trigger_Rising;
EXTI_InitStucture.EXTI_LineCmd = ENABLE;
EXTI_Init(&EXTI_InitStucture);
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
EXTI_ClearITPendingBit(EXTI_Line0);
NVIC_EnableIRQ(EXTI0_IRQn);
и соответственнно определить обработчик прерывания:
void EXTI0_IRQHandler()
{
//...код...
EXTI_ClearITPendingBit(EXTI_Line0);
}
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс сен 01, 2013 17:40:48
sx386
Долго мучался.
Так и не заработало.
В итоге установил KEIL
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Вс сен 01, 2013 19:13:30
Myp3ik
А в кеиле заработало ?
Re: STM32F4DISCOVERY вектор прерывания
Добавлено: Пн сен 02, 2013 08:58:22
sx386
Да, в кейле всё сразу зарустилось.