На самом деле, при изучении данной темы у меня была конкретная цель: я хотел сделать простой программатор для STM32 на базе преобразователя USB-UART, в котором выводы DTR и RTS используются для автоматического сброса микроконтроллера и активации встроенного заводского загрузчика программ.
Повторить функциональность stm32flash что ли? Только использование RTS/DTR для Reset/Boot0 не очень удобно. Когда утилита прошивки завершает работу, операционка может вернуть RTS/DTR в неудобное состояние. Например, оставить Reset на земле.
Впрочем, я такое тоже делал - для контроллеров WCH. Они через stm32flash программироваться не умеют, пришлось писать свою утилиту. И там тоже предусмотрел RTS/DTR.
Но удобнее всего оказалась самодельная платка на stm32f103 (по мотивам вот этой моей статьи), отображающаяся в системе как два COM-порта /dev/tty_STFLASH_0 и /dev/tty_DBG_0. Через первый можно прошивать, а через второй - отлаживать. Причем если на STFLASH выставить скорость 50 бод, можно управлять тремя выводами: байт 'b' отвечает за линию boot0, 'r' - reset, 'u' - реле, разрывающее линии D+/D- USB (не пригодилось). Ну и 'z' возвращает все в дефолтное состояние. Такое нестандартное управление гарантирует, что никто посторонний этими линиями управлять не будет. Ну а разделение порта программирования и порта отладки - что не надо каждый раз перезапускать screen.
Плата позволяет не использовать ноги, только разъем usb, немного странным способом.
Да вроде и UART выведен на гребенку, и SDI. То есть вообще нет нужды пользоваться неудобным USB-разъемом.
Мой личный опыт показывает что это гораздо удобнее чем использовать 2.54мм колодку разъемов.
Мой опыт говорит обратное. К штырькам можно подключить любую периферию в любом порядке, достаточно пары перемычек с гнездами по типу ардуиновских. А к специализированным разъемам можно подключить только что-то специализированное.
Предполагаемое использование текущей платки далеко от промышленности.
Не платки. Контроллера. Если уж выбирать максимально дешевый камень, глупо тратить деньги на плату.
Она для любителей простых и дешевых решений. Для людей, что сейчас используют в своих проектах платки ардуинки.
Не вижу у нее существенных преимуществ перед m328. По памяти сравнимо, по скорости тоже. Ну ладно, втрое выше. Это ж шило на мыло менять. Для сравнения, та же v203 имеет 10-20к оперативки, минимум 32к флеша, в 9 раз быстрее и гораздо больше периферии.
Если вам требуется гальванически развязать соединение с платой, то UART оказывается очень удобным.
Да на здоровье. Вот только через UART прошиваться могут и все остальные камни. Причем, в отличие от v003, у них загрузчик исправно работает прямо с завода. Собственно, я свои платы именно через UART и прошиваю.
Нет цели сделать аналог Ардуино, вся статья про работу с единственной платой, самой дешёвой из доступных, и про способ работы именно с ней.
А тут возвращаемся к началу: если у вы хотите начать работать с этой платой, вам так и так потребуется программатор. И я не уверен, что его использование будет менее удобным, чем бутлоадер. Все-таки задействуется всего одна нога, а не три.
Бедная периферия, слабое ядро, но для большинства простецких проектов этого достаточно
Это актуально при больших тиражах. Для разовой поделки проще купить контроллер в два раза дороже, но не требующего всех этих извращений. Да хоть тот же v103, который тоже пятивольтовый.
Потому что все эти DBG_STATUS_ предназначены в первую очередь не для преобразования в строку, а чтобы отслеживать ошибки внутри программы. Возвращать из функций, использовать в качестве кода завершения программы, возможно для логов. Идея использовать вместо короткого числа указатель на строку, конечно, интересная, но указатели ведь при каждом запуске новые будут. То есть когда программа упала, расшифровать коды ошибок будет сложно.
Если вам даже в текущем варианте хочется получить набор плат, то можете написать мне в личные сообщения на площадке. Попробую помочь, какой-то минимальный запас и плат и кабелей (с uart-ом на type-c) у меня есть.
Не спешите с этим. Если уж делаете аналог ардуино, так и делайте. Совместимость по посадочным местам, распиновке, способу прошивки. Отдельный кристалл без рабочего бутлоадера купить несложно. Я в свое время тоже щепотку купил, но так и не притрагивался: уж больно бедная там периферия, да и ядро. Даже v203 интереснее, не говоря уж о v307.
Иначе говоря, если готовы продавать законченные отладочные платы, хорошо. Нет - лучше не хвастайтесь шкурой неубитого медведя.
Хорошо. Так в чем вопрос-то тогда? Если мы рассматриваем покупку готовой отладочной платы, то и там и там производитель будет зашивать загрузчик. Если самостоятельное изготовление - и там и там понадобится программатор. Единственная разница, что ардуинки на m328 выпускают все, кому не лень, а на v003 - нет. И именно эту "несправедливость" хочет исправить автор.
Существует как _countof и в вариациях имени типа array_size, ARRAY_SIZE, std::ranges::size
На все эти варианты gcc ругается undefined reference to `countof'. Может, в Си этой функции все же нет? Или имеется в виду вообще любая, в том числе самописная, функция / макрос вида (sizeof(x)/sizeof(x[0]))?
Просто проверяем, на момент компиляции, что размер массива сопадает числу элементов ENUMа.
Если используется явное указание индексов {[x]=y, [z]=w,...}, это не спасет от пропущенного элемента в середине. А если как в исходном примере {y, w, ...}, то от перепутанного порядка.
не гарантирует, что для всех индексов прописаны строки.
А это толком и не отследить. Разве что в рантайме пройтись циклом и проверить длину каждой строки. В любом случае это куда менее опасная ошибка, чем сдвиг вообще всех индексов.
Пример по сути демонстрирует, что используя плохие практики программирования, можно получить трудноуловимые ошибки. Ну так не используйте плохие практики.
А это автор надеется, что кто-нибудь вдохновится его идеей и начнет выпускать ардуино-полобные платы на v003 и с прошитым загрузчиком. Лучше бы он сначала загрузчик допилил...
Я могу, конечно, придумать пару способов зашить таблицу векторов отдельно от прошивки. Но вы сначала скажите зачем вам это надо. Или вы пытались сказать, что таблица векторов прерываний в gd32f103 отличается от таблицы в stm32f103, и без переклмпиляции один и тот же бинарник может не заработать? Так тоже экзотическая ситуация.
Я предполагаю, что для этой цели должны использоваться ножки PB6 и PB7, на которых как раз есть и USB и USART1. У CH32V203K8 - 29 и 30.
Заинтересовали вы меня этим корпусом и вот что получилось. UART1 выведен на PA9,PA10 (19,20, как почти во всех остальных камнях). SWD на PA13,PA14(23,24, ни с чем не конфликтует), USB выведены на PA11,PA12 и PB6,PB7 (21,22 и 29,30, причем USBD конфликтует с CAN, а USBFS - с I2C). Boot0 совмещен с PB8 (31). Ну и выводы кварца в наличии - PD0,PD1 (2,3). На всякий случай, если там бутлоадер тоже кривой, UART2 это PA2,PA3 (8,9). Что еще интересно, там упомянут UART4, но нет UART3. Но, похоже, реально и 4-го там нет, он только в C8, RB. И что-то есть подозрение, что USBFS (который на PB6,PB7) там не выведен... Интересная штука, наверное, стоит купить.
Anton1906, вы не могли бы проверить через какой UART он реально прошивается?
шаг между ножками бывает разный и можно случайно неправильно развести плату или купить неправильный адаптер (как я, например).
Ага, мне тоже это удалось. Оказывается, шаг 0.635 это не 0.65. Хорошо, что это обнаружилось всего лишь на макетке.
USART1. У CH32V203G8 это должны быть 2 и 3 ножки
Нет. Там другая распиновка. UART1 на PA9,PA10 (25, 26), а прошивается через PA2,PA3 (11,12, которые на UART2). Ни с чем интересным они не конфликтуют.
Ну и можно предположить, что в документации просто допущена ошибка, которые там периодически встречаются.
Похоже, не в документации, а в кристалле. Уж написать код для проверки на какие ножки выведен UART1, а на какие UART2 несложно. Собственно, я бы предположил, что умудрился купить поддельный кристалл, но так и не смог представить как же именно надо было накосячить вот для такого эффекта.
А еще, смотрю, там ножки кварца выведены. И boot0 не забыли. Вы правы, надо будет посмотреть этот камень более подробно. Не знаете, у него с бутлоадером не накосячено как у g8? Но на счет шага зря вы так: 0.635мм развести и запаять намного проще, чем 0.5.
Повторить функциональность stm32flash что ли? Только использование RTS/DTR для Reset/Boot0 не очень удобно. Когда утилита прошивки завершает работу, операционка может вернуть RTS/DTR в неудобное состояние. Например, оставить Reset на земле.
Впрочем, я такое тоже делал - для контроллеров WCH. Они через stm32flash программироваться не умеют, пришлось писать свою утилиту. И там тоже предусмотрел RTS/DTR.
Но удобнее всего оказалась самодельная платка на stm32f103 (по мотивам вот этой моей статьи), отображающаяся в системе как два COM-порта
/dev/tty_STFLASH_0
и/dev/tty_DBG_0
. Через первый можно прошивать, а через второй - отлаживать. Причем если на STFLASH выставить скорость 50 бод, можно управлять тремя выводами: байт 'b' отвечает за линию boot0, 'r' - reset, 'u' - реле, разрывающее линии D+/D- USB (не пригодилось). Ну и 'z' возвращает все в дефолтное состояние. Такое нестандартное управление гарантирует, что никто посторонний этими линиями управлять не будет. Ну а разделение порта программирования и порта отладки - что не надо каждый раз перезапускать screen.Если верить Кириллу Лейферу (https://www.youtube.com/watch?v=hYpaVExfbu4 https://www.youtube.com/watch?v=8rfFLeFzgxE https://www.youtube.com/watch?v=OoZAdkxdjb8), в более новых моделях были и ЖК экраны и, кажется, плазменные. А первый да, электролюминисцентный.
А камень отдельно ~20р.
И что? Этих плат нужно одну-две штуки на всю жизнь. И уж лучше взять плату с полноценным контроллером.
Да вроде и UART выведен на гребенку, и SDI. То есть вообще нет нужды пользоваться неудобным USB-разъемом.
Мой опыт говорит обратное. К штырькам можно подключить любую периферию в любом порядке, достаточно пары перемычек с гнездами по типу ардуиновских. А к специализированным разъемам можно подключить только что-то специализированное.
Не платки. Контроллера. Если уж выбирать максимально дешевый камень, глупо тратить деньги на плату.
Не вижу у нее существенных преимуществ перед m328. По памяти сравнимо, по скорости тоже. Ну ладно, втрое выше. Это ж шило на мыло менять. Для сравнения, та же v203 имеет 10-20к оперативки, минимум 32к флеша, в 9 раз быстрее и гораздо больше периферии.
Да на здоровье. Вот только через UART прошиваться могут и все остальные камни. Причем, в отличие от v003, у них загрузчик исправно работает прямо с завода. Собственно, я свои платы именно через UART и прошиваю.
А тут возвращаемся к началу: если у вы хотите начать работать с этой платой, вам так и так потребуется программатор. И я не уверен, что его использование будет менее удобным, чем бутлоадер. Все-таки задействуется всего одна нога, а не три.
Это актуально при больших тиражах. Для разовой поделки проще купить контроллер в два раза дороже, но не требующего всех этих извращений. Да хоть тот же v103, который тоже пятивольтовый.
Потому что все эти DBG_STATUS_ предназначены в первую очередь не для преобразования в строку, а чтобы отслеживать ошибки внутри программы. Возвращать из функций, использовать в качестве кода завершения программы, возможно для логов.
Идея использовать вместо короткого числа указатель на строку, конечно, интересная, но указатели ведь при каждом запуске новые будут. То есть когда программа упала, расшифровать коды ошибок будет сложно.
Не спешите с этим. Если уж делаете аналог ардуино, так и делайте. Совместимость по посадочным местам, распиновке, способу прошивки. Отдельный кристалл без рабочего бутлоадера купить несложно. Я в свое время тоже щепотку купил, но так и не притрагивался: уж больно бедная там периферия, да и ядро. Даже v203 интереснее, не говоря уж о v307.
Иначе говоря, если готовы продавать законченные отладочные платы, хорошо. Нет - лучше не хвастайтесь шкурой неубитого медведя.
Хорошо. Так в чем вопрос-то тогда? Если мы рассматриваем покупку готовой отладочной платы, то и там и там производитель будет зашивать загрузчик. Если самостоятельное изготовление - и там и там понадобится программатор. Единственная разница, что ардуинки на m328 выпускают все, кому не лень, а на v003 - нет. И именно эту "несправедливость" хочет исправить автор.
На все эти варианты gcc ругается
undefined reference to `countof'
. Может, в Си этой функции все же нет? Или имеется в виду вообще любая, в том числе самописная, функция / макрос вида(sizeof(x)/sizeof(x[0]))
?Если используется явное указание индексов
{[x]=y, [z]=w,...}
, это не спасет от пропущенного элемента в середине. А если как в исходном примере{y, w, ...}
, то от перепутанного порядка.Что такое countof? gcc ругается, гугл ссылается куда-то в С++. Или я что-то неправильно понял?
Интересная штука. Надо будет над ними помедитировать поподробнее.
Это все же не средствами языка
Спасибо. Вариант с мета-макросами интересный, может и пригодится когда.
Средствами языка и без накладных расходов? Что-то ничего в голову не приходит.
А это толком и не отследить. Разве что в рантайме пройтись циклом и проверить длину каждой строки. В любом случае это куда менее опасная ошибка, чем сдвиг вообще всех индексов.
Пример по сути демонстрирует, что используя плохие практики программирования, можно получить трудноуловимые ошибки. Ну так не используйте плохие практики.
Да тут сам массив строк выглядит ужасно.
И все.
Странный вопрос. Во всех случаях, кроме отладки.
А это автор надеется, что кто-нибудь вдохновится его идеей и начнет выпускать ардуино-полобные платы на v003 и с прошитым загрузчиком. Лучше бы он сначала загрузчик допилил...
Для ATmega328, которая установлена в ардуину, тоже нужен программатор, минимум один раз.
Я могу, конечно, придумать пару способов зашить таблицу векторов отдельно от прошивки. Но вы сначала скажите зачем вам это надо.
Или вы пытались сказать, что таблица векторов прерываний в gd32f103 отличается от таблицы в stm32f103, и без переклмпиляции один и тот же бинарник может не заработать? Так тоже экзотическая ситуация.
Спасибо
Заинтересовали вы меня этим корпусом и вот что получилось. UART1 выведен на PA9,PA10 (19,20, как почти во всех остальных камнях). SWD на PA13,PA14(23,24, ни с чем не конфликтует), USB выведены на PA11,PA12 и PB6,PB7 (21,22 и 29,30, причем USBD конфликтует с CAN, а USBFS - с I2C). Boot0 совмещен с PB8 (31). Ну и выводы кварца в наличии - PD0,PD1 (2,3).
На всякий случай, если там бутлоадер тоже кривой, UART2 это PA2,PA3 (8,9).
Что еще интересно, там упомянут UART4, но нет UART3. Но, похоже, реально и 4-го там нет, он только в C8, RB. И что-то есть подозрение, что USBFS (который на PB6,PB7) там не выведен...
Интересная штука, наверное, стоит купить.
Anton1906, вы не могли бы проверить через какой UART он реально прошивается?
Ага, мне тоже это удалось. Оказывается, шаг 0.635 это не 0.65. Хорошо, что это обнаружилось всего лишь на макетке.
Нет. Там другая распиновка. UART1 на PA9,PA10 (25, 26), а прошивается через PA2,PA3 (11,12, которые на UART2). Ни с чем интересным они не конфликтуют.
Похоже, не в документации, а в кристалле. Уж написать код для проверки на какие ножки выведен UART1, а на какие UART2 несложно. Собственно, я бы предположил, что умудрился купить поддельный кристалл, но так и не смог представить как же именно надо было накосячить вот для такого эффекта.
А еще, смотрю, там ножки кварца выведены. И boot0 не забыли. Вы правы, надо будет посмотреть этот камень более подробно. Не знаете, у него с бутлоадером не накосячено как у g8?
Но на счет шага зря вы так: 0.635мм развести и запаять намного проще, чем 0.5.