Mastering STM32 - Second Edition
Mastering STM32 - Second Edition
A step-by-step guide to the most complete ARM Cortex-M platform, using the official STM32Cube development environment
About the Book
This is the second edition of the most complete book about the STM32 family of 32‑bit Flash microcontrollers from ST Microelectronics based on the ARM® Cortex®‑M architecture. The book will guide you in a clear and practical way to this hardware platform and the official ST CubeHAL and STM32CubeIDE, showing its functionalities with a lot of examples and tutorials. The book assumes that you are totally new to this family of MCUs, and it will start showing how to setup the tool-chain to build your STM32 based applications.
The book is addressed both to professionals and to fans of this platform, like hobbyists and students. The book examples are based on nine Nucleo-64 boards from ST.
This second edition is composed by twenty-eight chapters, divided in about 900 pages. They cover:
- Introduction to Cortex-M and STM32 microcontrollers.
- How to setup the STM32CubeIDE tool-chain in Windows, Linux and Mac OSX.
- How to use STM32CubeMX to generate application skeleton.
- Introduction to the debugging of STM32 applications.
- GPIO management.
- NVIC controller.
- UART peripheral.
- DMA controller.
- STM32 clock tree and its configuration.
- Basic, general purpose and advanced STM32 timers.
- ADC peripheral.
- DAC controller.
- I2C bus and protocol.
- SPI bus.
- CRC peripheral.
- IWDG and WWDG timers.
- RTC clock.
- Power management.
- The memory layout of an STM32 application and linker scripts.
- Flash memory management and the role of the ART Accelerator.
- The booting process in STM32 microcontrollers and how to write a custom bootloader.
- FreeRTOS 10.x and the tickless low-power mode.
- Advanced debugging techniques and how to use SEGGER tools to debug STM32 MCUs.
- FatFs Middleware.
- How to develop IoT applications with the W5500 Ethernet processor.
- USB 2.0 protocol and the STM32 USB Device Framework.
- How to design a custom board using an STM32 MCU.
The complete Table of Contents can be downloaded from here.
You can reach the author through the book website: http://www.carminenoviello.com/en/mastering-stm32/
The LeanPub platform works so that, once you buy the book, you receive all updates for free.
Table of Contents
-
-
Preface
- Who Is This Book For?
- How to Integrate This Book?
- How Is the Book Organized?
- Differences With the First Edition
- About the Author
- Errata and Suggestions
- Book Support
- How to Help the Author
- Copyright Disclaimer
- Credits
- Acknowledgments to the First Edition
-
Preface
-
I Introduction
-
1. Introduction to STM32 MCU Portfolio
-
1.1 Introduction to ARM Based Processors
-
1.1.1 Cortex and Cortex-M Based Processors
- 1.1.1.1 Core Registers
- 1.1.1.2 Memory Map
- 1.1.1.3 Bit-Banding
- 1.1.1.4 Thumb-2 and Memory Alignment
- 1.1.1.5 Pipeline
- 1.1.1.6 Interrupts and Exceptions Handling
- 1.1.1.7 SysTimer
- 1.1.1.8 Power Modes
- 1.1.1.9 TrustZone™
- 1.1.1.10 CMSIS
- 1.1.1.11 Effective Implementation of Cortex-M Features in the STM32 Portfolio
-
1.1.1 Cortex and Cortex-M Based Processors
-
1.2 Introduction to STM32 Microcontrollers
- 1.2.1 Advantages of the STM32 Portfolio….
- 1.2.2 ….And Its Drawbacks
-
1.3 A Quick Look at the STM32 Subfamilies
- 1.3.1 F0
- 1.3.2 F1
- 1.3.3 F2
- 1.3.4 F3
- 1.3.5 F4
- 1.3.6 F7
- 1.3.7 H7
- 1.3.8 L0
- 1.3.9 L1
- 1.3.10 L4
- 1.3.11 L4+
- 1.3.12 L5
- 1.3.13 U5
- 1.3.14 G0
- 1.3.15 G4
- 1.3.16 STM32WB
- 1.3.17 STM32WL
- 1.3.18 How to Select the Right MCU for You?
- 1.4 The Nucleo Development Board
-
1.1 Introduction to ARM Based Processors
-
2. Get In Touch With SM32CubeIDE
-
2.1 Why Choose STM32CubeIDE as Tool-Chain for STM32
- 2.1.1 Two Words About Eclipse…
- 2.1.2 … and GCC
-
2.2 Downloading and Installing the STM32CubeIDE
- 2.2.1 Windows - Installing the Tool-Chain
- 2.2.2 Linux - Installing the Tool-Chain
- 2.2.3 Mac - Installing the Tool-Chain
- 2.3 STM32CubeIDE overview
-
2.1 Why Choose STM32CubeIDE as Tool-Chain for STM32
-
3. Hello, Nucleo!
- 3.1 Create a Project
- 3.2 Adding Something Useful to the Generated Code
-
3.3 Connecting the Nucleo to the PC
- 3.3.1 ST-LINK Firmware Upgrade
- 3.4 Flashing the Nucleo using STM32CubeProgrammer
-
4. STM32CubeMX Tool
-
4.1 Introduction to CubeMX Tool
-
4.1.1 Target Selection Wizard
- 4.1.1.1 MCU/MPU Selector
- 4.1.1.2 Board Selector
- 4.1.1.3 Example Selector
- 4.1.1.4 Cross Selector
-
4.1.2 MCU and Middleware Configuration
- 4.1.2.1 Pinout View & Configuration
- 4.1.2.2 Clock Configuration View
- 4.1.3 Project Manager
- 4.1.4 Tools View
-
4.1.1 Target Selection Wizard
- 4.2 Understanding Project Structure
- 4.3 Downloading Book Source Code Examples
- 4.4 Management of STM32Cube Packages
-
4.1 Introduction to CubeMX Tool
-
5. Introduction to Debugging
- 5.1 What is Behind a Debug Session
-
5.2 Debugging With STM32CubeIDE
- 5.2.1 Views in the Debug Perspective
- 5.2.2 Debug Configurations
- 5.3 I/O Retargeting
-
1. Introduction to STM32 MCU Portfolio
-
II Diving into the HAL
-
6. GPIO Management
- 6.1 STM32 Peripherals Mapping and HAL Handlers
-
6.2 GPIOs Configuration
- 6.2.1 GPIO Mode
- 6.2.2 GPIO Alternate Function
- 6.3 Driving a GPIO
- 6.4 De-initialize a GPIO
-
7. Interrupts Management
-
7.1 NVIC Controller
- 7.1.1 Vector Table in STM32
-
7.2 Enabling Interrupts
- 7.2.1 External Lines and NVIC
- 7.2.2 Enabling Interrupts with CubeMX
- 7.3 Interrupt Lifecycle
-
7.4 Interrupt Priority Levels
- 7.4.1 Cortex-M0/0+
- 7.4.2 Cortex-M3/4/7/33
- 7.4.3 Setting Interrupt Priority in CubeMX
- 7.5 Interrupt Re-Entrancy
- 7.6 Mask All Interrupts at Once or an a Priority Basis
-
7.1 NVIC Controller
-
8. Universal Asynchronous Serial Communications
- 8.1 Introduction to UARTs and USARTs
-
8.2 UART Initialization
- 8.2.1 UART Configuration Using CubeMX
-
8.3 UART Communication in Polling Mode
- 8.3.1 Installing a Terminal Emulator in Eclipse
-
8.4 UART Communication in Interrupt Mode
- 8.4.1 UART Related Interrupts
- 8.5 Error Management
-
8.6 List of Available Callbacks in the
HAL_UART
Module
-
9. DMA Management
-
9.1 Introduction to DMA
- 9.1.1 The Need of a DMA and the Role of the Internal Buses
-
9.1.2 The DMA Controller
- 9.1.2.1 The DMA Implementation in F0/F1/F3/L0/L1/L4 MCUs
- 9.1.2.2 The DMA Implementation in F2/F4/F7 MCUs
- 9.1.2.3 The DMA Implementation in G0/G4/L4+/L5/H7 MCUs
-
9.2
HAL_DMA
Module-
9.2.1
DMA_HandleTypeDef
in F0/F1/F3/L0/L1/L4 HALs - 9.2.2 DMA Configuration in G0/G4/L4+/L5/H7 HALs
-
9.2.3
DMA_HandleTypeDef
in F2/F4/F7 HALs - 9.2.4 How to Perform DMA Transfers in Polling Mode
- 9.2.5 How to Perform DMA Transfers in Interrupt Mode
-
9.2.6 Using the
HAL_UART
Module with DMA Mode Transfers - 9.2.7 Programming the DMAMUX With the CubeHAL
-
9.2.8 Miscellaneous Functions From
HAL_DMA
andHAL_DMA_Ex
Modules
-
9.2.1
- 9.3 Using CubeMX to Configure DMA Requests
- 9.4 Correct Memory Allocation of DMA Buffers
- 9.5 A Case Study: The DMA Memory-To-Memory Transfer Performance Analysis
-
9.1 Introduction to DMA
-
10. Clock Tree
-
10.1 Clock Distribution
-
10.1.1 Overview of the STM32 Clock Tree
- 10.1.1.1 The Multispeed Internal RC Oscillator in STM32L/U Families
- 10.1.2 Configuring Clock Tree Using CubeMX
-
10.1.3 Clock Source Options in Nucleo Boards
-
10.1.3.1 Clock Source in Nucleo-64 rev. MB1136 (older ones with ST-LINK V2.1)
- 10.1.3.1.1 OSC Clock Supply
- 10.1.3.1.2 OSC 32kHz Clock Supply
-
10.1.3.2 Clock Source in Nucleo-64 rev. MB1367 (newer ones with ST-LINK v3)
- 10.1.3.2.1 OSC Clock Supply
- 10.1.3.2.2 OSC 32kHz Clock Supply
-
10.1.3.1 Clock Source in Nucleo-64 rev. MB1136 (older ones with ST-LINK V2.1)
-
10.1.1 Overview of the STM32 Clock Tree
-
10.2 Overview of the
HAL_RCC
Module- 10.2.1 Compute the Clock Frequency at Run-Time
- 10.2.2 Enabling the Master Clock Output
- 10.2.3 Enabling the Clock Security System
- 10.3 HSI Calibration
-
10.1 Clock Distribution
-
11. Timers
-
11.1 Introduction to Timers
- 11.1.1 Timer Categories in an STM32 MCU
- 11.1.2 Effective Availability of Timers in the STM32 Portfolio
-
11.2 Basic Timers
-
11.2.1 Using Timers in Interrupt Mode
- 11.2.1.1 Time Base Generation in Advanced Timers
- 11.2.2 Using Timers in Polling Mode
- 11.2.3 Using Timers in DMA Mode
- 11.2.4 Stopping a Timer
- 11.2.5 Using CubeMX to Configure a Basic Timer
-
11.2.1 Using Timers in Interrupt Mode
-
11.3 General Purpose Timers
-
11.3.1 Time Base Generator with External Clock Sources
- 11.3.1.1 External Clock Mode 2
- 11.3.1.2 External Clock Mode 1
- 11.3.1.3 Using CubeMX to Configure the Source Clock of a General Purpose Timer
-
11.3.2 Master/Slave Synchronization Modes
- 11.3.2.1 Enable Trigger-Related Interrupts
- 11.3.2.2 Using CubeMX to Configure the Master/Slave Synchronization
- 11.3.3 Generate Timer-Related Events by Software
- 11.3.4 Counting Modes
-
11.3.5 Input Capture Mode
- 11.3.5.1 Using CubeMX to Configure the Input Capture Mode
-
11.3.6 Output Compare Mode
- 11.3.6.1 Using CubeMX to Configure the Output Compare Mode
-
11.3.7 Pulse-Width Generation
- 11.3.7.1 Generating a Sinusoidal Wave Using PWM
- 11.3.7.2 Using CubeMX to Configure the PWM Mode
-
11.3.8 One Pulse Mode
- 11.3.8.1 Using CubeMX to Configure the OPM Mode
-
11.3.9 Encoder Mode
- 11.3.9.1 Using CubeMX to Configure the Encoder Mode
-
11.3.10 Other Features Available in General Purpose and Advanced Timers
- 11.3.10.1 Hall Sensor Mode
- 11.3.10.2 Combined Three-Phase PWM Mode and Other Motor-Control Related Features
- 11.3.10.3 Break Input and Locking of Timer Registers
- 11.3.10.4 Preloading of Auto-Reload Register
- 11.3.11 Debugging and Timers
-
11.3.1 Time Base Generator with External Clock Sources
-
11.4 SysTick Timer
- 11.4.1 Use Another Timer as System Timebase Source
- 11.5 A Case Study: How to Precisely Measure Microseconds with STM32 MCUs
-
11.1 Introduction to Timers
-
12. Analog-To-Digital Conversion
- 12.1 Introduction to SAR ADC
-
12.2
HAL_ADC
Module-
12.2.1 Conversion Modes
- 12.2.1.1 Single-Channel, Single Conversion Mode
- 12.2.1.2 Scan Single Conversion Mode
- 12.2.1.3 Single-Channel, Continuous Conversion Mode
- 12.2.1.4 Scan Continuous Conversion Mode
- 12.2.1.5 Injected Conversion Mode
- 12.2.1.6 Dual Modes
- 12.2.2 Channel Selection
- 12.2.3 ADC Resolution and Conversion Speed
- 12.2.4 A/D Conversions in Polling Mode
- 12.2.5 A/D Conversions in Interrupt Mode
-
12.2.6 A/D Conversions in DMA Mode
- 12.2.6.1 Convert Multiple Times the Same Channel in DMA Mode
- 12.2.6.2 Multiple and not Continuous Conversions in DMA Mode
- 12.2.6.3 Continuous Conversions in DMA Mode
- 12.2.7 Errors Management
- 12.2.8 Timer-Driven Conversions
- 12.2.9 Conversions Driven by External Events
- 12.2.10 ADC Calibration
-
12.2.1 Conversion Modes
- 12.3 Using CubeMX to Configure ADC Peripheral
-
13. Digital-To-Analog Conversion
- 13.1 Introduction to the DAC Peripheral
-
13.2
HAL_DAC
Module- 13.2.1 Driving the DAC Manually
- 13.2.2 Driving the DAC in DMA Mode Using a Timer
- 13.2.3 Triangular Wave Generation
- 13.2.4 Noise Wave Generation
-
14. I²C
-
14.1 Introduction to the I²C specification
-
14.1.1 The I²C Protocol
- 14.1.1.1 START and STOP Condition
- 14.1.1.2 Byte Format
- 14.1.1.3 Address Frame
- 14.1.1.4 Acknowledge (ACK) and Not Acknowledge (NACK)
- 14.1.1.5 Data Frames
- 14.1.1.6 Combined Transactions
- 14.1.1.7 Clock Stretching
- 14.1.2 Availability of I²C Peripherals in STM32 MCUs
-
14.1.1 The I²C Protocol
-
14.2
HAL_I2C
Module-
14.2.1 Using the I²C Peripheral in Master Mode
- 14.2.1.1 I/O MEM Operations
- 14.2.1.2 Combined Transactions
- 14.2.1.3 A Note About the Clock Configuration in STM32F0/L0/L4 families
- 14.2.2 Using the I²C Peripheral in Slave Mode
-
14.2.1 Using the I²C Peripheral in Master Mode
- 14.3 Using CubeMX to Configure the I²C Peripheral
-
14.1 Introduction to the I²C specification
-
15. SPI
-
15.1 Introduction to the SPI Specification
- 15.1.1 Clock Polarity and Phase
- 15.1.2 Slave Select Signal Management
- 15.1.3 SPI TI Mode
- 15.1.4 Availability of SPI Peripherals in STM32 MCUs
-
15.2
HAL_SPI
Module- 15.2.1 Exchanging Messages Using SPI Peripheral
- 15.2.2 Maximum Transmission Frequency Reachable using the CubeHAL
- 15.3 Using CubeMX to Configure SPI Peripheral
-
15.1 Introduction to the SPI Specification
-
16. Cyclic Redundancy Check
-
16.1 Introduction to CRC Computing
- 16.1.1 CRC Calculation in STM32F1/F2/F4/L1 MCUs
- 16.1.2 CRC Peripheral in STM32F0/F3/F7/L0/L4/L5/G0/G4 MCUs
-
16.2
HAL_CRC
Module
-
16.1 Introduction to CRC Computing
-
17. IWDG and WWDG Timers
-
17.1 The Independent Watchdog Timer
- 17.1.1 Using the CubeHAL to Program IWDG Timer
-
17.2 The System Window Watchdog Timer
- 17.2.1 Using the CubeHAL to Program WWDG Timer
- 17.3 Detecting a System Reset Caused by a Watchdog Timer
- 17.4 Freezing Watchdog Timers During a Debug Session
- 17.5 Selecting the Right Watchdog Timer for Your Application
-
17.1 The Independent Watchdog Timer
-
18. Real-Time Clock
- 18.1 Introduction to the RTC Peripheral
-
18.2
HAL_RTC
Module-
18.2.1 Setting and Retrieving the Current Date/Time
- 18.2.1.1 Correct Way to Read Date/Time Values
- 18.2.2 Configuring Alarms
- 18.2.3 Periodic Wakeup Unit
- 18.2.4 Timestamp Generation and Tamper Detection
-
18.2.5 RTC Calibration
- 18.2.5.1 RTC Coarse Calibration
- 18.2.5.2 RTC Smooth Calibration
- 18.2.5.3 Reference Clock Detection
-
18.2.1 Setting and Retrieving the Current Date/Time
- 18.3 Using the Backup SRAM
-
6. GPIO Management
-
III Advanced topics
-
19. Power Management
- 19.1 Power Management in Cortex-M Based MCUs
-
19.2 How Cortex-M MCUs Handle Run and Sleep Modes
-
19.2.1 Entering/exiting sleep modes
- 19.2.1.1 Sleep-On-Exit
- 19.2.2 Sleep Modes in Cortex-M Based MCUs
-
19.2.1 Entering/exiting sleep modes
-
19.3 Power Management in STM32F Microcontrollers
- 19.3.1 Power Sources
-
19.3.2 Power Modes
-
19.3.2.1 Run Mode
- 19.3.2.1.1 Dynamic Voltage Scaling in STM32F4/F7 MCUs
- 19.3.2.1.2 Over/Under-Drive Mode in STM32F4/F7 MCUs
- 19.3.2.2 Sleep Mode
- 19.3.2.3 Stop Mode
- 19.3.2.4 Standby Mode
- 19.3.2.5 Low-Power Modes Example
-
19.3.2.1 Run Mode
- 19.3.3 An Important Warning for STM32F1 Microcontrollers
-
19.4 Power Management in STM32L/G Microcontrollers
- 19.4.1 Power Sources
-
19.4.2 Power Modes
- 19.4.2.1 Run Modes
-
19.4.2.2 Sleep Modes
- 19.4.2.2.1 Batch Acquisition Mode
- 19.4.2.3 Stop Modes
- 19.4.2.4 Standby Modes
- 19.4.2.5 Shutdown Mode
- 19.4.3 Power Modes Transitions
-
19.4.4 Low-Power Peripherals
- 19.4.4.1 LPUART
- 19.4.4.2 LPTIM
- 19.4.4.3 LPGPIO
- 19.4.4.4 LPDMA
- 19.5 Power Supply Supervisors
- 19.6 Debugging in Low-Power Modes
- 19.7 Using the CubeMX Power Consumption Calculator
- 19.8 A Case Study: Using Watchdog Timers With Low-Power Modes
-
20. Memory layout
-
20.1 The STM32 Memory Layout Model
- 20.1.1 Flash Memory Typical Organization
- 20.1.2 SRAM Memory Typical Organization
- 20.1.3 Understanding Compilation and Linking Processes
-
20.2 The Really Minimal STM32 Application
- 20.2.1 ELF Binary File Inspection
-
20.2.2
.data
and.bss
Sections Initialization-
20.2.2.1 A Word About the
COMMON
Section
-
20.2.2.1 A Word About the
-
20.2.3
.rodata
Section - 20.2.4 Stack and Heap Regions
- 20.2.5 Checking the Size of Heap and Stack at Compile-Time
- 20.2.6 Differences With the Tool-Chain Script Files
-
20.3 How to Use the CCM Memory
- 20.3.1 Relocating the vector table in CCM Memory
-
20.4 How to Use the MPU in Cortex-M0+/3/4/7 Based STM32 MCUs
- 20.4.1 Programming the MPU With the CubeHAL
-
20.1 The STM32 Memory Layout Model
-
21. Flash Memory Management
- 21.1 Introduction to STM32 Flash Memory
-
21.2 The
HAL_FLASH
Module- 21.2.1 Flash Memory Unlocking
- 21.2.2 Flash Memory Erasing
- 21.2.3 Flash Memory Programming
- 21.2.4 Flash Read Access During Programming and Erasing
-
21.3 Option Bytes
- 21.3.1 Flash Memory Read Protection
- 21.4 Optional OTP and True-EEPROM Memories
-
21.5 Flash Read Latency and the ART™ Accelerator
-
21.5.1 The Role of the TCM Memories in STM32F7/H7 MCUs
- 21.5.1.1 How to Access Flash Memory Through the TCM Interface
- 21.5.1.2 Using CubeMX to Configure Flash Memory Interface
-
21.5.1 The Role of the TCM Memories in STM32F7/H7 MCUs
-
22. Booting Process
-
22.1 The Cortex-M Unified Memory Layout and the Booting Process
- 22.1.1 Software Physical Remap
- 22.1.2 Vector Table Relocation
- 22.1.3 Running the Firmware From SRAM Using the STM32CubeIDE
-
22.2 Integrated STM32 Bootloader
- 22.2.1 Starting the STM32 Bootloader from the On-Board Firmware
- 22.2.2 The Booting Sequence in the STM32CubeIDE Tool-chain
-
22.3 Developing a Custom Bootloader
- 22.3.1 Vector Table Relocation in STM32F0 Microcontrollers
-
22.3.2 How to Use the
flasher.py
Tool
-
22.1 The Cortex-M Unified Memory Layout and the Booting Process
-
23. Running FreeRTOS
- 23.1 Understanding the Concepts Underlying an RTOS
-
23.2 Configuring FreeRTOS and the CMSIS-RTOS v2 Wrapper
-
23.2.1 The FreeRTOS Source Tree
- 23.2.1.1 How to Configure FreeRTOS Using CubeMX
-
23.2.1 The FreeRTOS Source Tree
-
23.3 Thread Management
- 23.3.1 Thread States
- 23.3.2 Thread Priorities and Scheduling Policies
- 23.3.3 Voluntary Release of the Control
- 23.3.4 The idle Thread
-
23.4 Memory Allocation and Management
-
23.4.1 Dynamic Memory Allocation Model
-
23.4.1.1
heap_1.c
-
23.4.1.2
heap_2.c
-
23.4.1.3
heap_3.c
-
23.4.1.4
heap_4.c
-
23.4.1.5
heap_5.c
- 23.4.1.6 FreeRTOS Heap Definition
-
23.4.1.1
-
23.4.2 Static Memory Allocation Model
- 23.4.2.1 idle Thread Allocation with Static Memory Allocation Model
-
23.4.3 FreeRTOS and the C stdlib
-
23.4.3.1 How to Configure
newlib
to Handle Concurrency with FreeRTOS -
23.4.3.2 How to Use
malloc()
andmalloc()
-dependantnewlib
Functions With FreeRTOS - 23.4.3.3 STM32CubeMX Approach to Thread-Safety
-
23.4.3.1 How to Configure
- 23.4.4 Memory Pools
- 23.4.5 Stack Overflow Detection
-
23.4.1 Dynamic Memory Allocation Model
-
23.5 Synchronization Primitives
- 23.5.1 Message Queues
- 23.5.2 Semaphores
- 23.5.3 Event and Thread Flags
-
23.6 Resources Management and Mutual Exclusion
-
23.6.1 Mutexes
- 23.6.1.1 The Priority Inversion Problem
- 23.6.1.2 Recursive Mutexes
- 23.6.2 Critical Sections
-
23.6.3 Interrupt Management With an RTOS
- 23.6.3.1 FreeRTOS API and Interrupt Priorities
-
23.6.1 Mutexes
-
23.7 Software Timers
- 23.7.1 How FreeRTOS Manages Timers
-
23.8 A Case Study: Low-Power Management With an RTOS
- 23.8.1 The idle Thread Hook
-
23.8.2 The Tickless Mode in FreeRTOS
- 23.8.2.1 A Schema for the tickless Mode
- 23.8.2.2 A Custom tickless Mode Policy
-
23.9 Debugging Features
-
23.9.1
configASSERT()
Macro - 23.9.2 Run-Time Statistics and Thread State Information
- 23.9.3 FreeRTOS Debugging in STM32CubeIDE
- 23.9.4 FreeRTOS Kernel-Aware Debugging in STM32CubeIDE
-
23.9.1
-
23.10 Alternatives to FreeRTOS
- 23.10.1 AzureRTOS
- 23.10.2 ChibiOS
- 23.10.3 Contiki OS
- 23.10.4 OpenRTOS
-
24. Advanced Debugging Techniques
-
24.1 Understanding Cortex-M Fault-Related Exceptions
-
24.1.1 The Cortex-M Exception Entrance Sequence and the ARM Calling Convention
- 24.1.1.1 How to Interpret the Content of the LR Register on Exception Entrance
-
24.1.2 Fault Exceptions and Faults Analysis
- 24.1.2.1 Memory Management Exception
- 24.1.2.2 Bus Fault Exception
- 24.1.2.3 Usage Fault Exception
- 24.1.2.4 Hard Fault Exception
- 24.1.2.5 Secure Fault Exception
- 24.1.2.6 Enabling Optional Fault Handlers
- 24.1.2.7 Fault Analysis in Cortex-M0/0+ Based Processors
-
24.1.1 The Cortex-M Exception Entrance Sequence and the ARM Calling Convention
-
24.2 STM32CubeIDE Advanced Debugging Features
-
24.2.1 Expressions and Live Expressions
- 24.2.1.1 Memory Monitors
- 24.2.2 Watchpoints
- 24.2.3 Instruction Stepping Mode
- 24.2.4 SFRs View
-
24.2.5 Fault Analyzer
- 24.2.5.1 Tracing Fault-Related Registers Without the IDE Support
- 24.2.6 Build Analyzer
- 24.2.7 Static Stack Analyzer
-
24.2.1 Expressions and Live Expressions
-
24.3 Serial Wire Viewer Tracing
- 24.3.1 Enabling SWV Debugging
- 24.3.2 Configuring SWV
-
24.3.3 SWV Views
- 24.3.3.1 SWV Trace Log
- 24.3.3.2 SWV Exception Trace Log
- 24.3.3.3 SWV Data Trace
- 24.3.3.4 SWV Data Trace Timeline Graph
- 24.3.3.5 SWV ITM Data Console
- 24.3.3.6 SWV Statistical Profiling
- 24.4 Debugging Aids from the CubeHAL
- 24.5 External Debuggers
- 24.6 Debugging two Nucleo Boards Simultaneously
-
24.7 ARM Semihosting
- 24.7.1 Enable Semihosting on a Project
- 24.7.2 Semihosting Drawbacks
- 24.7.3 Understanding How Semihosting Works
-
24.1 Understanding Cortex-M Fault-Related Exceptions
-
25. FAT Filesystem
-
25.1 Introduction to FatFs Library
-
25.1.1 Adding FatFs Library in Your Projects
- 25.1.1.1 The Generic Disk Interface API
- 25.1.1.2 The Implementation of a Driver to Access SD Cards in SPI Mode
-
25.1.2 Relevant FatFs Structures and Functions
- 25.1.2.1 Mounting a Filesystem
- 25.1.2.2 Opening a File
- 25.1.2.3 Reading From/Writing into a File
- 25.1.2.4 Creating and Opening a Directory
- 25.1.3 How to Configure the FatFs Library
-
25.1.1 Adding FatFs Library in Your Projects
-
25.1 Introduction to FatFs Library
-
26. Develop IoT Applications
- 26.1 Solutions Offered by STM to Develop IoT Applications
-
26.2 The W5500 Ethernet Controller
-
26.2.1 How to Use the W5500 Shield and the
ioLibrary_Driver
Module- 26.2.1.1 Configuring the SPI Interface
- 26.2.1.2 Configuring the Socket Buffers and the Network Interface
-
26.2.2 Socket APIs
- 26.2.2.1 Handling Sockets in TCP Mode
- 26.2.2.2 Handling Sockets in UDP Mode
- 26.2.3 I/O Retargeting to a TCP/IP Socket
-
26.2.4 Building up an HTTP Server
- 26.2.4.1 A Web-Based Oscilloscope
-
26.2.1 How to Use the W5500 Shield and the
-
27. Universal Serial Bus
-
27.1 USB 2.0 Specification Overview
- 27.1.1 The “Before-To-Die” Guide to USB
- 27.1.2 USB Physical Architecture Overview
-
27.1.3 USB Logical Architecture Overview
- 27.1.3.1 Device States
- 27.1.3.2 Communication Endpoints
-
27.1.4 USB 2.0 Communication Protocol Overview
- 27.1.4.1 Packet Types
-
27.1.4.2 Transaction Types
- 27.1.4.2.1 Control Transactions
- 27.1.4.2.2 IN/OUT Transactions
-
27.1.4.3 Device and Interface Descriptors
- 27.1.4.3.1 Device Descriptors
- 27.1.4.3.2 Configuration Descriptors
- 27.1.4.3.3 Interface Descriptors
- 27.1.4.3.4 Endpoint Descriptors
- 27.1.4.3.5 String Descriptors
- 27.1.4.4 USB Classes
-
27.2 STM32 USB Device Library
- 27.2.1 Understanding Generated Code
- 27.2.2 USB Initialization Sequence
- 27.2.3 USB Enumeration Sequence
-
27.2.4 The USB CDC Class
- 27.2.4.1 USB CDC Descriptors
- 27.2.4.2 USB CDC Class Initialization
- 27.2.4.3 USB CDC Class Operations
-
27.3 Building Custom USB Devices
-
27.3.1 The USB HID Class
- 27.3.1.1 USB HID Descriptors
- 27.3.1.2 Overview of the Report Descriptor
- 27.3.1.3 USB HID Class-Specific Requests
- 27.3.2 Building a Vendor-Specific USB HID Device
-
27.3.1 The USB HID Class
-
27.4 Debugging USB Devices
- 27.4.1 Software Sniffers and Analyzers
- 27.4.2 USB Hardware Analyzers
- 27.5 Optimizing the STM32 USB Device Library
- 27.6 Going to the Market
-
27.1 USB 2.0 Specification Overview
-
28. Getting Started with a New Design
-
28.1 Hardware Design
- 28.1.1 PCB Layer Stack-Up
- 28.1.2 MCU Package
- 28.1.3 Decoupling of Power-Supply Pins
- 28.1.4 Clocks
- 28.1.5 Filtering of RESET Pin
- 28.1.6 Debug Port
- 28.1.7 Boot Mode
- 28.1.8 Pay attention to “pin-to-pin” Compatibility…
- 28.1.9 …And to Selecting the Right Peripherals
- 28.1.10 The Role of CubeMX During the Board Design Stage
- 28.1.11 Board Layout Strategies
-
28.2 Software Design
- 28.2.1 Generating the binary image for production
-
28.1 Hardware Design
-
19. Power Management
-
Appendix
-
A. Miscellaneous HAL functions and STM32 features
- Force MCU reset from the firmware
- STM32 96-bit Unique CPU ID
-
B. Troubleshooting Guide
-
STM32CubeIDE Issues
- Debugging Continuously Breaks at Every Instruction During a Debug Session
- The Step-by-Step Debugging is Really Slow
- The Firmware Works Only Under a Debug Session
-
STM32 Related Issues
- The Microcontroller Does Not Boot Correctly
- It is Not Possible to Flash or to Debug the MCU
-
STM32CubeIDE Issues
-
C. Nucleo pin-out
-
Nucleo-G474RE
- Arduino compatible headers
- Morpho headers
-
Nucleo-F446RE
- Arduino compatible headers
- Morpho headers
-
Nucleo-F401RE
- Arduino compatible headers
- Morpho headers
-
Nucleo-F303RE
- Arduino compatible headers
- Morpho headers
-
Nucleo-F103RB
- Arduino compatible headers
- Morpho headers
-
Nucleo-F072RB
- Arduino compatible headers
- Morpho headers
-
Nucleo-L476RG
- Arduino compatible headers
- Morpho headers
-
Nucleo-L152RE
- Arduino compatible headers
- Morpho headers
-
Nucleo-L073R8
- Arduino compatible headers
- Morpho headers
-
Nucleo-G474RE
-
D. Differences with the 1st edition
- Chapter 1
- Chapter 2
- Chapter 3 and 4
- Chapter 5
- Chapter 6
- Chapter 7
- Chapter 8
- Chapter 9
- Chapter 10
- Chapter 11
- Chapter 12-22
- Chapter 23
- Chapter 24
- Chapter 25-26
- Chapter 27
- Chapter 28
-
A. Miscellaneous HAL functions and STM32 features
- Notes
The Leanpub 60 Day 100% Happiness Guarantee
Within 60 days of purchase you can get a 100% refund on any Leanpub purchase, in two clicks.
Now, this is technically risky for us, since you'll have the book or course files either way. But we're so confident in our products and services, and in our authors and readers, that we're happy to offer a full money back guarantee for everything we sell.
You can only find out how good something is by trying it, and because of our 100% money back guarantee there's literally no risk to do so!
So, there's no reason not to click the Add to Cart button, is there?
See full terms...
Earn $8 on a $10 Purchase, and $16 on a $20 Purchase
We pay 80% royalties on purchases of $7.99 or more, and 80% royalties minus a 50 cent flat fee on purchases between $0.99 and $7.98. You earn $8 on a $10 sale, and $16 on a $20 sale. So, if we sell 5000 non-refunded copies of your book for $20, you'll earn $80,000.
(Yes, some authors have already earned much more than that on Leanpub.)
In fact, authors have earnedover $13 millionwriting, publishing and selling on Leanpub.
Learn more about writing on Leanpub
Free Updates. DRM Free.
If you buy a Leanpub book, you get free updates for as long as the author updates the book! Many authors use Leanpub to publish their books in-progress, while they are writing them. All readers get free updates, regardless of when they bought the book or how much they paid (including free).
Most Leanpub books are available in PDF (for computers) and EPUB (for phones, tablets and Kindle). The formats that a book includes are shown at the top right corner of this page.
Finally, Leanpub books don't have any DRM copy-protection nonsense, so you can easily read them on any supported device.
Learn more about Leanpub's ebook formats and where to read them