Публікації

Показано дописи з вересень, 2026

Програмний 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. У коді програми, замість стандартної ініціалізаці...