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

STM32 – вопросы – проблемы - решения.

Ну я всё гонял на F103-ем и на 72 МГц. Но не думаю, что тут предвыборка что-то сильно накосячила, команды-то все короткие (много влазит в буфер) и многие не однотактовые.

Чтобы уйти от циклов/вызовов/возвратов, делал линейный код с разным количеством повторов операций и стартовой отмашкой на другую ножку. Причм этой байды тоже несколько повтров ставил подряд -- все давали одинаковые импульсы. Точнее, как-то вдруг вылезли разные, так заметил, что одна и та же комбинация с if(on) BSRR = mask; else BRR = mask; компилируется по разному в разных местах.

И так чтобы ну совсем -- там не NOP стоял, а MVNS, почему-то именно его вставил :-)

Но и удлиннение работы STR в bit-band по сравению с простым доступом к региону, и удлиннение импульса на число_MVNS_между_STR_минус_1 тактов (т.е. отсутствие удлиннения при одном) поворялись уверенно.

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

Если кто напомнит в конце апреля в личку, буду благодарен :-)

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


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

Добавлю еще, что инвертировать бит везде, кроме рабочих регистров процессора ARM или Cortex - это не атомарная операция. Независимо от способа, "напрямую" или через bit-band. Потому, что сначала этот бит нужно прочитать, в виде целого слова, или как отдельный бит через bit-band alias. Нужно выполнить те самые неоднократно показанные три команды. Но после чтения может случиться что угодно до того, как измененный бит будет записан обратно.

Атомарными будут только сброс или установка бита через bit-band. Потому, что это одна команда. А чтение-модификация-запись слова, содержащего нужный бит, делается аппаратно.

Также атомарными будут команды сброса или установки порта ввода-вывода через BSRR и BRR. Потому что в этом случае не происходит чтение-модификация-запись.

 

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

Не так уж и много. Если команда 4-байтовая, вот она половину одного регистра и забрала. Т.е., всего в два регистра влазит от 4-х до 8-ми команд. Вот последний показанный мой код влезет в два регистра. А как остальное, не знаю.

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


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

Под атомарностью имелось ввиду отсутствие интерференции с работой в других местх с другими битами того же слова.

В этом смысле *ADDR ^= MASK с основным адресом не атомарен. Если будет прерывание, модифицирующее другую ногуэтого же порта - кака.

А с *ADDR_ALIAS = ~*ADDR_ALIAS такой проблемы не будет.

В этом же смысле атомарно и if ( ODR & mask ) BRR = mask; else BSRR = mask; и BSRR = (ODR & mask) ? mask << 16 : mask;

 

______

Чё ж так спать хочется... Ещё и двух ночи нет...

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


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

В результате, для инвертирования бита через бит-бэнд,

по сравнению с обычным xor регистра ODR:

- Настоящей атомарности нет,

- Размер кода такой же,

- Время выполнения такое же.

 

 

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


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

В результате, если к разным битам одного и того же порта идут инвертирования ножки из основного кода и из прерывания, то для xor с ODR в основном потоке надо добавить запрещающую/восстанавливающую прерывания обёртку. И в размер кода, и в его время.

 

Для инвертирования через bit-band не нужно, несмотря на «ненастоящую» атомарность.

У ODR ^= и такой нет.

 

Я понимаю, что использование Cpl() само по себе будет редким, а уж чтобы и в прерывании, и в основном коде, так и ещё реже. Но это не мешает подумать по возможных последствих (и положить на весы способы их обхода). Так как чем круче джип, тем дальше идти за трактором чем менее вероятен баг, тем дольше его искать при возникновении.

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


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

В результате, если к разным битам одного и того же порта идут инвертирования ножки из основного кода и из прерывания, то для xor с ODR в основном потоке надо добавить запрещающую/восстанавливающую прерывания обёртку. И в размер кода, и в его время.

Для инвертирования через bit-band не нужно, несмотря на «ненастоящую» атомарность.

У ODR ^= и такой нет.

С этим согласен.

Есть еще команды исключительного доступа. С ними пока серьезно не разбирался. Думаю, они помогли бы в описанном случае.

Ну, и те самые регистры - сбросить бит порта, установить бит порта. С истинной атомарностью. И голова не болит.

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


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

Помогите с бутлоадером STM32F105.

Бутлоадер очень странно себя ведет. Судя по описанию протокола, для входа в режим команд нужно сбросить проц и подать на USART1 0x7F, после чего он должен ответить байтом 0x79. Однако, у меня сразу после сброса процессор выдает в порт 0x00 примерно три раза в секунду и на подачу 0x7F не реагирует. Flash loader demonstrator (v2.2.0) не опознает его, то есть получая эти ноли пишет, что чип не опознан и все.

Я взял терминалку, поставил выдачу 0x7F в цикле и сделал сброс процессора, после этого он вошел в режим команд бутлоадера. Далее, подавая команды вручную получаю нормальные ответы, но ведь вручную программу не зальешь.

Errata говорит, что в чипах с датой выпуска до 937 bootloader вообще не работает; у меня как раз 937 - должно работать. Как видно он и работает, но более чем странно.

Было предположение, что выбирается другая периферия для бутлоадера (есть еще USB, CAN и USART2), в даташите, сказано, что нельзя оставлять неподключенными соответствующие ноги. У меня неподключены. Посадил указанные ноги на землю, ничего не поменялось.

Кто зашивал по USART? Программировать по USB, JTAG или SWD возможности нет.

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


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

кто-нибудь знает, как в Keil симулировать STM32F107RC? со 103 проблем нет. для 107 вылетает ошибка

*** error 65: access violation at 0x0000000C : no 'read' permission.

пробовал через MAP добавить доступ к этому диапазону адресов, но это бесполезно - он пытается исполнять программу с нулевого адреса, вместо 0x8000000. а в нуле соответственно программы нету.

при всех тех же настройках проекта и исходниках, проект скомпилированный для 103 нормально дебажится в симуляторе.

 

PS эмуляция через ST-Link работает нормально.

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


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

кто-нибудь знает, как в Keil симулировать STM32F107RC? со 103 проблем нет. для 107 вылетает ошибка

Потому что симулятор кейла не умеет симулировать 107ой, а 103ий умеет. Для 107го только симулятор ядра.

Можно выбарть 103ий в настройках и симулировать, как 103ий.

 

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


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

У кого-нибудь пробивалась нога NRST? А у меня походу пробилась. Всего-то сменил батарейку) Напряжение батарейки измерялось ацп на 15ой ножке МК, а NRST - 14я. Сменил батарейку - не запускается. Пытаюсь конектится - без толку. Оказывается, что нога NRST в нуле теперь всегда. на выключенном девайсе там меж ногой и землей ~300 Ом. Т.е. внутри полевичек, который подтягивает к земле ногу, пробился(((. А перепаивать так не хотелось... Короче насильно резистором 10 Ом подтянул NRST к +3В. И, вуаля, все заработало. Только там теперь ток аж 15мА течет, и при отладке никакой ULINK или JLINK не сможет прорезетить МК, остается вручную помогать.

 

Но вот думаю, может не пробил, а кто-то в МК формирует резет. Но тогда ведь должны были быть импульсы и при выключении уж явно больше 300 Ом?

 

 

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


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

Собираемся переходить на stm32f107 дружно, - будем покупать отладочные платы stm3210c-eval, а к ним ещё и программаторы-отладчики.

Прокомментируйте, пожалуйста, вопросы:

- с помощью st-link можно отлаживать мк только в keil, iar, плюс Ride и ST toolset (набор от STM). В eclipse можно только прошивать (используя консольную утилиту для st-link)?

- есть ли у openocd уже поддержка st-link? быстрый поиск говорит, что вопрос поднимался, но решения пока нет.

- если стоит задача обучения работе с мк с нуля (студенты и выпускники) - то какую среду разработки им лучше советовать (в контексте работы с данными контроллерами)?

- имеет смысл брать не узкоспециализированные st-link, а mt-link? преимущество mt-link только в его универсальности? Или st-link'и дают какие-то вкусные плюшки?

- на сайте Терраэлектроники продаются их собственные TE-ARM-LINK - "устройство является функциональным аналогом J-LINK (Segger, IAR)". они дешевле, чем mt-link. кто-нибудь с ними уже работал? думаю, может их закупить вместо mt-link (я так понимаю, ночинка-то у них идентичная ;) ).

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


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

Короче насильно резистором 10 Ом подтянул NRST к +3В. И, вуаля, все заработало. Только там теперь ток аж 15мА течет, и при отладке никакой ULINK или JLINK не сможет прорезетить МК, остается вручную помогать.

А вы 100 Ом прицепите вместо 10.

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


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

А вы 100 Ом прицепите вместо 10.

Спасибо! Я уж думал поставить туда 120 Ом и дополнительно пару транзисторов, дабы не нагружать ULINKа 30мАмперами. Но прочивал ваше сообщение, и поставил просто 120 Ом))) Работает все как у новенького)

 

Вот только теперь вопрос. Какой максимальный втекающий ток по reset у ULINK?

 

И еще. Вы с таким уже сталкивались?

 

 

 

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


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

- есть ли у openocd уже поддержка st-link? быстрый поиск говорит, что вопрос поднимался, но решения пока нет.

 

Есть проект http://www.versaloon.com, почитав его форум можно найти информацию, как и чем перепрошить ST-Link, чтобы появилась поддержка openocd. Сам не делал, но судя по форуму, у людей все получилось.

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


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

Плата STM3210C. Почему на ней не разряжается батарейка при выключенном питании?!? Я повторил схемку, у меня разряжается. И так должно быть, ведь там на gpio в МК диоды стоят, а через диод и измерительный резистор 10кОм батарейка замыкается на Vdd. Итог - 250мкА. Ну никак не могу понять, почему на доске STM3210C нет этого тока.

 

P.S. Не повторил бы бездумно схему, не разрядилась бы батарейка, не стал бы её менять, не убил бы статикой ногу NRST... (см.выше)

 

 

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


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

Гость
Эта тема закрыта для публикации ответов.
×
×
  • Создать...