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. Або ж, маючи спритні руки, можна подати
живлення на мікроконтролер і миттєво запустити процес прошивання — це
теж спрацьовує.







Коментарі
Дописати коментар