STM32F4 + прерывания

Кто любит RISC в жизни, заходим, не стесняемся.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

STM32F4 + прерывания

Сообщение osievskiy »

Доброго времени суток!
Пытаюсь настроить прерывания на порт H (pin0). По примеру отсюда сделал так

Код: Выделить всё

int main(void)
{
	SystemInit();

	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOH, 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_PriorityGroupConfig(NVIC_PriorityGroup_0);
	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;
	NVIC_Init(&NVIC_InitStructure);


}


void EXTI0_IRQHandler(void){
	i++;
}
Компилирую.Заливаю. Проверяю, но контроллер зависает на NVIC_Init(&NVIC_InitStructure); и не дышит. Уже весь гугл облазил, но не нашел ответа на вопрос почему и как все таки сделать что бы работало. Прошу помощи! Спасибо!
Реклама
k000858
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб июн 14, 2008 11:51:50

Re: STM32F4 + прерывания

Сообщение k000858 »

первое, что бросается в глаза:
- не затактирован порт GPIO
- не затактирован SYSCFG
- не проинициализирован порт GPIO
Реклама
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

в начале Main
стоит еще вот так

Код: Выделить всё

SystemInit();


	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);   // разрешаем тактирование порта H
	GPIO_InitTypeDef gpio_b;   /// структура для инициализации кнопки
	GPIO_StructInit(&gpio_b);  // заполняем структуру стандартными параметрами
	gpio_b.GPIO_Mode = GPIO_Mode_IN;   // это кнопка - порт работает как вход
	gpio_b.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOH, &gpio_b);   // инициализируем порт H
k000858
Открыл глаза
Сообщения: 44
Зарегистрирован: Сб июн 14, 2008 11:51:50

Re: STM32F4 + прерывания

Сообщение k000858 »

добавте после тактирования порта RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Спасибо! Попробую!
Реклама
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F4 + прерывания

Сообщение Galizin »

osievskiy писал(а):контроллер зависает на NVIC_Init(&NVIC_InitStructure)
в обработчик добавить

Код: Выделить всё

EXTI->PR  |=  1;
???
Реклама
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Сделал как вы написали! Теперь не зависает

Код: Выделить всё

void EXTI0_IRQHandler(void){

	i2++;
	myLCD.printNumI(i2, 10, 10, 0);
	EXTI_ClearITPendingBit(EXTI_Line0);
}


int main(void)
{
	i=0;
	i2=0;
	SystemInit();


	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOH, ENABLE);   // разрешаем тактирование порта A
	GPIO_InitTypeDef gpio_b;   /// структура для инициализации кнопки
	GPIO_StructInit(&gpio_b);  // заполняем структуру стандартными параметрами
	gpio_b.GPIO_Mode = GPIO_Mode_IN;   // это кнопка - порт работает как вход
	gpio_b.GPIO_Pin = GPIO_Pin_0;
	GPIO_Init(GPIOH, &gpio_b);   // инициализируем порт А

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE); // тактирование SYSCFG
	SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOH, 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_PriorityGroupConfig(NVIC_PriorityGroup_0);
	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;
	NVIC_Init(&NVIC_InitStructure);
	EXTI_ClearITPendingBit(EXTI_Line0);


	//Инициализация спидометра
	//myOdometr.ODOMETER_INIT();

	/* Инициализация дисплея*/
	//vTaskDelay(1000);
	myLCD.init();  //init TFT library
	myLCD.clrScr(); //Очищаем экран
	myLCD.setColor(GREEN); //Выбираем
	myLCD.setBgColor(BLACK);
	myLCD.setFont(BigFont);


	myLCD.print("starsb", 10, 10, 0);

}
Функция myLCD.print("starsb", 10, 10, 0); срабатывает!
Обработчик не работает! Я полагаю что при подаче на порт H вывод 0 +5 Обработчик должен срабатывать, но это не происходит.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Как можно решить эту проблему? Что я не так делаю?
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

или у кого то есть реализация счетчика?
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F4 + прерывания

Сообщение Galizin »

osievskiy писал(а):Функция myLCD.print("starsb", 10, 10, 0); срабатывает!
Вроде код линейный.Никаких зависимостей от счетчика не видно. Вот и срабатывает.
Попробуйте в конце main
while(1)
myLCD.printNumI(i2, 10, 10, 0);
i2 попробуйте объявить как volatile
Вызов функции убрать из обработчика
Последний раз редактировалось Galizin Пн июн 24, 2013 11:30:49, всего редактировалось 1 раз.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Так оно и должно срабатывать.. Дело в том что не срабатывает

Код: Выделить всё

void EXTI0_IRQHandler(void){

   i2++;
   myLCD.printNumI(i2, 10, 10, 0);
   EXTI_ClearITPendingBit(EXTI_Line0);
}
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F4 + прерывания

Сообщение Galizin »

Попробуйте позадавать себе вопросы типа таких.
1. Где находится основной цикл при вызове прерывания? А что делает код после того как main кончиться?
2. Что будет если в одну последовательность байт (бит) к дисплею будет вставлена другая? Почему это может случиться в Вашем коде?

Для начала нужно ответить на эти вопросы, потом соответствующим образом исправить код.

Потом нужно ходить отладчиком по коду, смотреть как изменяются битики, сверять их с тем, как они должны изменяться согласно документации. Если обнаружите разницу, то выяснить почему она случилась, а потом придумать как это исправить. Не обижайтесь, пожалуйста, но эти операции нужно сделать либо Вам, либо тому, кто Вам поможет. С придумыванием как исправить, могут помочь в форуме. Но для этого нужно описать какие битики как меняются и как должны меняться по вашему мнению.

Другой путь - взять готовый работающий пример. Запустить его. Убедиться ,что работает как ожидалось. Потом изменить в нем чуть чуть, то что считаете нужным. Убедиться, что изменение работает. Потом добавить еще чуть чуть кода, И так далее до конечного результата. Если на каким то этапе Ваш код делает программу неработоспособной, то нужно опять думать, что он делает такого, что все разваливается.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Galizin писал(а):Попробуйте позадавать себе вопросы типа таких.
1. Где находится основной цикл при вызове прерывания? А что делает код после того как main кончиться?
2. Что будет если в одну последовательность байт (бит) к дисплею будет вставлена другая? Почему это может случиться в Вашем коде?

Для начала нужно ответить на эти вопросы, потом соответствующим образом исправить код.

Потом нужно ходить отладчиком по коду, смотреть как изменяются битики, сверять их с тем, как они должны изменяться согласно документации. Если обнаружите разницу, то выяснить почему она случилась, а потом придумать как это исправить. Не обижайтесь, пожалуйста, но эти операции нужно сделать либо Вам, либо тому, кто Вам поможет. С придумыванием как исправить, могут помочь в форуме. Но для этого нужно описать какие битики как меняются и как должны меняться по вашему мнению.

Другой путь - взять готовый работающий пример. Запустить его. Убедиться ,что работает как ожидалось. Потом изменить в нем чуть чуть, то что считаете нужным. Убедиться, что изменение работает. Потом добавить еще чуть чуть кода, И так далее до конечного результата. Если на каким то этапе Ваш код делает программу неработоспособной, то нужно опять думать, что он делает такого, что все разваливается.
Об обидах и речи не может идти, я же учусь.
По моему порт дисплея никак не относится к порту прерывания. TFT то работает!
Сколько я не искал готовых решений я не нашел работающего! По этому и написал сюда! Если у кого то есть, хотя бы что бы светодиоды моргали от прерывания... не от таймера и не от проверки статуса кнопки... а именно от прерывания, прошу поделиться.
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F4 + прерывания

Сообщение Galizin »

Работающий пример вроде должен лежать в библиотеке в каталоге Project/Examples/EXTI. Это верно для F1 серии, наверняка то же самое и для F4 серии. Библиотека на ST.COM. Там же куча других примеров.

This example shows how to configure an external interrupt line.
In this example, an EXTI line is configured to generate an interrupt on each
falling edge. In the interrupt routine a led connected to a specific GPIO pin is
toggled.
This led will be toggled due to the softawre interrupt generated on the EXTI Lin
then at each falling edge.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Да там есть! Но там все сделано как и у меня. Ладно попробую и отпишусь, может заработает...
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

И так!
Беру пример отсюда длинная ссылка - появилась горизонтальная прокрутка окна

вставляю точ точ как там ииииии ... и ничего не работает ...
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: STM32F4 + прерывания

Сообщение ploop »

Уважаемый osievskiy, я уже правил ссылку в вашем первом сообщении. Попрошу научиться пользоваться тегами, которые доступны на форуме (в частности для оформления ссылок), дабы не доставлять неудобств другим пользователям.
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Хорошо. Извиняюсь. Но мне кто то сможет помочь в этом вопросе? Может у меня с контролером что то не то? Попробовал отладку но запуская ST-LINK_gdbserver.bat получаю Error in Initializing ST-Link device
Уже и Reset держал и что только не пробовал!
Galizin
Мучитель микросхем
Сообщения: 477
Зарегистрирован: Ср окт 15, 2008 09:33:03
Откуда: Воронеж

Re: STM32F4 + прерывания

Сообщение Galizin »

Поставьте keil. Там до 32к можно бесплатно компилировать и отлаживать.
Как я понимаю на дисплее он что то писал. Так что неисправность железа маловероятна.
Вот о gcc я тут писал. Может поможет
Аватара пользователя
osievskiy
Открыл глаза
Сообщения: 79
Зарегистрирован: Вт июн 18, 2013 11:23:25

Re: STM32F4 + прерывания

Сообщение osievskiy »

Мне 32k будет маловато, планирую FREERTOS дабы использовать многозадачность. Хотя в принципе для решения конкретной ситуации может и поможет
Ответить

Вернуться в «ARM»