<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Embedded Notes — Davide Carrese</title>
    <link>https://blog.carrese.eu/</link>
    <description>Daily practical notes on STM32, STM8, STM32U5, STM32F4, Embedded C/C++, firmware debugging, testing and product delivery.</description>
    <language>en</language>
    <lastBuildDate>Mon, 06 Jul 2026 06:21:31 +0000</lastBuildDate>
    <atom:link href="https://blog.carrese.eu/feed.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>STM32 CRC Peripheral: Hardware Checksum for Data Integrity, Bootloader Verification, and Communication</title>
      <link>https://blog.carrese.eu/articles/2026-07-06-stm32-crc-peripheral-hardware-checksum/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-06-stm32-crc-peripheral-hardware-checksum/</guid>
      <pubDate>Mon, 06 Jul 2026 08:00:00 +0000</pubDate>
      <description>A practical register-level guide to the STM32 CRC calculation unit: polynomial configuration, data alignment, one-shot and streaming usage, bootloader integrity checks, and communication CRC.</description>
      <category>STM32</category><category>CRC</category><category>Data Integrity</category><category>Bootloader</category><category>Embedded</category>
    </item>
    <item>
      <title>The Git Workflow That Actually Works for Firmware Teams</title>
      <link>https://blog.carrese.eu/articles/2026-07-05-git-workflow-firmware-teams/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-05-git-workflow-firmware-teams/</guid>
      <pubDate>Sun, 05 Jul 2026 08:00:00 +0000</pubDate>
      <description>A practical, battle-tested Git branching strategy and workflow for embedded firmware teams: handling binary files, CI integration, release management, and avoiding the Git mess that plagues every hardware project.</description>
      <category>GIT</category><category>PROCESS</category><category>TOOLING</category><category>FIRMWARE</category><category>CI</category><category>CD</category>
    </item>
    <item>
      <title>STM32 USART Interrupt-Driven Communication — Register-Level Configuration on STM32F4</title>
      <link>https://blog.carrese.eu/articles/2026-07-04-stm32-usart-interrupt-register-level/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-04-stm32-usart-interrupt-register-level/</guid>
      <pubDate>Sat, 04 Jul 2026 08:00:00 +0000</pubDate>
      <description>Complete register-level guide to STM32F4 USART interrupt-driven TX/RX: baud rate generation, data format, TXE/RXNE/TC interrupt management, overrun/framing error handling, ring buffer implementation, and a practical GPS module communication example.</description>
      <category>STM32</category><category>USART</category><category>Register-Level</category><category>Interrupts</category><category>STM32F4</category><category>Embedded</category>
    </item>
    <item>
      <title>How I Built a Client Pipeline as an Embedded Contractor</title>
      <link>https://blog.carrese.eu/articles/2026-07-03-building-embedded-contractor-client-network/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-03-building-embedded-contractor-client-network/</guid>
      <pubDate>Fri, 03 Jul 2026 08:00:00 +0000</pubDate>
      <description>A practical guide to building a steady stream of embedded firmware contracting opportunities: outreach strategies, networking, lead qualification, and maintaining long-term client relationships.</description>
      <category>CLIENTS</category><category>FREELANCE</category><category>NETWORK</category><category>CONTRACTOR</category>
    </item>
    <item>
      <title>STM32 SPI Master Full-Duplex — Register-Level Configuration on STM32F4</title>
      <link>https://blog.carrese.eu/articles/2026-07-02-stm32-spi-register-master-full-duplex/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-02-stm32-spi-register-master-full-duplex/</guid>
      <pubDate>Thu, 02 Jul 2026 08:00:00 +0000</pubDate>
      <description>Complete register-level guide to configuring STM32 SPI in full-duplex master mode on STM32F4: clock polarity/phase, baud rate, data frame format, NSS management, and interrupt-driven data exchange with C code.</description>
      <category>STM32</category><category>SPI</category><category>Register-Level</category><category>STM32F4</category><category>Embedded</category>
    </item>
    <item>
      <title>Writing Firmware Specifications That Clients and Engineers Both Actually Use</title>
      <link>https://blog.carrese.eu/articles/2026-07-01-firmware-specifications-client-engineer/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-07-01-firmware-specifications-client-engineer/</guid>
      <pubDate>Wed, 01 Jul 2026 08:00:00 +0000</pubDate>
      <description>Most firmware specifications are either too vague for engineers or too technical for clients. Here is a practical framework for writing specs that both sides actually read and use.</description>
      <category>SPECS</category><category>CLIENTS</category><category>COMMUNICATION</category><category>PROCESS</category>
    </item>
    <item>
      <title>How I Run Code Reviews for Firmware Teams (And Why Most Reviews Waste Everyone&#x27;s Time)</title>
      <link>https://blog.carrese.eu/articles/2026-06-29-firmware-code-review-culture/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-29-firmware-code-review-culture/</guid>
      <pubDate>Mon, 29 Jun 2026 08:00:00 +0000</pubDate>
      <description>Code reviews in firmware teams often degenerate into rubber-stamping or pedantic style wars. Here is a practical system for reviews that actually catch bugs, share knowledge, and ship faster.</description>
      <category>CODE-REVIEW</category><category>TEAM</category><category>PROCESS</category><category>EMBEDDED</category>
    </item>
    <item>
      <title>STM32 PVD (Programmable Voltage Detector):Replacing External Supervisor ICs with On-Chip Brownout Detection</title>
      <link>https://blog.carrese.eu/articles/2026-06-27-stm32-pvd-programmable-voltage-detector/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-27-stm32-pvd-programmable-voltage-detector/</guid>
      <pubDate>Sat, 27 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 Programmable Voltage Detector (PVD) at register level: threshold selection, interrupt and event mode, brownout detection without an external supervisor IC. Practical example on STM32G4 and STM32U5.</description>
      <category>STM32</category><category>PVD</category><category>Brownout</category><category>Power Management</category><category>Embedded</category>
    </item>
    <item>
      <title>Why Firmware Estimates Are Always Wrong (And How to Fix Them)</title>
      <link>https://blog.carrese.eu/articles/2026-06-27-firmware-estimates-contractor-guide/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-27-firmware-estimates-contractor-guide/</guid>
      <pubDate>Sat, 27 Jun 2026 08:00:00 +0000</pubDate>
      <description>Firmware estimation is notoriously unreliable. Here is a practical framework for embedded contractors to estimate firmware tasks accurately, handle scope creep, and communicate timelines to clients without overpromising.</description>
      <category>CAREER</category><category>FIRMWARE</category><category>ESTIMATION</category><category>CONTRACTOR</category><category>MANAGEMENT</category>
    </item>
    <item>
      <title>STM32 I2C Master Mode:Register-Level Configuration and Error Handling</title>
      <link>https://blog.carrese.eu/articles/2026-06-25-stm32-i2c-master-register-error-handling/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-25-stm32-i2c-master-register-error-handling/</guid>
      <pubDate>Thu, 25 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 I2C master mode at register level: timing calculation, transmit/receive sequence, NACK handling, arbitration lost, bus recovery, and a practical sensor-read example for G4, H7, and U5 series.</description>
      <category>STM32</category><category>I2C</category><category>Register-Level</category><category>Error Handling</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 MPU Configuration:Protecting Memory Regions in Production Firmware</title>
      <link>https://blog.carrese.eu/articles/2026-06-23-stm32-mpu-memory-protection-configuration/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-23-stm32-mpu-memory-protection-configuration/</guid>
      <pubDate>Tue, 23 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 MPU (Memory Protection Unit) configuration at register and CMSIS level: set up region attributes, subregions, and privilege separation for production firmware on Cortex-M3/M4/M7/M33.</description>
      <category>STM32</category><category>MPU</category><category>Cortex-M</category><category>Memory Protection</category><category>Embedded</category><category>Firmware</category>
    </item>
    <item>
      <title>STM32 HardFault debugging — reading Cortex-M fault registers without a debugger</title>
      <link>https://blog.carrese.eu/articles/2026-06-22-stm32-hardfault-debug-register-level/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-22-stm32-hardfault-debug-register-level/</guid>
      <pubDate>Mon, 22 Jun 2026 08:00:00 +0000</pubDate>
      <description>Practical guide to recovering HardFault root cause on STM32 by reading CFSR, HFSR, and stacked context from firmware — no JTAG/SWD needed.</description>
      <category>STM32</category><category>Cortex-M</category><category>Fault</category><category>Debugging</category>
    </item>
    <item>
      <title>STM32 Flash Option Bytes:RDP Levels, BOR Configuration, Boot Modes, and OTP Programming at Register Level</title>
      <link>https://blog.carrese.eu/articles/2026-06-21-stm32-flash-option-bytes-rdp-otp/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-21-stm32-flash-option-bytes-rdp-otp/</guid>
      <pubDate>Sun, 21 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 flash option bytes: configure read protection (RDP Level 0/1/2), BOR threshold, boot mode, and one-time programmable (OTP) area at register level. Practical examples for STM32F4, L4, G4, and U5.</description>
      <category>STM32</category><category>Flash</category><category>Option Bytes</category><category>RDP</category><category>BOR</category><category>OTP</category><category>Boot</category><category>STM32F4</category><category>STM32L4</category><category>STM32G4</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 RTC Backup Domain:VBAT, Backup Registers, Tamper Detection, and Wake-Up from Low-Power Modes</title>
      <link>https://blog.carrese.eu/articles/2026-06-20-stm32-rtc-backup-domain-tamper-wakeup/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-20-stm32-rtc-backup-domain-tamper-wakeup/</guid>
      <pubDate>Sat, 20 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 RTC backup domain: configure VBAT-powered RTC calendar, backup registers, tamper detection with timestamp, and wake-up from STOP/STANDBY modes. Register-level examples for STM32F4, L4, G4, U5.</description>
      <category>STM32</category><category>RTC</category><category>Backup Domain</category><category>VBAT</category><category>Tamper</category><category>Wake-Up</category><category>Low-Power</category><category>STM32F4</category><category>STM32L4</category><category>STM32G4</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 DAC with Timer Trigger + DMA:Generating Arbitrary Waveforms Without CPU Overhead</title>
      <link>https://blog.carrese.eu/articles/2026-06-19-stm32-dac-timer-trigger-dma-waveform/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-19-stm32-dac-timer-trigger-dma-waveform/</guid>
      <pubDate>Fri, 19 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 DAC with timer-triggered DMA: configure the DAC at register level, use TIM6 as update trigger, and stream arbitrary waveform samples via circular DMA without CPU intervention. Practical STM32F4/G4/L4 examples.</description>
      <category>STM32</category><category>DAC</category><category>DMA</category><category>Timer</category><category>STM32F4</category><category>STM32G4</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 FPU Configuration at Register Level:Enabling, Lazy Stacking, and Hard Fault Pitfalls</title>
      <link>https://blog.carrese.eu/articles/2026-06-18-stm32-fpu-configuration-register-level/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-18-stm32-fpu-configuration-register-level/</guid>
      <pubDate>Thu, 18 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 FPU configuration at register level on Cortex-M4 and M7: enabling the FPU via CPACR, lazy stacking, compiler ABI flags, and the most common hard fault causes. Practical guide for senior embedded engineers.</description>
      <category>STM32</category><category>FPU</category><category>Cortex-M4</category><category>Cortex-M7</category><category>ARM</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 System Memory Bootloader:Flashing Firmware Without a Debugger</title>
      <link>https://blog.carrese.eu/articles/2026-06-17-stm32-system-bootloader-uart-dfu/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-17-stm32-system-bootloader-uart-dfu/</guid>
      <pubDate>Wed, 17 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 System Memory Bootloader: access the ROM bootloader via USART, I2C, SPI, CAN FD, and USB DFU. Practical guide to production programming, field updates, and brick recovery without a debugger.</description>
      <category>STM32</category><category>Bootloader</category><category>UART</category><category>DFU</category><category>Production</category><category>Field-Upgrade</category>
    </item>
    <item>
      <title>STM32 Clock Security System (CSS):Detecting and Recovering from HSE Failure</title>
      <link>https://blog.carrese.eu/articles/2026-06-16-stm32-clock-security-system-css/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-16-stm32-clock-security-system-css/</guid>
      <pubDate>Tue, 16 Jun 2026 08:00:00 +0000</pubDate>
      <description>STM32 Clock Security System (CSS): detect HSE failure at runtime, handle NMI, and implement a safe fallback strategy for production firmware.</description>
      <category>STM32</category><category>RCC</category><category>CSS</category><category>HSE</category><category>NMI</category><category>Safety</category>
    </item>
    <item>
      <title>STM32 IWDG Watchdog:Silent Reset Prevention in Production Firmware</title>
      <link>https://blog.carrese.eu/articles/2026-06-15-stm32-iwdg-watchdog-production/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-15-stm32-iwdg-watchdog-production/</guid>
      <pubDate>Mon, 15 Jun 2026 08:00:00 +0000</pubDate>
      <description>Master the STM32 Independent Watchdog (IWDG): LSI clock, prescaler, reload register, window option, debug freeze, proper feeding patterns, reset-cause detection, and a complete production-grade template for STM32F4/STM32U5.</description>
      <category>STM32</category><category>IWDG</category><category>Watchdog</category><category>STM32F4</category><category>STM32U5</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32H7 D-Cache Coherency:The DMA Pitfall Every Embedded Engineer Must Understand</title>
      <link>https://blog.carrese.eu/articles/2026-06-14-stm32h7-dcache-dma-coherency/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-14-stm32h7-dcache-dma-coherency/</guid>
      <pubDate>Sun, 14 Jun 2026 08:00:00 +0000</pubDate>
      <description>Master STM32H7 data cache maintenance for DMA buffers: SCB_CleanDCache, SCB_InvalidateDCache, SCB_CleanInvalidateDCache, MPU memory type configuration, and a practical template to avoid stale-data corruption on Cortex-M7 peripherals.</description>
      <category>STM32</category><category>STM32H7</category><category>DMA</category><category>D-Cache</category><category>Cortex-M7</category><category>MPU</category><category>Embedded</category>
    </item>
    <item>
      <title>STM32 Flash Dual Bank Mode:Enabling Bank Swap for Safe OTA Updates on G4, L4 and U5</title>
      <link>https://blog.carrese.eu/articles/2026-06-13-stm32-dual-bank-flash-swap-ota/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-13-stm32-dual-bank-flash-swap-ota/</guid>
      <pubDate>Sat, 13 Jun 2026 08:00:00 +0000</pubDate>
      <description>Configure STM32 dual-bank flash mode: option byte programming for bank organization, bank swapping via FLASH_OPTCR, interrupt vector table relocation, and a complete safe OTA update architecture with fallback on STM32G4/L4/U5.</description>
      <category>STM32</category><category>Flash</category><category>Dual Bank</category><category>OTA</category><category>Bootloader</category><category>G4</category><category>L4</category><category>U5</category>
    </item>
    <item>
      <title>STM32 RCC Clock Configuration at Register Level:HSI, HSE, PLL, and System Clock Switching on STM32F4</title>
      <link>https://blog.carrese.eu/articles/2026-06-12-stm32-rcc-clock-config-pll-register/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-12-stm32-rcc-clock-config-pll-register/</guid>
      <pubDate>Fri, 12 Jun 2026 08:00:00 +0000</pubDate>
      <description>Configure the STM32F4 clock tree entirely through registers: HSI/HSE oscillator startup, PLL configuration (M/N/P/Q dividers), AHB/APB prescalers, and glitch-free system clock switching. Register-level walkthrough with a practical 168 MHz setup example.</description>
      <category>STM32</category><category>RCC</category><category>Clock</category><category>PLL</category><category>Register-Level</category><category>STM32F4</category>
    </item>
    <item>
      <title>STM32 EXTI at Register Level:SYSCFG, GPIO Interrupt Mapping, and NVIC Wiring</title>
      <link>https://blog.carrese.eu/articles/2026-06-11-stm32-exti-external-interrupt-register-level/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-11-stm32-exti-external-interrupt-register-level/</guid>
      <pubDate>Thu, 11 Jun 2026 08:00:00 +0000</pubDate>
      <description>Configure STM32 EXTI external interrupts without HAL: SYSCFG_EXTICR GPIO mapping, EXTI rising/falling edge triggers, interrupt mask, pending flag clearing, and NVIC integration. Register-level walkthrough on STM32F4 with a practical push-button example.</description>
      <category>STM32</category><category>EXTI</category><category>Interrupt</category><category>GPIO</category><category>Register-Level</category><category>NVIC</category>
    </item>
    <item>
      <title>STM32 Advanced Timer PWM:Dead-Time Insertion and Complementary Outputs</title>
      <link>https://blog.carrese.eu/articles/2026-06-10-stm32-advanced-timer-pwm-deadtime-complementary/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-10-stm32-advanced-timer-pwm-deadtime-complementary/</guid>
      <pubDate>Wed, 10 Jun 2026 08:00:00 +0000</pubDate>
      <description>Configure TIM1/TIM8 advanced-control timers for centre-aligned PWM with dead-time insertion and complementary CHxN outputs. Register-level walkthrough on STM32F4: BDTR, CCMR, CCER, ARR/CCR, break inputs, and a full half-bridge motor-control example.</description>
      <category>STM32</category><category>TIM1</category><category>PWM</category><category>Dead-Time</category><category>Register-Level</category>
    </item>
    <item>
      <title>STM32 bxCAN: Filter Configurationand Message Handling</title>
      <link>https://blog.carrese.eu/articles/2026-06-09-stm32-bxcan-filter-config-message-handling/</link>
      <guid isPermaLink="true">https://blog.carrese.eu/articles/2026-06-09-stm32-bxcan-filter-config-message-handling/</guid>
      <pubDate>Tue, 09 Jun 2026 08:00:00 +0000</pubDate>
      <description>Complete guide to STM32 bxCAN filter banks: 32-bit vs 16-bit scaling, mask vs list mode, HAL_CAN and register-level configuration, message transmission/reception, and a practical dual-board communication example.</description>
      <category>Embedded</category>
    </item>
  </channel>
</rss>
