CH32V203 запуск з нуля

Отримав велику партію мікроконтролерів CH32V203C8T6.

І виникло питання: як перевірити, що це нормальні мікроконтролери? Готових плат для пристроїв наразі немає, а перевірити якось треба. На щастя, є декілька перехідників з LQFP48 на PGA.


До цього такі складні чіпи мені паяти не доводилося. Для впаювання спробую використати мініпічку.


Окрім того, знадобиться паяльна паста. У мене є тюбик, і він вже давно лежить. Спробував його з якимось дріб’язком і відклав із думкою, що колись буду паяти серйозні штуки, і ця паста мені знадобиться.

Минуло декілька років, і цей момент настав. Але, як виявилося, паста може пересихати, особливо якщо тюбик не закрити ретельно :) Раніше вона була майже рідкою, а зараз - як пластилін.

Якось вичавив та розмазав її по перехіднику. Пайку таких корпусів, та ще й на нижньому підігріві, роблю вперше — лише бачив на ютубі, як це робиться. Тому ані пропорцій, ані навичок у мене немає.


Далі одразу ставимо мікроконтролер CH32V203 так, щоб його відмітка 1-го піна (унікальний отвір під маркуванням) була якраз на 1-му піні перехідника.


AI підказує, що для початку треба цей «бутерброд» підігріти до 150°C та потримати так 80-90 секунд. При цьому має активуватися флюс у пасті. Далі потрібно нагріти все до 210-230 градусів і протримати таку температуру приблизно 10 секунд.

Ну і, звісно, перший раз не без проблем — пасти вийшло забагато, з усіх боків піни замкнені зайвим припоєм.

 


Беру мідну стрічку для зняття припою, щедро змащую все флюсом і прибираю зайве з кожного боку.


У результаті маємо чисті ніжки без жодних замикань.

 

Тепер підготую мікроконтролер до першого запуску. Заглядаємо в даташит:

Для запуску з мінімальною обв’язкою багато не треба: кілька конденсаторів та один резистор. Навіть зовнішній кварц не потрібен — мікроконтролер чудово працюватиме від внутрішнього осцилятора. Достатньо виконати кілька кроків:

  • Подати живлення: на піни 48, 36, 24 та 9 подаємо 3.3 В, а піни 47, 35, 23 та 8 підключаємо до землі (GND).

  • Конфігурувати BOOT0: пін BOOT0 (44) підтягуємо до землі через резистор на 10 кОм. Це вимикає режим програмування через UART.

  • Розпаяти інтерфейси для прошивки та відладки: припаюємо лінійку штирів PLS для ліній живлення, програмування (SWCLK (37) та SWDIO (34)), а також для виводу PA9 / USART TX (30), щоб побачити “Hello World” від мікроконтролера.

  • Встановити блокувальні конденсатори: за правилами, біля кожної пари виводів живлення має стояти окремий конденсатор на 100 нФ. Проте я трохи спростив схему й запаяв лише два конденсатори на пари 48–47 та 23–24 — вони там стають просто ідеально, прямо на самому перехіднику.

Кидаю дротяні перемички між чотирма точками живлення. Виглядає це вже не так естетично через купу дротів, але має працювати.


Далі я вирішив перевірити все це на незаплановані з’єднання. І тут вилазить проблема: між VDD та GND опір усього 1.6 Ома. Передивляюся всі пайки — ніде зайвих перемичок немає.

Гаразд, випаюю всю свою гірлянду дротів — проблема не зникає. Закрадається думка, що пробитий один із конденсаторів. Випаюю обидва — і нічого, піни 34 та 35 так і залишилися замкненими.

Розумію: певно, процесору кришка — перегрів його чи ще щось сталося. Дістаю плату з бредборда, щоб роздивитися ближче, і тут до мене доходить. Коли я паяв виводи PLS, то для зручності фіксації вставив усе в макетку. А там же контакти у вертикальних рядах з’єднані між собою! Саме це й призводило до того, що під час замірів я бачив КЗ.

Запаюю все назад: конденсатори, дроти та резистор.

До програматора під’єдную живлення, лінії SWD та UART RX. Перша перевірка - спробуємо зчитати ідентифікацію чіпа програматором. Під Linux я використовую minichlink із проєкту ch32fun.

$ ./minichlink -i
minichlink version - 37d4fcfc0646861cdea273a931cfbd6136a405c5
Found WCH Link
WCH Programmer is LinkE version 2.11
Detected CH32V203
Flash Storage: 64 kB
Part UUID: e2-4a-ab-cd-4b-c2-bd-ab
Part Type: 20-31-05-00
Read protection: disabled
Interface Setup
USER/RDPR  : c03f/5aa5
DATA1/DATA0: ff00/ff00
WRPR1/WRPR0: 00ff/00ff
WRPR3/WRPR2: 00ff/00ff
R32_ESIG_UNIID1: e24aabcd
R32_ESIG_UNIID2: 4bc2bdab
R32_ESIG_UNIID3: e339e339

Чудово! Чіп прочитався. Наступний крок — запис тестової прошивки “Hello World”. Для програмування я використовую VS Code + PlatformIO. Код тестової прошивки, що буде відправляти дані в UART і “смикати” піном PA5:

#include <ch32v20x.h>
#include <debug.h>

#define BLINKY_GPIO_PORT GPIOA
#define BLINKY_GPIO_PIN GPIO_Pin_5
#define BLINKY_CLOCK_ENABLE RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE)

void NMI_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
void HardFault_Handler(void) __attribute__((interrupt("WCH-Interrupt-fast")));

int main(void) {
    SystemCoreClockUpdate();
    Delay_Init();
    USART_Printf_Init(9600);

    GPIO_InitTypeDef GPIO_InitStructure = {0};
    BLINKY_CLOCK_ENABLE;
    GPIO_InitStructure.GPIO_Pin = BLINKY_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(BLINKY_GPIO_PORT, &GPIO_InitStructure);

    uint8_t ledState = 0;
    while (1) {
        GPIO_WriteBit(BLINKY_GPIO_PORT, BLINKY_GPIO_PIN, ledState);
        ledState ^= 1;
        printf("Hello World\r\n");
        Delay_Ms(1000);
    }
    return 0;
}

void NMI_Handler(void) {}
void HardFault_Handler(void)
{
    while (1)
    {
    }
}

Заливаю прошивку, запускаю монітор послідовного порту й бачу очікуваний напис “Hello World”:


Чип живий і працює!

Пайка багатовивідних корпусів на кшталт LQFP48 у домашніх умовах спочатку виглядає лячно, але на практиці виявилася цілком реальною задачею. Навіть якщо у вас, як і в мене, стара підсохла паяльна паста та нуль досвіду роботи з нижнім підігрівом - ситуацію завжди врятує хороший флюс і мідна стрічка для зняття припою.

Коментарі

Популярні дописи з цього блогу

Огляд DC-DC Step-down Buck перетворювачів

ESP8266 модуль з OLED екраном (HW-364A)

Модуль PD тригер IP2721 на 15 та 20 вольт