Перейти к содержанию
    

STM32, интерфейсы и прерывания

Вопрос такой: надо ли после каждого такого телодвижения заново инициализировать PIN по пути GPIO->EXTI->NVIC?

Код либы же открыт? Надо посмотреть код, что делают эти ваши функции.

По логике, функции типа NVIC_* не должны влиять на периферию пинов, ибо это даже не то что разные блоки, NVIC вообще относится к ядру.

Но что там делает конкретная либа видно из ее кода.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Эти функции просто устанавливают биты в соответствующих регистрах. Т.к. в программировании именно для МК я скажем так начинающий то "железная составляющая" кода для меня не совсем прозрачна.

Например разрешение тактирования GPIO: RCC_AHB1PeriphClockCmd(GPIOXXX,ENABLE)

или EXTI/NVIC: RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE) означает что теперь эти части МК всегда будут работать? Т.е. если они один раз вызывались то повторно их вызывать не имеет смысла?

То же и по установке битов в регистры NVIC и EXTI. Есть ли моменты (кроме инициализации и прямого управления) способные их сбросить?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну тык а биты описаны в даташите. С этого и надо начать.

Для начала нужно открыть блок-схему МК, она обычно в даташите в начале. Там видно, какие блоки к чему подключены. У всех этих блоков есть свои регистры, через которые вы ими управляете (ну это на пальцах)

К примеру: RCC - блок клоков и ресета. RCC_AHB1PeriphClockCmd - включение клока для определенной периферии (их можно включать по отдельности для снижения энергопотребления, когда блок не нужен).

 

Если конкретно по вашим вопросам, то:

нет, регистры никто, кроме вас сбросить не может, если в даташите не указано обратное (например, флаги, которые вы наоборот должны читать, чтобы узнать о состоянии блоков).

 

Логика запуска МК:

1) Настройка клока

2) Включение RCC

3) настройка периферийного блока

4) настройка прерываний (NVIC + само прерывание)

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Мне собственно и нужно было понять принципы инициализации.

Тогда еще один вопрос про энергосберегающие режимы(LPM):

Меньшая частота тактирования GPIO по которому ожидается выход из LPMХ означает ли автоматически меньшее энергопотребление?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какой конкретно режим? Если в его описании написано "периферия отключена", то она отключена, частота ноль.

Если включена, то какое-то влияние на потребление будет (хотя, конечно, куда больше пользы будет, если в том же sleep отключать внешний кварц и PLL).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как в отладчике Coocox Coide симитировать прерывание EXTI_11 запуск АЦП ? В железе работает, но хотелось бы и софтого запустить.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Коллеги, два простых вопроса. На stm32f1 аппаратный i2c из обработчика внешнего прерывания получится использовать? А почему? Лаба застряла. (=

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Внешнего прерывания какого?
Так-то все события на i2c-шине вызывают соответствующее прерывание ;-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

5 часов назад, ozforester сказал:

ппаратный i2c из обработчика внешнего прерывания

То есть, в прерывании EXTI начать отправлять/получать байты по I2C? Да, можно. Причем, I2C тоже желателен с прерываниями по событиям, чтобы не висеть в EXTI в ожидании.

PS. Всё-таки, насколько отстает наше образование в обучении - STM32F1xx уже фактически списан по причине своей старости (ему более 15 лет!), а в учебные пособия он только-только вошел. Сейчас вот выучатся по нему, еще пройдет время, и этот F1xx станет в статусе "не рекомендуется для новых разработок". 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

8 hours ago, Obam said:

Внешнего прерывания какого?

Мастер трансмиттер из обработчика EXTI2_3

То есть,  даже без разрешенного прерывания в регистре I2С, остается его зависимость от наличия необработанного прерывания? Забегая немного вперед, будет ли работать запуск I2C из обрабтчика EXTI для stm32f030? (Повторяю параллельно лабы на  F0 и F1)

3 hours ago, EdgeAligned said:

чтобы не висеть в EXTI

Это только в лабе и когда "повисеть" уже ничему не может помешать. (= Пробовал заменить аппаратный I2C  на его программную реализацию - передает. (там отладочные светодиоды висят на pcf8574)

Изменено пользователем ozforester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

3 hours ago, EdgeAligned said:

PS.

Просто мне stm32f030f4 достались по 36 руб, а stm32f103с6 за что-то около 70 из Китая. Только в этом причина их выбора для изучения.

Изменено пользователем ozforester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

36 минут назад, ozforester сказал:

удет ли работать запуск I2C из обрабтчика EXTI для stm32f030?

Будет. Это же разные прерывания. А NVIC - приоритетный контроллер вложенных прерываний. 

 

37 минут назад, ozforester сказал:

даже без разрешенного прерывания в регистре I2С, остается его зависимость от наличия необработанного прерывания

Малость не понял, что вы имеете ввиду. Если прерывания в I2C не разрешаются, они не будут вызываться. Но биты событий (они же запросы прерывания) выставляться будут. Поэтому, можно просто ожидать в цикле while() бита. 

В F030 и в F103 - разные модули I2C и работают они по-разному.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

25 minutes ago, EdgeAligned said:

В F030 и в F103 - разные модули I2C и работают они по-разному.

Ну, да, поэтому и делаю сразу на двух, чтобы сразу "расширить кругозор". Вот в предыдущем посте в ответе про f103 наприсал EXTI2_3 (= Это потому, что уже повторяю на  f030. На f103 получилось из прерывания с I2C, а на f030 пока не выходит. Понимаю, что флаги в периферийных регистрах, и не зависят от nvic, но опыта маловато.

Вот так было на f103

oid EXTI3_IRQHandler( void ){
  pcf8574_write( pcf & ~1 ); // pull down P0
  delay(10000);
  pcf8574_write( pcf | 1 ); // pull down P0
  EXTI_PR |= (1 << 3) ; // reset pending exti3 bit
}

А с f030 с I2C пока не получается "помигать" , только через GPIO.

void EXTI2_3_IRQHandler( void ){
  led_on();
  //pcf8574_write( pcf & ~1 ); // pull down P0
  delay(1000);
  //pcf8574_write( pcf | 1 ); // pull up P0
  EXTI_PR |= (1 << 3) ; // reset pending exti3 bit
  led_off();
}

 

Изменено пользователем ozforester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

50 минут назад, ozforester сказал:
 delay(10000);

За это в прерывании обычно сжигают на костре инквизиции. Особенно если приоритет прерывания высокий.

Ну и я какбы написал - модули I2C в этих МК разные, работают по-разному, следовательно, нужно переписать ф-цию pcf8574_write

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Инквизиция на мои лабы смотрит сковзь пальцы. В миру же и без всякой инквизиции в обработчике будут лишь изменение состояния какой-нибудь переменной, да сброс пендинга, если необходимо. По i2C лабы уже были. Хотя настройка и работа I2C у F0/F1 различаются, но функции-то сишные обзываются и вызываются одинаково. (пишется на регистрах, регистры описаны в заголовочном файле указателями, не из любви к трудностям, конечно, а понимания для)

Просто есть сомнения, не накосячил ли я где-то в настройках I2C так, что протокол отрабатывает. а вызвать его из прерывания невозможно. Достану еще осциллограф, посмотрю шину для верности, прежде чем забираться в отладчик. Думаю, что дело не доходит до старта, но вдруг..

Вот так выглядит, напрмер настройка прерывания от ноги INT pcf8574 (на ней кнопка) к PA3.

void pcf8574_int( void ){
  RCC_AHBENR |= (1<<17); // clock port A
  GPIOA_MODER &= ~(0b11 << 6) ; // PA3 input mode
  GPIOA_PUPDR |= (0b01 << 6) ; // PA3 pulled-up
  SYSCFG_EXTICR1 &= ~(0b1111 << 12); // PA3
  RCC_APB2ENR |= 1; // clock SYSCFG
  EXTI_IMR |= (1 << 3); // unmask exti3
  EXTI_FTSR |= (1 << 3); // unmask exti3 fall
  NVIC_ISER0 |= (1 << 6) ; // enable exti2_3
}

Вывод INT заведен на PA3, что сигнализирует об изменении состояния регистра pcf8574 и необходимости его чтения. Из обработчика, в обратную сторону, к pcf8574 должно улетать новое содержимое регистра для включения светодиода.

Изменено пользователем ozforester

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...