[uquote="Reflector",url="/forum/viewtopic.php?p=3564084#p3564084"][uquote="Myp3ik",url="/forum/viewtopic.php?p=3564078#p3564078"]Если не включить тактирование блока, то как он будет принимать данные с шины и выставлять свои регистры ?[/uquote]Кажется он думает, что включение тактирования портов - это как подача на них питания, т.е. можно включить тактирование и на пинах появится мусор из не инициализированных регистров Реальная картина ближе к триггеру у которого отключают вход CLK по которому он защелкивает данные, т.е. если он уже что-то запомнил, то при отключении CLK текущий уровень на выходе никуда не денется.[/uquote]
Вот здесь бы подошел очень озадаченный смайлик, которого вроде нету в предложенных. и вроде понятно, в плане того, что изначально все выводы настроены на вход в высокоимпедансном состоянии, т.е. типа никуда не подключены. одно из самых безопасных состояний МК. И даже если на них подать тактовые импульсы, он все равно останется в этом состоянии и ничего страшного не происходит.
З.Ы. Простите, что сделал полное цитирование, иначе не понятно контекста сразу от двух авторов.
Добавлено after 1 hour 32 minutes 13 seconds:
Вот тута что-то есть по описанию CMSYS, правда перевод идиотский и примеры для LPC, но все равно
Попробуйте посмотреть на это с другой стороны:
если б ПОРТ представлял из себя пару регистров - тактировать его или нет существенной разницы не составляет.
а если это целая система (толпа регистров, включая теневые, триггера, коммутаторы и прочия...и прочия, там же привязки к другой периферии (к таймерам, к интерфейсам, ...)) - вот это раскачивать или нет уже ощутимо для потребления.
и если эту подсистему не тактируете - то и внутренние ее коммутаторы в нужное состояние не встанут - хоть ядро и будет кидать "конфигурацию" в регистр связи этой периферии (по сути информационный буфер).
Очередной небольшой вопрос. Пусть, возможно и снова глупый.
В портах для выставления и сброса битов есть регистр GPIO_ODR. Там все просто. Записал значение - оно выставилось на выводах. Считал/изменил/записал значение - оно поменялось на выводах.
Есть регистры GPIO_BSRR и GPIO_BRR, которые умеют выставлять каждый бит (пин, вывод) по отдельности без операции чтение-модификация-запись.
И вот, я записал единички в порт, а потом решил сбросить некоторые.
Как понять приоритет и есть ли он? т.е. у меня записана единица в порту, я ее сбрасываю, то она сбросится. Если у меня записан ноль, то при установке у меня ноль поменяется на единицу и бит в регистре GPIO_BSRR установится, а в GPIO_BRR сотрется.
А если я одновременно запишу бит установки и сброса в регистр GPIO_BSRR? Кто победит?
Короче, не знаю, как объяснить, но почему это работает?
З.Ы. Может это написано в RM0008, может я не обратил внимания, либо не понял. Если что, ткните носом.
Биты в BRR и BSRR только устанавливаются, но никогда не читаются. Можете рассматривать как входы R и S выходного триггера, в момент записи на которых появляется (и сразу снимается) активный уровень.
СКАЗОЧНИК писал(а):А если я одновременно запишу бит установки и сброса в регистр GPIO_BSRR? Кто победит?
Этот момент в референс мануале специально оговорён:
Note:If both BSx and BRx are set, BSx has priority.
А люди посмотрят и скажут: "Собаки летят. Вот и осень."
Все. Спасибо. Увидел. Нашел. Раздел 9.2.5
Запись нуля не имеет влияния (значения)
Запись единицы ставит или сбрасывает бит
Приоритет установленного бита над сброшенным.
Все биты можно только записывать, читать безсполезно.
BSRR - это действительно шикарная придумка. В том смысле, что можно и писать и читать одновременно.
Типичная задача - записать в последние 4 (например) бита значение 0b1101. Делается одним движением, атомарно:
GPIOx->BSRR = 0x000F000D
Т.е., с одной стороны - 0x000F0000 должно установить все биты в ноль, но 0x0000000D его перебивает. Поэтому бит 1 таки в ноль сбросится (из-за 0x000F0000), а биты 0, 2, 3 - установятся в единицу (из-за 0x0000000D).
Пока я этот момент не "просёк", думал поначалу, зачем там, в одном регистре, и сброс и установка одновременно. Мол, почему BRR только сбрасывает, а BSRR - не просто устанавливает, но ещё и сбрасывает, зачем такие сложности. А вот, оказалось, и причина, которую легко не заметить в этом примечании к даташиту.
WiseLord, все таки пишите для людей не знакомых с сей "магией", по сему не лишним будет: Гарантированно записать, независимо от содержимого порта,в последние 4 (например) бита значение 0b1101.
Для тех, кто сталкивался или еще столкнется, делюсь информацией по поводу "GNU Tools ARM Embedded 8 2018 q4 major": в виндовой версии сломан arm-none-eabi-objdump и попытка создать с его помощью .hex файл прошивки почти всегда обречена на провал. Грубый хак, позволяющий по быстрому исправить ситуацию выглядит так: идем сюда, скачиваем комплект бинарей под разрядность своей винды, вытаскиваем оттуда arm-none-eabi-objdump и заменяем им тот, что шел с GNU Tools ARM Embedded 8 2018 q4 major. Профит.
Пока HSEStatus равен нулю И StartUpCounter не равен HSE_STARTUP_TIMEOUT мы продолжаем делать этот цикл.[/uquote]
And - это считай умножение, т.е. можно представить все в таком виде:
Так то да... Это же логическое И.
А нахрена тогда таймаут придумывали?
Ааааааа. все. дошло.
Если ХСЕ не встал, то он ждет в течение этого времени, а если встал, то сразу выходит! Блин. Как все логично и просто придумали. )
Другой вопрос.
Если я хочу попробовать написать свой код для настройки тактирования МК, мне надо выпилить три эти строки?
Добавлено after 24 minutes 11 seconds:
Все, я уже провел эксперимент. Эти три строки.
Добавлено after 43 minutes 35 seconds:
Ткните носом, какой раздел в Рефренс Мануале про системный таймер 24 битный написано.? А то я чего-то там удалил в рефренс мануале, что найти не могу... Даже поиском.
Добавлено after 41 minute 9 seconds:
Бляха муха... Нашел в РМ0056
Bit 2 CLKSOURCE: Clock source selection
Selects the clock source.
0: AHB/8
1: Processor clock (AHB)
А в схеме (Figure 8. Clock tree, p. 93/1134 in RM0008) нарисован квадратик после шины АНВ, в котором деление на 8. Как я понял из всей этой схемы, то квадратики это обязательное деление, т.е. не подвластное управлению пользователем.
Так все таки СисТик может работать напрямую от АНВ или не может?
Всем привет!
Подскажите по такому вопросу.
В даташите на ethernet модуль, написано что минимальный период CLK SPI = 100ns. Это значит максимальная частота SPI = 10Мгц.
В настройках SPI у МК stm32f103 задаётся скорость в Мбит как кратная частоте МК.
Но ведь один период CLK составляет 2 тика: 1 и 0. А значит частота аппаратного SPI в МК должна быть выше.
Вопрос такой: всё же, как их сопоставить?
[uquote="STARпёр",url="/forum/viewtopic.php?p=3565896#p3565896"]Но ведь один период CLK составляет 2 тика: 1 и 0. А значит частота аппаратного SPI в МК должна быть выше.[/uquote]
Не плодите сущности. Частота и период взаимно обратные величины: F = 1/T и T = 1/F, где Т -- период, а F -- частота.
Вот если есть обработчик прерывания, то выход из него как правильно делать? Надо слово return? Или он будет косячить со стеком?
Что если мне по условию надо выйти раньше из прерывания?
[uquote="СКАЗОЧНИК",url="/forum/viewtopic.php?p=3566193#p3566193"]Что если мне по условию надо выйти раньше из прерывания?[/uquote]
Обработчик прерывания на кортексах - это обычная функция, единственное что если код на С++, то может потребоваться extern "C", но и этого можно избежать если стартап тоже будет на плюсах.