Power-Off Reset: Як розблокувати CH32V003 у корпусі SOP-8

Продовжую розбиратися з мікроконтролерами CH32V. Сьогодні в мене на столі малюк CH32V003J4M6 у корпусі SOP-8.




Це найменший корпус із мінімумом пінів — 2 йдуть на живлення, і 6 залишаються доступними для використання. У ньому немає навіть піна апаратного скидання (NRST).

Як і інші мікроконтролери серії CH32V00x, він програмується по одному дроту SWIO (8-й пін). І ось тут криється цікава проблема: якщо ініціалізувати цей пін у прошивці під інші задачі, він перестає працювати як SWIO. Після цього запрограмувати чіп стандартним способом стає неможливо.

Наприклад, такий код виводить “Hello world” в UART:

#include <ch32v00x.h>
#include <debug.h>

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);

    while (1) {
        printf("Hello world from CH32V003\r\n");
        Delay_Ms(1000);
    }
    return 0;
}

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

Я використовую PlatformIO з пакетом підтримки ch32v. Уперше цей код прошивається без проблем, але при спробі оновити прошивку вдруге я отримав помилку:

WCH-LinkE більше не бачить мікроконтролер. І жодна з опцій minichlink мені не допомогла. Тому довелося взяти комп’ютер з Windows і запустити на ньому офіційну утиліту WCH-LinkUtility.


У полі Series потрібно обрати CH32V003, а потім перейти в меню Target.


У ньому є пункт “Clear All Code Flash-By Power off” — саме він зараз і потрібен. Ця опція знімає та знову подає живлення на мікроконтролер, встигаючи надіслати команду на очищення пам’яті до старту самої прошивки. Після цього мікроконтролер абсолютно чистий і знову чекає на прошивку.

Мені стало цікаво що ж там програматор передає на ch32v003 і я зняв логічну діаграму vdd/swio. Ось так виглядає цей процесс:

Мені стало цікаво, що ж там програматор передає на CH32V003, і я зняв логічну діаграму VDD/SWIO. Ось так виглядає цей процес:

Дамп також можна завантажити за цими посиланнями: CSV, DSView.

Лайфхак - щоб більше не потрапляти в таку халепу, можна додати Delay_Ms(2000) перед ініціалізацією UART. З такою затримкою в мене без проблем працює скидання через minichlink -u. Або ж, маючи спритні руки, можна подати живлення на мікроконтролер і миттєво запустити процес прошивання — це теж спрацьовує.


Коментарі

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

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

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

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