stm32f0 читает ноги без инициализации пинов

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

Однажды инициализация пинов в основном файле меня начала раздражать и была вынесена доп файл. Запускать — не запускал, пока не допишу чтение всего. Железяка новая, все 20 пинов — заняты.
После написания черновика и прошивки, железяка странно реагировала на кнопки и тумблеры. Как бы с задержкой в 2-3 секунды.

Думал, функции фильтрации дребезга. Подтяжки-оттяжки в функции инициализации тоже не помогали. Не было на выводах притяжки к питанию, хоть тресни. МК сдул/надул, сгорел, мало ли.

Ответ оказался прост: функция иницализации пинов после переноса не была вызвана.
Тактирование портов было включено процедурами инициализации соседней периферии, но входы ввода-вывода не были инициализированы и при этом прекрасно, но медленно читались.
Т.е. нажимаю кнопку — замыкаю «подтянутый к+» вывод на землю. Через мгновение программа «видит» ноль. Отпускаю кнопку, через пару секунд (фильтр дребезга через скользящее среднее) становится «1». Будто бы подтяжка есть.

Видимо, паразитная емкость мосфетов + пусть и мномегаомное, но имеющееся в наличии сопротивление сыграли в RC фильтр и все же подтяжку.

Ну и после прошивки чип закирпичивается. Connetcion under reset почему-то требует кнопку reset, через ST-Link оно что-то не работает. Это второй урок.
  • 0
  • 09 февраля 2017, 14:02
  • igorp

Комментарии (12)

RSS свернуть / развернуть
да, инициализация пинов штука такая
тоже разок столкнулся
0
о, теперь понял, на сколько там все наоборот. Я думал, что reset — выход программатора, и при connection under reset программатор дает сброс и быстро подключается. Однако, это похоже вход и программатор ждет снаружи низкий уровень.
А значит, перешивать устройства конвейером будет весьма затруднительно.

С портом F пришлось повозиться, чтобы использовать его пины на выход, когда кварца HSE нет и не будет.

Но, мне так и не удалось задействовать 19й вывод чипа, SYS_SWDIO. Соседний SWDCLK настроился как выход, а этот — ни в какую.
Даже обидно закирпичиваться только лишь из-за ноги клока.
0
Даже обидно закирпичиваться только лишь из-за ноги клока.
А там разве можно полностью залочить отладку без прошивки фьюза «убить жтаг»? ЕМНИП при определенных условиях даже при сконфигуренных на GPIO ножках отладки можно прицепиться. Да и до бутлоадера, ЕМНИП, можно достучаться при любых условиях.
0
Можно полностью отключить jtag. Совсем и навсегда. Тогда надежда только на собственный бутлоадер, ибо заводской при этом тоже не может получить доступ к flash. Самый параноидальный способ защиты, так сказать.
0
Не порите чушь, ей же больно.
При полностью залоченном камне у встроенного бутлоадера есть только одна доступная команда «Стереть все». Этой команды достаточно, чтобы вернуть девственность железке.
Никакие собственные лоадеры — необязательны.
0
На сколько процентов Вы уверены в своих словах?
0
Это и есть фьюз «убить jtag», не? Но про STM32 я не знаю, снимается ли он. У AVR аналогичный бит снимается, у MSP430 — нет.
0
В reference manual почитайте раздел «Memory protection». Краткая выдержка:
Consequently, the debug port (SWD), the boot from RAM (boot RAM mode) and the boot from System memory (boot loader mode) are no more available.
… the RDP byte cannot be programmed. Thus, the level 2 cannot be removed at all: it is an irreversible operation.
0
Ну и после прошивки чип закирпичивается. Connetcion under reset почему-то требует кнопку reset, через ST-Link оно что-то не работает.

Возможно дело в этом: community.st.com/thread/34527-possible-error-in-my-stm32f100rc-mcu-memory?start=0&tstart=0

На заголовок не смотри. Смысл в том, что биты регистра ремаппинга, которые управляют ремапом SWD/JTAG, работают только на запись, а при чтении выдают ерунду. В коде HAL и кодогенераторе CubeMX есть ошибка с этим регистром.

Лечится вызовом ремаппинга SWD только после инициализации всей остальной периферии.
+1
спасибо, порыл по цепочке глубже, нашел GPIO_Remap_SWJ_Disable, вечером протестирую.
0
В сгенерированном CubeMX коде оно вызывается через HAL_Init() в main.c

Нужно прямо перед while(1) добавить ещё что-то вроде:

__HAL_AFIO_REMAP_SWJ_NOJTAG();
0
Оказалось, что для F0 это не актуально. Для 103 и далее — вполне.

Я завел железку, зайдествуя все ноги. На всякий, добавил резисторы по 100Ом на SWD, чтобы не случился выход с выходом, и был таков.
0
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.