Осваиваем 3-рублёвые микроконтроллеры PADAUK

в 8:01, , рубрики: cmd, codeblocks, FreePDK, Padauk, sdcc, stm32, timeweb_статьи, vs code, гитхаб, микроконтроллеры, программатор, электроника
image

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

На Хабре публиковалось несколько обзоров, где можно ознакомится с характеристиками и линейкой производителя. Даташиты можно найти на официальном сайте Padauk.

Простые восьмиразрядные микроконтроллеры от именитых фирм теперь или недоступны или имеют негуманный ценник. Одна из возможных замен — микроконтроллеры Padauk. В их линейке есть и однократно и многократно программируемые. Ниже в статье поэтапно расскажу как сделать программатор, создать свой первый проект и прошить «Hello world».

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

Программатор разработан и поддерживается сообществом FreePDK. Все необходимые файлы выложены на Гитхабе. Эта статья основана на серии видео от EEVblog по той же тематике, там в пяти частях всё рассказано. Я всё повторял за автором. Но лично мне проще работать с текстом и картинками.

Первая часть: программатор FreePDK

Разбирать схему не будем. Об этом можно почитать на Гитхабе.

image

Печатная плата

На Гитхабе можно скачать Gerber и заказать на производстве. Другой вариант — можно купить готовую на популярных отечественных маркетплейсах. Выглядит она вот так:

image
Размеры её 73х22 мм.

Нисколько не умаляю работу, которую провели конструкторы и разработчики при создании этого девайса, честь им и хвала. Но размеры… Монтаж очень плотный, детальки мелкие. Очень мелкие.

На гитхабе можно найти Bom и заказать всё разом, я собирал сам.

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

Паять 0603 на контактные площадки 0603 — ещё то удовольствие. Будьте к этому готовы, запаситесь терпением.

Много всяческих файлов от сообщества поможет правильно провести монтаж:

image

Здесь можно сопоставлять спецификацию и расположение на плате, очень удобная вещь.

image

Потратив несколько часов имеем такой результат:

image

В качестве эксперимента был еще опробован вариант с паяльной пастой и печью. Сделал шаблон из тонкого пластика (300 мкм), засверлил отверстия на месте печатных площадок.

image

Запекал в повидавшей всё на свете блиннице. Стеклянная крышка позволяет наблюдать за процессом в режиме онлайн:

image

Если нет желания связываться с паяльной пастой, и паять будете паяльником, то хороший вариант заменить компоненты 0603 на компоненты 0402. Да, мелкие, нужен хороший пинцет и линза, но паяются намного проще и быстрее. Получится примерно так:

image

Прошивка программатора

Оригинальная инструкция по прошивке от сообщества Free PDK:

Спойлер

************************
 DFU-NOTES for firmware
************************
Install "dfu-util" on your computer: http://dfu-util.sourceforge.net
(macOS: brew install dfu-util / Linux: sudo apt-get install dfu-util / Windows: follow the guide on dfu-util web site)
1. unplug USB from Easy PDK programmer
2. on Easy PDK programmer PRESS AND KEEP HOLDING THE BUTTON
3. WHILE STILL HOLDING THE BUTTON connect USB
4. ONLY AFTER USB is connected release the button
5. EXECUTE:
   dfu-util -d 0483:df11 -a "@Internal Flash  /0x08000000/064*0002Kg" --dfuse-address 0x08000000 -D EASYPDKPROG.dfu
   EXAMPLE OUTPUT:
   ---------------
   dfu-util 0.9
   ...
   Opening DFU capable USB device...
   ID 0483:df11
   Run-time device DFU version 011a
   Claiming USB DFU Interface...
   Setting Alternate Setting #0 ...
   Determining device status: state = dfuERROR, status = 10
   dfuERROR, clearing status
   Determining device status: state = dfuIDLE, status = 0
   dfuIDLE, continuing
   DFU mode device DFU version 011a
   Device returned transfer size 2048
   DfuSe interface name: "Internal Flash  "
   Downloading to address = 0x08000000, size = 29068
   Download  [=========================] 100%        29068 bytes
   Download done.
   File downloaded successfully
6. UNPLUG USB from Easy PDK programmer

Распишем по пунктам:

  • Скачиваем dfu-util-0.11-binaries по адресу;
  • Скачиваем прошивку с Гитхаба: (жмём Code / Download ZIP);
  • Переносим файл EASYPDKPROG.DFU в папку win64 с DFU-UTIL.EXE;
  • Дальше по инструкции выше: зажимаем кнопку на программаторе, вставляем в USB, и устройство должно определяться в диспетчере устройств вот так:
    image

Если определяется как STM32.dfu, то необходима замена на правильные драйвера. Для этого скачиваем программу Zadig.

Настройки:

image

Ставим галку на List All Devices

image

Выбираем STM32 BOOTLOADER

image

Находим WinUSB (v6.1.7600.16385)

И, наконец, нажимаем кнопку «Replace Driver». Ждём минут пять, после чего в диспетчере устройств теперь должен определиться как «STM32 BOOTLOADER». Если всё верно, то переходим непосредственно к прошивке микроконтроллера программатора PDK.

Зажимаем кнопку и вставляем в USB, ждем реакцию ОС, отпускаем кнопку.

Заходим в папку win64 и открываем в ней командную строку: Shift + ПКМ (правая кнопка мыши) по пустому месту / «Открыть окно команд». Откроется командная строка. Вставляем строчку из инструкции выше:

dfu-util -d 0483:df11 -a "@Internal Flash /0x08000000/064*0002Kg" --dfuse-address 0x08000000 -D EASYPDKPROG.dfu

Жмём «Enter». Если все правильно, в ответ получаем вот такое окно:

image

Итак, программатор микроконтроллеров фирмы PADAUK от сообщества Free PDK готов к работе. После прошивки при подключении к USB в диспетчере устройств программатор никак не определяется (по крайней мере у меня).

Проверка программатора

Приложение для программатора Free PDK называется EASYPDKPROG и работает из командной строки. Скачиваем его отсюда. Распаковываем. Подключаем программатор к USB. Теперь открываем папку из командной строки: Shift + ПКМ на любом свободном месте и выбираем «Открыть окно команд».

В открывшемся окне вводим команду: easypdkprog probe.

Эта команда проверяет подключённый программатор и микроконтроллер. Вот так она ответит, если не увидит программатор:

image

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

image

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

image

В командной строке можно вписать одну из доступных команд для PFS154.

  • easypdkprog probe — для проверки подключения программатора и установленного в него микроконтроллера;
  • easypdkprog -n PFS154 read readout.ihx — для чтения из микроконтоллера в файл readout.ihx;
  • easypdkprog -n PFS154 write Test1.ihx — для записи в микроконтроллер файла;
    Весь список команд можно посмотреть на странице.

Ниже список микроконтроллеров. Перечеркнутыми отмечены неподдерживаемые.

MCU390
PMC131 PMS132 PMS132B PMS133 PMS134

PMC251 PMS271
PMS150C PMS152 PFS154 PMS154B PMS154C
PMS171B (по списку сообщества проходит как поддерживаемый, но при запросе, EASYPDKPROG видит его как «unsupported»)
PFS172 PFS173
PMS15A
PFS154 PFS172 PFS173

Кстати, чтобы самому не вводить команды можно использовать программу FreePDK-WRITER: исходники скачать можно отсюда. Исполняемый файл там не выложили, поэтому придётся собрать самому. Я сделал это за вас: FreePDK-WRITER. Оба .exe файла должны находиться в одной папке.

image

Ответ будет приходить также в окне CMD. Ниже два скомпилированных файла: один для многократно программируемого PFS154, другой для однократно программируемого PMS150C (того самого, что стоит 3 цента).

Попробуем прошить для проверки. К сожалению, для 150С это будет первый и последний раз. Такая вот безвозвратная потеря.

В обоих случаях светодиод висит на выводе PA4. Схема подключения программатора тоже стандартная:

image

image

В некоторых случаях подключенная периферия не позволяет нормально прошивать микроконтроллер. Поэтому светодиод на Pin PA4 желательно подключить уже после прошивки.
После удачной прошивки микроконтроллера PFS154 получаем такой ответ в командной строке:

image

Что означает, что всё прошло как надо. Помните, что питание на контроллер подается только в момент прошивки, и чтобы увидеть мигающий светодиод, надо подать внешнее питание.

Вторая часть: компилятор и редактор кода

Для создания программ для микроконтроллеров Padauk необходимы компилятор и редактор. В качестве компилятора будем использовать SDCC — Small Device C Compiler. Загружаем и устанавливаем SSDC отсюда. На момент написания статьи уже есть версия 4.4.0. Но лучше скачать версию 4.2.0. Именно под неё сообществом Free PDK создавались все файлы для программатора. Использование самого свежего дистрибутива приведет к необходимости корректировки некоторых файлов. Скачиваем и устанавливаем.

Вторым шагом необходимо подобрать какой-нибудь редактор кода, поддерживающий компилятор SDCC. Первоначально мой выбор пал на CodeBlocks, но потом я перешел на VS Code, который мне показался удобнее. Если Вас устраивает CodeBlocks, то здесь есть подробное описание его использования.

А здесь опишу работу с VS Code, куда был добавлен скрипт, позволяющий обходиться без командной строки. Отсюда скачиваем дистрибутив VS Code для Windows. Устанавливаем.

Теперь необходимо скачать макрос, который позволит избежать работы с командной строкой. Скачиваем репозиторий с Гитхаба. Распаковываем его и закидываем в любое место. Располагать распакованные файлы easypdkprog необходимо в паке с макросом.

Несколько слов о файлах Free PDK на Гитхабе, в частности о примерах кода. Представлены три страницы с примерами кода для микроконтроллеров Padauk.

  • sdcc-pdk-code-examples — здесь находятся примеры для компилятора sdcc, не требующие никаких дополнительных инклюдов. Код для компиляции достаточно просто скопировать и вставить в редактор.
  • free-pdk-examples — здесь допиленные сообществом MCUs. Простым копированием не обойтись. Необходимо дополнить проект файлами include. Соответственно, код становится более читабельным и понятным.
  • fppa-code-examples — это уже примеры от производителя, код совсем приятный. Но компилируется только в родной IDE, которая идет с заводским программатором.

Самый интересный вариант — free-pdk-examples. Нужно учесть, что на странице висит предупреждение, о том что способ ещё в разработке и пользоваться им нужно осторожно.

Сообщество Free PDK разместило большое количество примеров кода на Гитхабе. Можно использовать их для обучения. Находятся они здесь.

Нас интересует папка «include»:

image

Скачать папку «include» отдельно не получится, поэтому скачиваем весь проект с Гитхаба (Code / Download ZIP). Распаковываем в любом месте, открываем папку «include». Распределяем файлы и папки:

  • папки easy-pdk и pdk копируем в папку include компилятора SDCC. Обычно она находится по пути C:Program FilesSDCCinclude;
  • четыре оставшихся файла .h копируем в проект рядом с .c-файлом нашего проекта.

Разберём и попробуем прошить простейший пример кода: BlinkLED.

Открываем папку padauk-sdcc-vsode-starter-master, жмем правой кнопкой мыши по свободному месту, выбираем «Открыть с помощью Code».

image
Соглашаемся с предупреждением, жмем «Yes»

Создаем чистый файл с помощью иконки:

image

Даём ему имя ххх.c. Например Mayak-7.c. Вставляем код из Гитхаба. Копипастим код BlinkLED/main.c отсюда.

По задумке авторов сборка должна выполняться с помощью программы Make, алгоритм сборки описан в каждом из примеров в файле Makefile. С помощью этого файла в код дополнительно добавляются некоторые define-ы, значения которых установлены в самом «Makefile». Мы это программой пользоваться не будем (она сама и скрипт написаны под linux), поэтому укажем эти дефайны вручную прямо в начале кода.

#define PFS154
#define F_CPU 1000000
#define TARGET_VDD_MV  4000
#define TARGET_VDD  4.0

Теперь можем задействовать макрос, который мы скачали и установили выше. Команда для компиляции нашего кода «Ctrl+Shift+B». В выпадающем окне выбираем разрядность нашего микроконтроллера. В нашем случае для PFS154 это 14. Сразу начинается компиляция. Если ошибок нет, выводится текст как на скриншоте ниже. Главное — это «Done».

image

Есть еще пара команд, которые нам понадобятся:

Для проверки подключенного программатора и/или микроконтроллера горячие клавиши «Ctrl+P», в выпадающем окне вписываем «task+пробел» выбираем «Probe MC». Получаем результат:

image

Для прошивки микроконтроллера горячие клавиши «Ctrl+P», в выпадающем окне вписываем «task+пробел» выбираем «Write to MC». В выпадающем окне выбираем наш микроконтроллер.

Получаем результат:

image

Позднее сделал игрушку маяк-поворотник для велосипедов и самокатов. Две кнопки и восемь светодиодов. Контроллер использовал перезаписываемый PFS154 на 16-ти ногах. Ниже можно посмотреть код программы:

Код: маяк-поворотник на PFS154-S16

#define PFS154
#define F_CPU 1000000
#define TARGET_VDD_MV  3000
#define TARGET_VDD  3.0

#include <pdk/device.h>
#include "auto_sysclock.h"
#include "delay.h"
             
#define BTN_L()   !(PA & (1 << 7))
#define BTN_R()   !(PA & (1 << 0))

// Main program
void main() {
   PAC=0;//|= (1 << 7);       // Enable Button as digital input
  PAPH=0b11111111;         //|= (1 << 7);         // Enable pull-up resistor on Button
  PBC=0b11111111; 
  int i = 0;
        PB=0; 
      _delay_ms(300);
  if (BTN_R()) {
    i=7;
   while (i>=0) {
    PB=PB | (1 << i);
    _delay_ms(25);
       i=i-1;
  }  
  }
   else if (BTN_L()) {
    i=0;
    while (i<=7) {
    PB=PB | (1 << i);
    _delay_ms(25);
       i=i+1;
    } 
 
    }
   else {
      PB=255;
      _delay_ms(200);
    }
}

// Startup code - Setup/calibrate system clock
unsigned char _sdcc_external_startup(void) {
  AUTO_INIT_SYSCLOCK();
  AUTO_CALIBRATE_SYSCLOCK(TARGET_VDD_MV);
  return 0;   // Return 0 to inform SDCC to continue with normal initialization.
}


Возможно, захочется почитать и это:

Автор:
igor27065

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js