drozel 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Вопрос такой: надо ли после каждого такого телодвижения заново инициализировать PIN по пути GPIO->EXTI->NVIC? Код либы же открыт? Надо посмотреть код, что делают эти ваши функции. По логике, функции типа NVIC_* не должны влиять на периферию пинов, ибо это даже не то что разные блоки, NVIC вообще относится к ядру. Но что там делает конкретная либа видно из ее кода. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MIKS 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Эти функции просто устанавливают биты в соответствующих регистрах. Т.к. в программировании именно для МК я скажем так начинающий то "железная составляющая" кода для меня не совсем прозрачна. Например разрешение тактирования GPIO: RCC_AHB1PeriphClockCmd(GPIOXXX,ENABLE) или EXTI/NVIC: RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG,ENABLE) означает что теперь эти части МК всегда будут работать? Т.е. если они один раз вызывались то повторно их вызывать не имеет смысла? То же и по установке битов в регистры NVIC и EXTI. Есть ли моменты (кроме инициализации и прямого управления) способные их сбросить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
drozel 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Ну тык а биты описаны в даташите. С этого и надо начать. Для начала нужно открыть блок-схему МК, она обычно в даташите в начале. Там видно, какие блоки к чему подключены. У всех этих блоков есть свои регистры, через которые вы ими управляете (ну это на пальцах) К примеру: RCC - блок клоков и ресета. RCC_AHB1PeriphClockCmd - включение клока для определенной периферии (их можно включать по отдельности для снижения энергопотребления, когда блок не нужен). Если конкретно по вашим вопросам, то: нет, регистры никто, кроме вас сбросить не может, если в даташите не указано обратное (например, флаги, которые вы наоборот должны читать, чтобы узнать о состоянии блоков). Логика запуска МК: 1) Настройка клока 2) Включение RCC 3) настройка периферийного блока 4) настройка прерываний (NVIC + само прерывание) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MIKS 0 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Спасибо. Мне собственно и нужно было понять принципы инициализации. Тогда еще один вопрос про энергосберегающие режимы(LPM): Меньшая частота тактирования GPIO по которому ожидается выход из LPMХ означает ли автоматически меньшее энергопотребление? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 17 ноября, 2015 Опубликовано 17 ноября, 2015 · Жалоба Какой конкретно режим? Если в его описании написано "периферия отключена", то она отключена, частота ноль. Если включена, то какое-то влияние на потребление будет (хотя, конечно, куда больше пользы будет, если в том же sleep отключать внешний кварц и PLL). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ASDFG123 0 23 февраля, 2017 Опубликовано 23 февраля, 2017 · Жалоба Как в отладчике Coocox Coide симитировать прерывание EXTI_11 запуск АЦП ? В железе работает, но хотелось бы и софтого запустить. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 14 октября, 2023 Опубликовано 14 октября, 2023 · Жалоба Коллеги, два простых вопроса. На stm32f1 аппаратный i2c из обработчика внешнего прерывания получится использовать? А почему? Лаба застряла. (= Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Obam 38 14 октября, 2023 Опубликовано 14 октября, 2023 · Жалоба Внешнего прерывания какого? Так-то все события на i2c-шине вызывают соответствующее прерывание ;-) 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 5 часов назад, ozforester сказал: ппаратный i2c из обработчика внешнего прерывания То есть, в прерывании EXTI начать отправлять/получать байты по I2C? Да, можно. Причем, I2C тоже желателен с прерываниями по событиям, чтобы не висеть в EXTI в ожидании. PS. Всё-таки, насколько отстает наше образование в обучении - STM32F1xx уже фактически списан по причине своей старости (ему более 15 лет!), а в учебные пособия он только-только вошел. Сейчас вот выучатся по нему, еще пройдет время, и этот F1xx станет в статусе "не рекомендуется для новых разработок". 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 8 hours ago, Obam said: Внешнего прерывания какого? Мастер трансмиттер из обработчика EXTI2_3 То есть, даже без разрешенного прерывания в регистре I2С, остается его зависимость от наличия необработанного прерывания? Забегая немного вперед, будет ли работать запуск I2C из обрабтчика EXTI для stm32f030? (Повторяю параллельно лабы на F0 и F1) 3 hours ago, EdgeAligned said: чтобы не висеть в EXTI Это только в лабе и когда "повисеть" уже ничему не может помешать. (= Пробовал заменить аппаратный I2C на его программную реализацию - передает. (там отладочные светодиоды висят на pcf8574) Изменено 15 октября, 2023 пользователем ozforester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 3 hours ago, EdgeAligned said: PS. Просто мне stm32f030f4 достались по 36 руб, а stm32f103с6 за что-то около 70 из Китая. Только в этом причина их выбора для изучения. Изменено 15 октября, 2023 пользователем ozforester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 36 минут назад, ozforester сказал: удет ли работать запуск I2C из обрабтчика EXTI для stm32f030? Будет. Это же разные прерывания. А NVIC - приоритетный контроллер вложенных прерываний. 37 минут назад, ozforester сказал: даже без разрешенного прерывания в регистре I2С, остается его зависимость от наличия необработанного прерывания Малость не понял, что вы имеете ввиду. Если прерывания в I2C не разрешаются, они не будут вызываться. Но биты событий (они же запросы прерывания) выставляться будут. Поэтому, можно просто ожидать в цикле while() бита. В F030 и в F103 - разные модули I2C и работают они по-разному. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба 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(); } Изменено 15 октября, 2023 пользователем ozforester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
EdgeAligned 85 15 октября, 2023 Опубликовано 15 октября, 2023 · Жалоба 50 минут назад, ozforester сказал: delay(10000); За это в прерывании обычно сжигают на костре инквизиции. Особенно если приоритет прерывания высокий. Ну и я какбы написал - модули I2C в этих МК разные, работают по-разному, следовательно, нужно переписать ф-цию pcf8574_write Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ozforester 0 15 октября, 2023 Опубликовано 15 октября, 2023 (изменено) · Жалоба Инквизиция на мои лабы смотрит сковзь пальцы. В миру же и без всякой инквизиции в обработчике будут лишь изменение состояния какой-нибудь переменной, да сброс пендинга, если необходимо. По 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 должно улетать новое содержимое регистра для включения светодиода. Изменено 15 октября, 2023 пользователем ozforester Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться