kashmira-b/embedded-debuggin-toolkit

GitHub: kashmira-b/embedded-debuggin-toolkit

面向 STM32L476RG 的模块化嵌入式调试框架,提供分层日志、I2C 扫描、错误处理和时间分析功能,支持无硬件模拟运行。

Stars: 0 | Forks: 0

# 嵌入式调试工具包 ## 概述 一个模块化、可复用的 C 调试库,适用于 STM32L476RG,遵循 STM32 HAL 约定。 | 模块 | 文件 | 描述 | |---|---|---| | 调试日志 | `debug_log.h/.c` | 具有运行时级别控制的分层 UART 日志输出 | | 错误处理 | `error_handler.h/.c` | 错误码、字符串描述符、LED 指示 | | I2C 扫描器 | `i2c_scanner.h/.c` | 带重试、注解和汇总表的总线扫描 | | 计时宏 | `timing.h/.c` | 通过 `HAL_GetTick()` 进行执行时间分析 | | 模拟 HAL | `mock_hal.h/.c` | STM32 HAL 桩代码 — 模拟 UART、I2C、滴答计时器 | ## 项目结构 ``` embedded-debugging-toolkit/ ├── Inc/ │ ├── mock_hal.h # Simulated STM32 HAL types and functions │ ├── debug_log.h # Logging API, level macros, runtime filter │ ├── error_handler.h # Error codes and reporting API │ ├── i2c_scanner.h # I2C bus scan API │ └── timing.h # Timing macros and functions ├── Src/ │ ├── mock_hal.c # HAL stubs (stdout = UART, I2C whitelist, bus-busy injection) │ ├── debug_log.c # Formatted log engine with timestamp + file:line prefix │ ├── error_handler.c # Error table + simulated LED indication │ ├── i2c_scanner.c # Per-address probe, bus-busy retry, summary table │ ├── timing.c # Elapsed time logger │ └── main.c # Integration demo ├── logs/ │ └── scan_output.log # Captured run output (generated at runtime) └── README.md ``` ## 模拟规则 | 方面 | 模拟行为 | |---|---| | UART 输出 | `fwrite` 写入标准输出(通过 `tee` 捕获到日志文件中) | | `HAL_GetTick()` | 模拟计数器,每次调用时递增 | | I2C 设备存在情况 | 仅 `0x3C` (SSD1306) 和 `0x68` (MPU-6050) 返回 ACK | | 总线忙注入 | 约每第 15 次探测返回 `HAL_BUSY` → 扫描器重试并记录 `WARN` | | LED 指示 | 记录为描述闪烁模式的 `WARN` 消息 | | `HAL_Delay()` | 仅推进内部滴答计数器 | ## 快速入门 ### STM32CubeIDE 集成 1. 将 `Inc/` 和 `Src/` 复制到您的 CubeIDE 项目中(排除 `mock_hal.h/.c`)。 2. 将 `#include "mock_hal.h"` 替换为 `#include "stm32l4xx_hal.h"`。 3. 通过 `MX_USART2_UART_Init()` 和 `MX_I2C1_Init()` 初始化 `huart2` 和 `hi2c1`。 ## 功能:调试日志级别控制 在运行时控制发出哪些严重级别 — 无需重新编译: ``` DEBUG_SetMinLevel(LOG_LEVEL_INFO); // All messages (default) DEBUG_SetMinLevel(LOG_LEVEL_WARN); // Suppress INFO — keep WARN + ERROR only DEBUG_SetMinLevel(LOG_LEVEL_ERROR); // Suppress INFO + WARN — errors only ``` 查询活动级别: ``` LogLevel_t lvl = DEBUG_GetMinLevel(); ``` ## 功能:I2C 总线扫描器 探测从 `0x08` 到 `0x77` 的每一个地址,记录每个结果,通过重试机制处理总线忙状态,并在最后打印汇总表。 **示例输出(节选):** ``` ============================================ I2C Bus Scanner | STM32L476RG [SIM] Probing addresses 0x08 to 0x77 ... ============================================ Probing 0x08 ... NACK ... 0x24: I2C bus busy, retrying... (arbitration lost) Probing 0x24 ... NACK ... Probing 0x3C ... ACK <- SSD1306 OLED Display [FOUND] ... Probing 0x68 ... ACK <- MPU-6050 IMU (AD0=GND) [FOUND] ... ============================================ I2C SCAN SUMMARY Addr Device ------ ------------------------------ 0x3C SSD1306 OLED Display 0x68 MPU-6050 IMU (AD0=GND) ------ ------------------------------ Total found : 2 device(s) Bus retries : 7 event(s) ============================================ ``` ## API 参考 ### `debug_log.h` ``` void DEBUG_LogInit(UART_HandleTypeDef *huart); void DEBUG_SetMinLevel(LogLevel_t level); // Runtime level filter LogLevel_t DEBUG_GetMinLevel(void); LOG_INFO("msg %d", val); LOG_WARN("msg %s", str); LOG_ERROR("msg 0x%02X", code); ``` ### `error_handler.h` ``` void ERROR_Initialize(void); void ERROR_Report(ErrorCode_t code, const char *details); const char *ERROR_CodeToString(ErrorCode_t code); ErrorCode_t ERROR_GetLastCode(void); ``` ### `i2c_scanner.h` ``` // Full bus sweep (0x08–0x77) with retry, annotation, summary table HAL_StatusTypeDef I2C_Scanner_ScanBus(I2C_HandleTypeDef *hi2c, uint8_t *found_count); // Single address check HAL_StatusTypeDef I2C_Scanner_PingDevice(I2C_HandleTypeDef *hi2c, uint8_t address); ``` ### `timing.h` ``` TIMING_MEASURE_START(tag); // Capture start tick TIMING_MEASURE_STOP(tag); // Log elapsed time uint32_t TIMING_GetTimestamp(void); void TIMING_LogElapsed(const char *label, uint32_t start_tick); ``` ## 设计原则 - **HAL 风格 API**:镜像 STM32 HAL 命名,以实现无缝的真实硬件移植。 - **防御性编程**:对所有公共 API 进行空指针检查。 - **模块化**:每个模块均可独立使用,依赖项极少。 - **模拟优先**:无需硬件即可运行,适用于 CI 和作品集演示。 - **总线忙恢复能力**:I2C 扫描器在遇到 `HAL_BUSY` 时会自动重试,并生成 `WARN` 日志。
标签:HAL库, I2C总线, IoT, Mock测试, MPU-6050, SSD1306, STM32, STM32L476RG, UART串口, 代码复用, 单片机, 固件开发, 外设驱动, 客户端加密, 嵌入式系统, 微控制器, 性能分析, 时序分析, 模块化设计, 硬件仿真, 硬件抽象层, 结构化日志, 自动化修复, 设备扫描, 调试框架, 错误处理