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

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

А отладчик то есть? В режиме отладки посмотреть состояние битов в регистрах. Как у нас раньше говорили, "местные телепаты в отпуске, а мы не ясновидящие"

 

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


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

Есть, но судя по воспоминаниям от I2C, иное "шевеление" приводит к изменению флагов и тщетности попыток. Надежда только на вошебный светодиод. (=

P.S. Может я ошибаюсь, или у меня отладчик "не той системы" (gdb + openocd + st-link-v2 из поднебесной)

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

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


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

1 час назад, ozforester сказал:

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

  NVIC_ISER0 |= (1 << 6) ; // enable exti2_3

 

Может всё-таки стоит прочитать мануал на процессор? И писать правильно:

NVIC_ISER0 = 1 << 6; // enable exti2_3

То же самое касается и остального табуна '|=' и '&='.

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


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

Да я даже больше скажу - в стандартной поставке CMSIS уже прописаны функции-обертки для вкл/выкл прерываний:

NVIC_EnableIRQ(EXTI2_IRQn);  // разрешение первыаний

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


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

Да, это здесь не принципиально, но за предупреждение спасибо, буду внимательнее впредь. (= Так то ничего кроме мануалов и не читал, все по ним родимым, сначала даже не ассемблере пробовал, но с кортексом это уже умомительное занятие.

Spoiler

Screenshot_2023-10-15_13-10-27.png

 

С осциллографом окзалось, что отправляется два пакета почти одновременно, первый включает светодиод, а второй выключает. На gpio при этом светодиод светится секунду. "Шифт регистр",  - подумал Штирлиц. Надо покопаться с I2C, тем более припоминаю что-то там такое с отправкой единственного байта.. Списибо за помощь, коллеги. 

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

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


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

А во-вторых, сама по себе PCF8574 использует выход INT только для информирования МК о том, что ВХОДНЫЕ сигналы изменились и нужно прочитать их, запросив через I2C. А когда микросхема работает на выход, тогда INT не имеет значения. 

 

По картинке из мануала там написано: "Запись 0 не дает эффекта" (то есть, не запрещает прерывание. Следовательно, сдвоенную операцию |= (чтение регистра и логическое ИЛИ и его содержимым) можно заменить на прямую запись в регистр = 

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


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

10 minutes ago, EdgeAligned said:

CMSIS

Это все немного позже. Мысленно и по наставлениям CMSIS первый в очереди, но я же не виндоз - или сегодня изучаю stm32, или cmsis. 

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


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

Далее, в этих случаях 

RCC_AHBENR |= (1<<17)

принято писать не цифрами, а текстом. Номера битов навряд ли кто из нас так уж и помнит наизусть. А вот текстом RCC_AHBENR_GPIOAEN - сразу понятно.

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

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


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

5 minutes ago, EdgeAligned said:

PCF8574

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

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


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

CMSIS - это не что-то отдельное, а стандарт описания битов и регистров ARM-ядерных микроконтроллеров. Cortex Microcontroller Software Interface Standard

поэтому учиться надобно сразу правильно. Хотя, то, что начали не на ассемблере, а на Си - это уже огромный шаг вперед 🙂 

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


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

11 minutes ago, EdgeAligned said:

не дает эффекта

Картинка в том смысле, что чтение регистра не дает и отрицательного эффекта, лишь несколько лишних тактов. Опечатка не шибко злая. Которые с эффектом, те быстро обнаруживаются. (=

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


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

2 часа назад, ozforester сказал:
void pcf8574_int( void ){
  RCC_AHBENR |= (1<<17); // clock port A
  GPIOA_MODER &= ~(0b11 << 6) ; // PA3 input mode

Так тоже делать не стоит. У вас записываемое слово только отправилось в RCC_AHBENR, но ещё возможно, что не записалось. Так как в CPU может быть буфер записи. А вы уже делаете чтение регистра, тактирование которого возможно ещё не включено.

После записи в любой регистр тактирования (записи, включающей какой-то из его битов), следует выполнить синхронизацию. Или обратным чтением этого регистра или вставить инструкцию типа DMB или DSB.

 

PS: И в каком это МК тактирование GPIO включается в AHBENR? В STM32F103 оно вроде находится в APB2ENR.

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


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

18 minutes ago, EdgeAligned said:

RCC_AHBENR_GPIOAEN

С cmsis понятное дело удобнее сивольная записть, а сейчас что я там в хидере понапишу все равно нужно лезть и проверять. Мне же самому и лезть. Время экономлю же ж.  (=

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


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

20 minutes ago, jcxz said:

И в каком это МК

Верно, где-то выше был момент , когда с f103 заработало и произошло переключение на f030. Про  особенности записи в конкретный регистр обычно замечаю предупреждения. Может с RCC  регистрами что-то пропустил, перечитаю более внимательно. Если ткнете пальцем в страницу референса, сильно облегчите задачу. Очень внимательно отношусь к подобным мелочам, так как это базовые знания.

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

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


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

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

Про  особенности записи в конкретный регистр обычно замечаю предупреждения. Может с RCC  регистрами что-то пропустил, перечитаю более внимательно. Если ткнете пальцем в страницу референса, сильно облегчите задачу.

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

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


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

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

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

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

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

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

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

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

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

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