Публікації

Програмний I2C проти апаратного: запускаємо U8x8 на CH32V003

Зображення
У проєкті з OLED-дисплеєм та мікроконтролером STM32F103 виниклопитання : чи можна це здешевити? Що, якщо використати CH32V003? Багато ніжок не потрібно, корпусу SOP16 вистачить. Головне питання — як він працюватиме з OLED SSD1306. Перевіримо це. Як я писав раніше, U8x8 має легко портуватися і може працювати з програмним I2C (bit-bang). Перенесення коду з CMSIS пройшло дуже швидко — кілька чашок кави, і приклад у мене запрацював. Ось код функції u8x8_gpio_and_delay_ch32v : uint8_t u8x8_gpio_and_delay_ch32v(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { switch(msg) { case U8X8_MSG_GPIO_AND_DELAY_INIT: RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitTypeDef init = {0}; init.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_2; init.GPIO_Mode = GPIO_Mode_Out_OD; init.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOA, &init); break; case U8X8_MSG_DELAY_MILLI: De...

Портуємо U8x8 на STM32 CMSIS

Зображення
Для Arduino є доволі популярна бібліотека для монохромних екранів - U8g2 . Ця бібліотека має дві незалежні підсистеми: U8g2 — для малювання різних графічних елементів та u8x8 — суто для тексту. І сьогодні мені потрібно запустити u8x8 на STM32 без Arduino, у чистому CMSIS-проєкті. У мене є PlatformIO-проєкт, тому першим кроком я додаю в нього залежність від U8g2: [env:genericSTM32F103C8] platform = ststm32 board = genericSTM32F103C8 framework = cmsis upload_protocol = cmsis-dap debug_tool = cmsis-dap lib_deps = olikraus/U8g2 lib_compat_mode = off Параметр lib_compat_mode = off вимикає перевірку сумісності, інакше PlatformIO не додасть бібліотеку до збірки, оскільки вона призначена для фреймворку Arduino. Наш початковий код — поки що майже порожній, ініціалізуємо лише таймер. Будемо працювати від внутрішнього RC-генератора на частоті 8 МГц. #include "stm32f1xx.h" volatile uint32_t ms_ticks = 0 ; extern "C" void SysTick_Handler ( void ) { m...

Дебаг на CH32V00x та SDI Print

Зазвичай для відлагодження коду я використовую логування через UART TX. Проте іноді цей спосіб недоступний: апаратний UART може бути зайнятий іншою периферією, або ж під час розводки плати лінію TX просто не вивели, бо вона здавалася непотрібною. Але відлагоджувати прошивку якось треба. Для мікроконтролерів серії CH32V існує чудова альтернатива UART - механізм SDI Print (Serial Debug Interface) . Він дозволяє відправляти лог-повідомлення через єдиний дріт програмування та читати їх на ПК. На апаратному рівні для передачі даних використовуються два 32-бітні регістри: #define DEBUG_DATA0_ADDRESS ((volatile uint32_t*)0xE00000F4) #define DEBUG_DATA1_ADDRESS ((volatile uint32_t*)0xE00000F8) Спосіб взаємодії з цими регістрами кардинально відрізняється залежно від обраного фреймворку: офіційного від WCH (noneos-sdk) чи мінімалістичного ch32fun . У цій інструкції я опишу, як налаштувати логування саме для офіційного фреймворку від WCH. У коді програми, замість стандартної ініціалізаці...

PD/QC модуль на базі XPM52C

Зображення
Сьогодні хочу оглянути та потестувати простий модуль для PD/QC зарядки. Він побудований на чіпі XPM52C — це синхронний buck-конвертер, який обіцяє видавати аж до 65 Вт на виході (трохи далі ми це перевіримо). Цей модуль не брендований, але трапляються й дуже схожі з маркуванням CKCS U1E, які мають якісніше виготовлену плату та зручні пази для кріплення. Чип підтримує широкий спектр протоколів, включаючи USB PD 3.1, Qualcomm QC 2.0/3.0/3.0+, Huawei FCP/SCP, Samsung AFC, VOOC 2.0/4.0 та інші, що забезпечує універсальну сумісність. Основними особливостями є підтримка вхідної напруги до 31 В, вихідна напруга в діапазоні 3,3–21 В, вбудована технологія XPD-LINK™ для інтелектуального керування живленням, а також повний набір захисних механізмів (від перенапруги, короткого замикання, перегріву тощо). Завдяки своїм характеристикам, XPM52C є комплексним рішенням для автомобільних зарядних пристроїв, портативного обладнання та інтелектуальних розеток, постачаючись у компактному корпусі QFN4x4-...

Як працює розбиття Flash-пам’яті в ESP32

Зображення
Організація Flash-памʼяті в ESP32 дуже нагадує мені те, як це було з жорсткими дисками на ПК за часів MBR. Там так само є завантажувач, таблиця розділів і, власне, розділи з даними. І яким би не був розмір флешу, правила розбиття не змінюються. Зазвичай таблиця розділів починається за адресою 0x8000 і займає 4 КБ. Але в деяких випадках може знадобитись більший розмір завантажувача, і доводится здвигати таблицю розділів далі. Cтруктура одного запису в таблиці розділів виглядає так: struct PartitionEntry { uint8_t magic ; // Магічне число для валідації запису uint8_t type ; // Тип розділу uint8_t subtype ; // Підтип розділу uint8_t reserved ; // Зарезервовано uint32_t offset ; // Зсув розділу у флеш-пам'яті uint32_t size ; // Розмір розділу char name [ 16 ]; // Ім'я розділу uint32_t flags ; // Прапори розділу }; Проте не варто жорстко на неї спиратися, у різн...

Як додати підтримку CH32V до Platform.IO

Зображення
CH32V — це доволі дешеві мікроконтролери архітектури RISC-V від WinChipHead (Nanjing Qinheng Microelectronics). Також є CH32F — це мікроконтролери на архітектурі ARM. Для початку нам знадобляться дві речі: Відлагоджувальна плата (девборда) CR-CH32VXX з CH32V003 — це один із найдешевших мікроконтролерів. Та WCH-LinkE — програматор для CH32V. У продажу є прості WCH-Link , але для серії CH32V00x вони не підходять, бо вона використовує однодротовий протокол програмування та відлагодження. А він підтримується лише в дорожчому WchLinkE. До речі, є проєкти, які з RP2040 роблять подібний програматор, але офіційні утиліти (MounRiver Studio) не підтримують нічого, окрім WCH-Link. Але я і не використовую офіційну IDE. Тому, напевно, найближчим часом спробую це зробити та описати методику. Чому я використовую PlatformIO, а не MounRiver Studio? З одного боку, MounRiver Studio є для Linux, який є моєю основною ОС для роботи. Але з іншого — коли я спробував її встановити і вона почала вима...