0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 124
1

Внешние прерывания STM32F407

10.02.2016, 12:41. Показов 7561. Ответов 18
Метки нет (Все метки)

Добрый день!
Вообщем только начал разбираться с STM32F407 discovery.
Светодиодом помаргал, кнопку понажимал. Все работает!
Добрался до внешних прерываний и застрял:
Код
#include "stm32f4xx.h"
#include "stm32f4xx_gpio.h"
#include "stm32f4xx_rcc.h"

// Обработчик прерывания EXTI0
void EXTI0_IRQHomdler(void)
{
GPIOD->ODR^=GPIO_Pin_13; //Инвертируем состояние светодиода
EXTI->PR|=0x01; //Очищаем флаг
}

int main(void)
{
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE);
GPIO_InitTypeDef gpioConf;
gpioConf.GPIO_Pin=GPIO_Pin_13;
gpioConf.GPIO_Mode=GPIO_Mode_OUT;
gpioConf.GPIO_Speed=GPIO_Speed_100MHz;
gpioConf.GPIO_OType=GPIO_OType_PP;
gpioConf.GPIO_PuPd=GPIO_PuPd_NOPULL;
GPIO_Init(GPIOD, &gpioConf);

RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
GPIO_InitTypeDef gpioConf1;
gpioConf1.GPIO_Pin =GPIO_Pin_0;
gpioConf1.GPIO_Mode = GPIO_Mode_IN;
GPIO_Init(GPIOA, &gpioConf1);

RCC->APB2ENR|=RCC_APB2ENR_SYSCFGEN;
SYSCFG->EXTICR[0]|=SYSCFG_EXTICR1_EXTI0_PA;
EXTI->IMR|=EXTI_IMR_MR0;    //разрешаем прерывание по нулевой ноге
EXTI->RTSR|=(EXTI_RTSR_TR0);   //Прерывания по нарастающему фронту
EXTI->FTSR&=~(EXTI_FTSR_TR0);   //Отключаем прерывание по спадающему фронту

NVIC_SetPriority(EXTI0_IRQn,5);
NVIC_EnableIRQ(EXTI0_IRQn);

while(1)
{
}
}
Подскажите что не так!

В добавок после того как я все перепробывал у меня появились еще вопросы! Я ни где не задавал частоту работы шины APB2 и других тоже!
1. Тактирование задается по умолчанию или мне обязательно надо задавать самому?
2. Если я записал свою прошивку в STM32F407discovery настройки тактирования остались прежними?
3. Посмотрел STM32CubeMX вроде бы все просто - выставляешь нужные частоты и делители получаешь нужное тактирование и думаешь, а сколько должно быть тактирование той или иной перефирии ( ну не считая пока SPI и I2C, там опиратся буду от нужной скорости обмена данными)?
4. Если я в STM32CubeMX настроил тактирования, куда мне вставлять сгенерированый код?

До этого работал с AVR, там как то было попроще!
P.S. Работаю в Coosox 1.7.8.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.02.2016, 12:41
Ответы с готовыми решениями:

Внешние прерывания
Доброе время суток! Подскажите пожалуйста как настроить внешнее прерывание на еще одном порте. Я...

Внешние прерывания
Кто-нить вкурсе есть ли у СТМов флаги внешних прерываний портов, а если есть то где их найти? А то...

Внешние прерывания
Присобачил к STMf100 ENC28J60, пакеты принимает/отправляет) Решил забирать пакеты по прерыванию по...

Внешние прерывания STM32
Здравствуйте, уважаемые форумчане. Разбираюсь я нынче в прерываниях и их приоритетах. Так вот...

18
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
10.02.2016, 13:04 2
http://mykrosontroller.bplosid.net/word ... age_id=744
полезный сайт)) 100 примеров, с описанием, проверенные автором. Проекты в кокосе.

http://mykrosontroller.bplosid.net/word ... ge_id=1187 (вот именное внешние прерывания)
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 124
10.02.2016, 13:30 3
http://mykrosontroller.bplosid.net/word ... ge_id=1187 (вот именное внешние прерывания)
Мне как начинающему только рабоать с STM32, важно разобраться как настраивать его на уровне регистор, а не предоставленых библиотек! Вот я и пытаюсь! И немогу понять где я ошибась!
0
0 / 0 / 0
Регистрация: 24.11.2013
Сообщений: 195
10.02.2016, 14:05 4
Так можно в примере посмотреть какие регистры и как записывались.
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
10.02.2016, 14:30 5
Цитата Сообщение от MorkTwys
1. Тактирование задается по умолчанию или мне обязательно надо задавать самому?
2. Если я записал свою прошивку в STM32F407discovery настройки тактирования остались прежними?
3. Посмотрел STM32CubeMX вроде бы все просто - выставляешь нужные частоты и делители получаешь нужное тактирование и думаешь, а сколько должно быть тактирование той или иной перефирии ( ну не считая пока SPI и I2C, там опиратся буду от нужной скорости обмена данными)?
4. Если я в STM32CubeMX настроил тактирования, куда мне вставлять сгенерированый код?

До этого работал с AVR, там как то было попроще!
P.S. Работаю в Coosox 1.7.8.
Судя по этим вопросам,Вам нужно разобраться с самыми общими вопросами.
AVR-здесь вспоминать не надо,могут "наехать",а вот имеющиеся знания,по возможности использовать.
Вы помигали диодом,но это не достижение,если не разобрали тот код,а ведь там тактирование настраивалось.
Прошивка полностью заменяет программу в которой устанавливаются делители.Если ничего не делать,процессор будет работать на частоте HSI без умножения PLL.
Логично использовать процессор на максимальной частоте,если только не хочешь снизить потребление и шум и если скорость не нужна(а она нужна).Ну и если частота низкая,легче сигналы на выходе смотреть древним осциллографом.
КУБ генерит не просто код,а проект,со всей структурой папок.Жалко,что в кокосе,что то надо доделывать.А КЕЙЛ и ИАР-открывают проект и можно компилить.Только там действа нет,даже мигание-надо дописать.Но настройка правильная.
0
StuK
10.02.2016, 14:31 6
А где вы настраиваете впринципе тактирование ядра?
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
10.02.2016, 14:43 7
Цитата Сообщение от StuK
А где вы настраиваете впринципе тактирование ядра?
Если вопрос к ТС,он написал,что не настраивал.Если ко мне,в КУБЕ есть отдельная функция с графикой,где можно выбрать частоты и внешнее-внутреннее тактирование.КУБ-генерит проект,где прямо в main.c суёт функцию
void SystemClock_Config(void),где всё и настраивается.
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 124
10.02.2016, 14:46 8
Код
А где вы настраиваете впринципе тактирование ядра?
Это ж один из вопрос: где и как правильно настраивать тактирование данного мк и его перефирии?
0
0 / 0 / 0
Регистрация: 22.07.2015
Сообщений: 658
10.02.2016, 14:47 9
Цитата Сообщение от MorkTwys
Код:
А где вы настраиваете впринципе тактирование ядра?
Это ж один из вопрос: где и как правильно настраивать тактирование данного мк и его перефирии?
Насчёт правильно,это пока не ко мне.
0
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.02.2016, 15:31 10
Цитата Сообщение от MorkTwys
1. Тактирование задается по умолчанию или мне обязательно надо задавать самому?
Если не задавать самому, то работает то, что по умолчанию (от внутреннего RC-генератора, см.ReferenceManual).
Цитата Сообщение от MorkTwys
2. Если я записал свою прошивку в STM32F407discovery настройки тактирования остались прежними?
Если прошивка ничего с тактированием не делает, то по ресету запустится тактирование по умолчанию (см.предыдущий ответ), и программа будет работать на нём.
Цитата Сообщение от MorkTwys
3. Посмотрел STM32CubeMX вроде бы все просто - выставляешь нужные частоты и делители получаешь нужное тактирование и думаешь, а сколько должно быть тактирование той или иной перефирии ( ну не считая пока SPI и I2C, там опиратся буду от нужной скорости обмена данными)?
ReferenceManual на свой чип F40x. Должен быть настольной книгой, пока не освоитесь.
Цитата Сообщение от MorkTwys
4. Если я в STM32CubeMX настроил тактирования, куда мне вставлять сгенерированый код?
Куб генерирует готовый проект-шаблон. В нём уже все выбранные при конфигурировании части вставлены куда надо. Остаётся только нажать кнопочки компиляции и прошивки в IDE.
0
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
10.02.2016, 15:35 11
Цитата Сообщение от MorkTwys
Код:
А где вы настраиваете впринципе тактирование ядра?
Это ж один из вопрос: где и как правильно настраивать тактирование данного мк и его перефирии?

По первости можно экселовским скриптом из Clock confikurotion tool http://www.st.com/web/catalog/tools/FM1 ... 3/PF257927
А так ты можешь и не увидеть свой светодиод - из за дребезга контактов.
Поставь бряк на прерывание и убедись что попадаешь в него.

Здесь рабочее , настройки SYSCFG пропущены - ибо EXTI и так PA0 по дефолту.

Код
void EXTI0_IRQHomdler (void)
{
EXTI->PR |=EXTI_PR_PR0;
GPIOD->BSRR = GPIO_BSRR_BS_13;
//GPIOD->ODR^=GPIO_ODR_ODR_13;
// EXTI->PR |=EXTI_PR_PR0;

}

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |RCC_AHB1ENR_GPIODIM;
GPIOD->MODER &=~(GPIO_MODER_MODER13 );
GPIOD->MODER |=GPIO_MODER_MODER13_0 ;

GPIOA->MODER &=~ (GPIO_MODER_MODER0 );
GPIOA->PUPDR&= ~(GPIO_PUPDR_PUPDR0 );

EXTI->IMR |= EXTI_IMR_MR0;
EXTI->RTSR|=(EXTI_RTSR_TR0);
EXTI->FTSR &=~(EXTI_FTSR_TR0);
NVIC_SetPriority(EXTI0_IRQn ,15);
NVIC_EnableIRQ(EXTI0_IRQn );
Удалено оскорбление других участников.
0
StuK
10.02.2016, 15:40 12
Читайте даташит и пишите на первое время руками, прямо с использованеим определений регистров и битов. Так быстрее разберетесь и будете лучше понимать. Сам недавно на STM32 перешел.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.02.2016, 16:01 13
Цитата Сообщение от StuK
Читайте даташит и
Не даташит, а мануал! В отличие от AVR, у стм32 это два разных документа.
0
StuK
10.02.2016, 16:31 14
В данном контексте слово "даташит" синоним слова "документация", не придирайтесь к словам.
1 / 1 / 0
Регистрация: 11.01.2013
Сообщений: 5,483
10.02.2016, 17:41 15
Цитата Сообщение от StuK
В данном контексте слово "даташит" синоним слова "документация", не придирайтесь к словам.
Да больно надо придираться. А вот ТС "усвистал" бы не по адресу и огрёб вопросов в сто раз больше, чем уже имел. :-)
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 124
11.02.2016, 01:01 16
Код
void EXTI0_IRQHomdler (void)
{
EXTI->PR |=EXTI_PR_PR0;
GPIOD->BSRR = GPIO_BSRR_BS_13;
//GPIOD->ODR^=GPIO_ODR_ODR_13;
// EXTI->PR |=EXTI_PR_PR0;

}

RCC->AHB1ENR |= RCC_AHB1ENR_GPIOAEN |RCC_AHB1ENR_GPIODIM;
GPIOD->MODER &=~(GPIO_MODER_MODER13 );
GPIOD->MODER |=GPIO_MODER_MODER13_0 ;

GPIOA->MODER &=~ (GPIO_MODER_MODER0 );
GPIOA->PUPDR&= ~(GPIO_PUPDR_PUPDR0 );

EXTI->IMR |= EXTI_IMR_MR0;
EXTI->RTSR|=(EXTI_RTSR_TR0);
EXTI->FTSR &=~(EXTI_FTSR_TR0);
NVIC_SetPriority(EXTI0_IRQn ,15);
NVIC_EnableIRQ(EXTI0_IRQn );
Спасибо dosykus_2 за рабочий код! Мой тоже оказался рабочий! Проблема в том, что я настроил свой проект Coosox, чтобы писать на С++, создал новый проект на С и все заработало! Теперь думаю или я не правильно настроил проект или в Сoosox плохо с полноценной поддержкой С++. Может кто поделится опытом или советом в этом направлении, а то к классам на С++ быстро привыкаешь.

Выкладывать код нужно с использованием тэгов [code].
0
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
11.02.2016, 09:35 17
С этого и надо было начинать.
В плюсах обработчик прерывания объявляется так
Код
extern  "C" void  EXTI0_IRQHomdler (void)
{
//
}
А вообще - так ли нужны плюсы???
0
0 / 0 / 0
Регистрация: 07.02.2016
Сообщений: 124
11.02.2016, 17:42 18
Код:
extern "C" void EXTI0_IRQHomdler (void)
{
//
}
Ок спасибо! Ну классы, довольно таки удобно! Перед тем как я начну писать мега программы на stm32 есть еще ньюансы при програмировании на с++ и с в Coosox?
0
1 / 1 / 0
Регистрация: 07.02.2106
Сообщений: 4,013
11.02.2016, 22:00 19
Наверняка есть, только они мне фиолетовы...
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.02.2016, 22:00
Помогаю со студенческими работами здесь

Внешние прерывания STM8L
Всем доброго дня! Столкнулся с чем-то непонятным работая с внешними прерываниями на...

Внешние прерывания STM8L
Доброе время суток. Разбираюсь сейчас с STM8L-Dyscovery. Пытаюсь повесить внешнее прерывание по...

Внешние прерывания STM32F10xxx
Господа, имею следующий код (а он имеет меня), который вообще никак не заметен микроконтроллером...

внешние прерывания на stm32discovery
Доброго времени суток. Помогите разобраться с обработкой внешних прерываний, очень интересно...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru