STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Мучитель микросхем
Сообщения: 446
Зарегистрирован: Вс ноя 01, 2015 09:15:16
Откуда: 69.Ржев

Сообщение a797945 »

возможно, глупость спрошу, да и не специалист, но
по факту разрядность забираемых данных одинаковая?
и как изменится ошибка, если скажем уменьшить в 2 раза потенциал источника?
Реклама
Электрический кот
Аватара пользователя
Сообщения: 1029
Зарегистрирован: Сб мар 09, 2013 11:29:22
Откуда: 40RUS, Жуков

Сообщение 240265 »

Частота сэмплирования одинаковая? У СТМ32 входное сопротивление АЦП падает с повышением частоты.
IVL ex UA6PJ
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Тоже есть вопрос по ADC / DMA. Пока не могу понять, в чём дело.

Речь о проекте анализатора спектра. Используется два канала АЦП в режиме "MultiChannel single conversion".

Суть следующая. Раз в 50 мкс (или с частотой 20 кГц) от таймера приходит прерывание. В этом прерывании "дёргается" АЦП. Сначала АЦП снимает данные с левого канала, затем с правого, и на этом всё заканчивается, вплоть до следующего запроса от таймера через 50 мкс.

Данные, которые получает АЦП (два 16-битных числа), кладутся в "длинный" DMA буфер. Таким образом, через некоторое время в этом буфере появляются снятые с двух каналов значения (L-R-L-R-L...-L-R). Дальше уже эти данные подвергаются анализу Фурье, выводятся на экран и всё такое. Но это пока не важно.

На STM32F103CB всё работает отлично. В качестве входов АЦП выбраны PA0 и PA1, которые в этом случае являются простыми каналами АЦП 0 и 1.

Но аналогичный код для STM32F303CC работает некорректно. В его случае эти же входы уже являются другими каналами АЦП (1 и 2), причём там есть какие-то тонкости с дифферециальными и обычными входами. И я подозреваю, что проблема именно где-то здесь

А проблема в том, что данные с PA0 (левый канал) аккуратно ложатся в "свои" ячейки в DMA буфере. То есть, например, если подать синусоиду в левый канал, а в правом оставить тишину, то в DMA буфере будет что-то типа:

Код: Выделить всё

L R    L   R    L    R    L    R    L    R    L   R    L R
0 2048 500 2048 2000 2048 3000 2048 2000 2048 500 2048 0 2048
То есть, данные в "левых" ячейках постоянно меняются, а данные в "правых" равны половине разрешения АЦП (половина питания).

Но вот если на левый канал ничего не подавать, а синусоиду завести в правый канал, то в DMA буфере получается уже другая картина:

Код: Выделить всё

L    R L    R    L  R    L R    L    R
2048 0 1048 1000 48 2000 0 2048 1000 1048
. То есть, левый канал не "стоит" в половине питания 2048, а меняется в противофазе с правым. Так, что их сумма почти одинакова всё время.

То есть, данные со входа PA0 попадают в канал ADC_channel 1 правильно.
А вот данные со входа PA1 попадаются не только в ADC_channel 2, но, почему-то, и в ADC_channel1, но "в противофазе".

Такое ощущение, что где-то не отключена "дифференциальность" для входа PA2. Но не могу понять точно.

Код с инициализацие АЦП, если кто хочет взглянуть: https://github.com/WiseLord/ampcontrol- ... trum.c#L90 Там же чуть выше настройка DMA.

P.S.
Так... вопрос, похоже, снимается. Похоже, в библиотеке LL функция LL_ADC_SetChannelSingleDiff имеет баг, из-за которого какой бы режим канала ни устанавливался (single_ended или differential), он всегда устанавливается в differential. Канал 1 работает нормально (так как у него "пары" нет), а вот канал 2 работает не относительно земли, а относительно канала 1.

Изображение

Вот упоминание о баге с ответом недельной давности, что пофиксят в будущих версиях LL.

P.P.S. Для справки, обошёлся обычным CMSIS-овским

Код: Выделить всё

ADC1->DIFSEL &= ~ADC_DIFSEL_DIFSEL_1;
ADC1->DIFSEL &= ~ADC_DIFSEL_DIFSEL_2;
Контактная информация:
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

WiseLord, а зачем дергать АЦП в прерывании ? Таймеры умеют аппаратно запускать преобразование. Можно также настроить одновременное измерение двух каналов.
Иван Сусанин - первый полупроводник :solder:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Да, я знаю. Пока сделал как попроще (через прерывание), но потом, когда буду "вылизывать" код, посмотрю на предмет срабатывания по триггеру от таймера. Правда, не уверен, что конкретно от этого таймера можно дёрнуть АЦП, но, если и нет, можно посмотреть на другие таймеры.

А вот по поводу одновременности - это как? ADC1 и ADC2 запускать параллельно?

Просто сейчас это работает как-то так:

Код: Выделить всё

прер. от таймера            
|                           |                           |                           |
T-1-2-----------------------T-1-2-----------------------T-1-2-----------------------T-1-2
 |                           |                           |                           |
 выход из прерывания
То есть, в прерывании таймера не делается ничего длительного. Он просто запускает быструю серию измерений, и они идут "в фоне" - через DMA. При необходимости в серию легко добавить и другие каналы АЦП.

Параллельная работа двух АЦП особых преимуществ не даст. Или что-то другое имеется в виду?
Контактная информация:
Реклама
Мучитель микросхем
Аватара пользователя
Сообщения: 450
Зарегистрирован: Вс янв 09, 2011 23:05:37
Откуда: СССР

Сообщение Myp3ik »

Да, параллельный запуск подразумевался.
Иван Сусанин - первый полупроводник :solder:
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

Здравствуйте. Нужно оценочное мнение. Хочу в девайс добавить функционал удаленного обновления прошивки. Т-е физического доступа к самому устройству не предполагается. Все что имеется - линия 485 для связи с внешним миром.
Возможно ли из основной программы перенаправить выполнение во встроенный бутлоадер? Но даже если это возможно, то возможен вариант сбоя при передаче прошивки, и тогда новая прошивка не стартанет, и снова передать контроль бутлоадеру некому.
Я видел подход, когда возле МК ставится флешка. В таком случае новая прошивка льется туда, потом сверяются контрольные суммы и если все ок - МК перешивает сам себя.
Может у кого есть такой опыт? Подскажите правильное направление.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

Ярослав555 писал(а):ставится флешка. В таком случае новая прошивка льется туда, потом сверяются контрольные суммы и если все ок - МК перешивает сам себя.
по-моему, единственно приемлемое решение. тем более что абсолютно все "настоящие" перепрошиваемые устройства так работают - хоть тот же роутер возьмите, хоть мобильник.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Встал на лапы
Аватара пользователя
Сообщения: 128
Зарегистрирован: Пн фев 08, 2016 10:57:14

Сообщение smalcom »

Возможно ли из основной программы перенаправить выполнение во встроенный бутлоадер?
У STM32 нет определённых областей а-ля BOOT в AVR. Можно переходить куда угодно.
Но даже если это возможно, то возможен вариант сбоя при передаче прошивки, и тогда новая прошивка не стартанет, и снова передать контроль бутлоадеру некому.
Не просто возможно, а будет очень часто.
Я видел подход, когда возле МК ставится флешка.
Да - это хороший пример. Но если нет возможности добавить флешку и МК достаточно объёмный, то можно разделить адресное пространство внутренней памяти программ на три части: 1 - загрузчик, 2 - основная программа, 3 - сохранённая программа. Загрузчик качает программу и сохраняет её в область 3, проверяет, а затем копирует в область 2.
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2081
Зарегистрирован: Пт май 31, 2013 17:14:38
Откуда: Украина, Винница

Сообщение Ярослав555 »

[uquote="smalcom",url="/forum/viewtopic.php?p=3697467#p3697467"]Да - это хороший пример. Но если нет возможности добавить флешку и МК достаточно объёмный, то можно разделить адресное пространство внутренней памяти программ на три части: 1 - загрузчик, 2 - основная программа, 3 - сохранённая программа. Загрузчик качает программу и сохраняет её в область 3, проверяет, а затем копирует в область 2.[/uquote]
Да нет, есть возможность. Камешек 070й, на 128 кБ. Обычные флешки копейки стоят. Здесь FRAM не нужен :))) Просто по кодозатратам больше и дольше, потому как опыт новый. Спасибо за ответы, видимо так и сделаю.
Мудрый кот
Сообщения: 1846
Зарегистрирован: Вт авг 15, 2017 10:51:13

Сообщение jcxz »

[uquote="Ярослав555",url="/forum/viewtopic.php?p=3697289#p3697289"]Я видел подход, когда возле МК ставится флешка. В таком случае новая прошивка льется туда, потом сверяются контрольные суммы и если все ок - МК перешивает сам себя.[/uquote]
Так и следует делать. Иногда можно обойтись без внешней флешки - использовать в этом качестве половину флешь программ МК (но это менее удобно).

Добавлено after 2 minutes 54 seconds:
[uquote="smalcom",url="/forum/viewtopic.php?p=3697467#p3697467"]Да - это хороший пример. Но если нет возможности добавить флешку и МК достаточно объёмный, то можно разделить адресное пространство внутренней памяти программ на три части: 1 - загрузчик, 2 - основная программа, 3 - сохранённая программа. Загрузчик качает программу и сохраняет её в область 3, проверяет, а затем копирует в область 2.[/uquote]
О, уже написали!
Разве что можно ещё добавить, что эти части должны находиться в отдельных секторах стирания флешь МК. Если в качестве буфера используется внешняя flash, то тогда достаточно чтобы в отдельных секторах стирания были загрузчик и основное ПО.
Друг Кота
Аватара пользователя
Сообщения: 7060
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Вопрос о программаторе для STM32 здесь звучал, наверное, не раз. Но все же спрошу - что лучше приобрести для программирования этих МК? На Алиэкспресс в основном два типа программаторов предлагается, вот такие как на картинках:

Изображение

Изображение

Ссылки на лоты с этими программаторами:
Первый https://ru.aliexpress.com/item/32869967 ... 2e0e9dAwCo
Второй https://ru.aliexpress.com/item/32796459 ... 2e0e9dAwCo

По информации найденной в интернете первый не умеет управлять питанием программируемого микроконтроллера. По комментариям к заказам на Алиэкспресс второй умеет рулить питанием целевого девайса. Так ли это? Опять же из комментов с Али узнал, что второй программатор мало чем отличается от первого. К тому же пишут, что в последнее время во втором не хватает какой-то микросхемы, вроде буферной памяти (раньше как будто была, но потом упростили). Стоит ли брать второй? Есть ли какие-то преимущества кроме очевидных (подключается кабелем, не нужно тыкать донгл в USB разъем системника и тянуть от него провода к плате с микроконтроллером)? Для чего нужен широкий разъем под шлейф на втором программаторе?

Еще вопрос - эти программаторы могут использоваться в качестве отладчиков? Или нужен отдельный отладчик для проверки работы залитой в МК программы в IDE (установка точек остановки программы, получение значений переменных и состояния регистров микроконтроллера)?

Если без отдельного отладчика никак, можно ли использовать такое устройство:

Изображение

Ссылка на лот с преобразователем https://ru.aliexpress.com/item/32814913 ... 2e0e9dAwCo

По какому интерфейсу производится отладка STM32? Если по USART, то нельзя ли обойтись таким преобразователем USB-USART?

Изображение

Ссылка на лот с преобразователем: https://ru.aliexpress.com/item/32670594 ... b201603_60
У меня, правда, не на CP2102, а на CH340G, но думаю, большой разницы между ними нет.
PRG01.JPG
(26.71 КБ) 590 скачиваний
PRG02.JPG
(30.01 КБ) 624 скачивания
Otladchic01.JPG
(32.22 КБ) 709 скачиваний
Otladchic02.JPG
(22.21 КБ) 649 скачиваний
Астролябия-сама меряет, было бы что мерять!!!
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

Шить ли st-link'ом — на любителя. Лично я предпочитаю шить через бутлоадер. А, скажем, приличные чипы (взять те же STM32F0x2) вообще через DFU можно шить — т.е. никакой программатор не нужен! Прошил, нажал reset и работай себе через USB!
Если разработчик видит смысл в использовании отладчика вместо обычных отладочных сообщений через консоль, то может быть вообще имеет смысл перешить st-link в j-link и работать в SES. Но, повторю, лично я категорически против такого подхода!

Насчет сохранения данных во флеш-памяти МК, я вот такую штукенцию сделал. Используются все свободные страницы памяти (т.е. писать туда можно очень много, особенно учитывая то, что минимум аж 5 тысяч перезаписей гарантируется), сделан бинарный поиск (т.о. поиск последних сохраненных данных требует всего-то пяти-девяти итераций, а не сотен или тысяч как при линейном поиске)...
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Asmodey писал(а):что лучше приобрести для программирования этих МК?
Любой подойдет.
Asmodey писал(а):Еще вопрос - эти программаторы могут использоваться в качестве отладчиков?
ST-Link это не программатор, а отладчик. Прошивка МК это одна из функций отладчика.
Немного об отладке. http://purebasic.mybb.ru/viewtopic.php?id=564
Asmodey писал(а):Если по USART, то нельзя ли обойтись таким преобразователем USB-USART?
По USART можно только залить или прочитать прошивку, а отладка производится по интерфейсу JTAG или SWD, т. е. нужен ST-Link или другой отладчик.
Eddy_Em писал(а):Шить ли st-link'ом — на любителя.
Asmodey про отладку спрашивал.
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="Мурик",url="/forum/viewtopic.php?p=3699420#p3699420"]Asmodey про отладку спрашивал.[/uquote]
Так я и про отладку отвечал!
На мой взгляд, погружаться в дебри gdb не имеет никакого смысла: ну как, ставя брейкпойнты и просматривая регистры, можно отладить, скажем, работу с USB, CAN или любым другим интерфейсом, который ждать не будет?
Только отладочные сообщения в UART или USB на скорости в 3мбод.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Eddy_Em писал(а):На мой взгляд, погружаться в дебри gdb не имеет никакого смысла
Завязывайте с линуксом. Поставьте винду и IDE и не нужно будет лезть в дебри gdb. :)
Eddy_Em писал(а):ну как, ставя брейкпойнты и просматривая регистры, можно отладить, скажем, работу с USB, CAN или любым другим интерфейсом, который ждать не будет?
Представьте отлаживал, причем успешно. Когда USB полностью инициализирован и с компом связь установлена, работу программы можно останавливать без опасения что USB отвалится. Контроллер отсылает компу сообщение NACK когда программа остановлена и попытки доставить пакет повторяются до тех пор пока программе не будет вновь запущена, т. е. пакеты не теряются. :)
Собутыльник Кота
Аватара пользователя
Сообщения: 2723
Зарегистрирован: Пт сен 07, 2018 20:20:02
Откуда: деревня в Тульской губернии

Сообщение ПростоНуб »

Asmodey, первый поддерживает только SWD и SWIM интерфейсы. Второй так же и JTAG. Третий только JTAG. Последний бесполезен для прошивки и отладки STM-овских МК, если в МК нет уже прошитого бутлоадера.
Принципиальной разницы между SWD и JTAG я не вижу, кроме того, что для SWD достаточно двух проводов, а для JTAG надо пять (не считая землю и питание).

Добавлено after 4 minutes 47 seconds:
Мурик, на линуксе как раз с GDB проблем даже меньше, чем в винде. По крайней мере к Eclipse все прикручивается на раз. Точнее для STM32 на раз, а для STM8 и SDCC - после ряда ручных операций, которые могут представлять для новичка определенный гимморой.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

ПростоНуб писал(а):Последний бесполезен для прошивки и отладки STM-овских МК, если в МК нет уже прошитого бутлоадера.
Через USART аппаратная отладка невозможна. Бутлоадер есть и прошит он изготовителем.
ПростоНуб писал(а):на линуксе как раз с GDB проблем даже меньше, чем в винде. По крайней мере к Eclipse все прикручивается на раз.
В винде в нормальной IDE все изначально настроено и прикручивать не нужно.
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

Asmodey, по первой ссылке свисток не бери - там даже на фото не stm32 видно. Второй, скорее всего, можно взять. А ещё j-link-OB какой-нибудь ему в пару. Один китайский отладчик это не отладчик :)
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

VladislavS писал(а):Второй, скорее всего, можно взять.
Думаешь в него китайцы не могут поставить не STM32?
А что касается "свистков". Не первый год пользуюсь и работают нормально.
Ответить

Вернуться в «ARM»