跳过正文

debug.h

Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 1: 本文

描述
#

该文件定义了用于调试输出的通用函数接口,包括串口打印(USART)、微秒/毫秒延时、以及通过SDI(Serial Debug Interface)协议进行高效数据传输的机制。支持多种UART引脚重映射配置,并提供两种打印输出模式:标准USART发送和基于内存映射寄存器的SDI高速调试通道。适用于嵌入式系统开发中的日志输出、调试信息上报和实时数据监控场景。

常量
#

UART_Printf_Definition
#

定义UART调试输出的引脚映射模式,用于在不同硬件布局下灵活配置TX引脚位置。

名称 简述
DEBUG_UART1_NoRemap 1 使用默认引脚:PD5(TX)
DEBUG_UART1_Remap1 2 使用部分重映射1:PD0(TX)
DEBUG_UART1_Remap2 3 使用部分重映射2:PD6(TX)
DEBUG_UART1_Remap3 4 使用全重映射:PC0(TX)

以上所有值均为整型常量,用于条件编译选择不同的硬件引脚配置,避免在不同开发板间修改底层代码。

DEBUG_UART_Definition
#

定义调试UART的默认配置,若未显式指定则使用无重映射模式。

名称 简述
DEBUG DEBUG_UART1_NoRemap 默认使用PD5作为UART1发送引脚

SDI_Printf_Definition
#

定义SDI(Serial Debug Interface)调试输出开关状态,用于选择是否启用高速内存映射调试通道。

名称 简述
SDI_PR_CLOSE 0 禁用SDI调试通道,使用标准USART发送
SDI_PR_OPEN 1 启用SDI调试通道,通过内存映射寄存器传输数据

SDI通道通过两个32位寄存器(0xE00000F4 和 0xE00000F8)实现零拷贝、低延迟的数据传输,适用于高波特率或实时性要求高的调试场景。

SDI_Print_Definition
#

定义SDI调试输出的默认开关,若未显式指定则默认关闭。

名称 简述
SDI_PRINT SDI_PR_CLOSE 默认使用USART输出,节省资源,兼容性好

函数
#

Delay_Init
#

void Delay_Init(void)
初始化微秒和毫秒延时的基准计数参数。基于系统时钟频率(SystemCoreClock)计算出每微秒和每毫秒对应的SysTick比较值,为后续精确延时提供时间基准。

参数:

返回值:

该函数必须在调用 Delay_Us()Delay_Ms() 之前执行一次,否则延时时间将不准确。它利用系统时钟的稳定性,使延时与主频解耦,适用于不同主频的MCU平台。

Delay_Us
#

void Delay_Us(uint32_t n)
实现精确的微秒级延时,基于SysTick定时器。通过设置比较寄存器(CMP)并轮询状态标志(SR)实现阻塞式延时。

参数:

名称 类型 简述
n uint32_t 需要延时的微秒数(最大支持约500ms,受限于32位计数器)

返回值:

实现原理:SysTick计数器从0开始递增,当达到CMP值时触发中断标志。通过轮询该标志实现精确等待。该函数适用于需要高精度短时延时的场景,如SPI/I2C时序控制、传感器采样间隔等。

Delay_Ms
#

void Delay_Ms(uint32_t n)
实现毫秒级延时,基于 Delay_Us() 构建。通过将毫秒数乘以预计算的每毫秒计数值实现延时。

参数:

名称 类型 简述
n uint32_t 需要延时的毫秒数(最大支持约49天,受限于32位计数器)

返回值:

该函数在内部调用 Delay_Us(),因此其精度依赖于 Delay_Init() 的正确初始化。适用于任务调度、LED闪烁、通信协议等待等中长期延时场景。

USART_Printf_Init
#

void USART_Printf_Init(uint32_t baudrate)
初始化USART1外设用于标准串口打印输出。根据 DEBUG 宏定义自动选择对应的GPIO引脚和重映射配置,并配置波特率、数据格式等参数。

参数:

名称 类型 简述
baudrate uint32_t 串口通信波特率,如 9600、115200 等

返回值:

该函数通过条件编译(#if)动态选择引脚:PD5(默认)、PD0、PD6 或 PC0,极大提升了硬件兼容性。同时启用AF_PP(复用推挽输出)模式,确保信号驱动能力。调用后即可通过 printf() 输出调试信息。

SDI_Printf_Enable
#

void SDI_Printf_Enable(void)
启用SDI调试通道,初始化调试数据传输环境。首先清空SDI数据寄存器,然后调用 Delay_Init()Delay_Ms(1) 进行稳定延时,确保硬件就绪。

参数:

返回值:

该函数是使用SDI调试模式的必要前置步骤。它确保SDI接口的两个寄存器(0xE00000F4 和 0xE00000F8)处于已知初始状态,避免上电后残留数据干扰。通常在系统初始化末尾调用。

_write
#

int _write(int fd, char *buf, int size)
标准C库 printf() 的底层输出钩子函数,用于重定向标准输出到调试通道。根据 SDI_PRINT 宏选择使用SDI高速通道或USART普通通道发送数据。

参数:

名称 类型 简述
fd int 文件描述符(通常为1,表示标准输出)
buf char * 待发送的字符串缓冲区
size int 缓冲区中有效字符数量

返回值:
int:实际发送的字符数(等于 size

SDI模式:每次最多发送7字节数据,通过将8字节数据拆分为 DEBUG_DATA0_ADDRESS(低字节为长度)和 DEBUG_DATA1_ADDRESS(高28位为数据)两个寄存器传输,实现高效批量发送。
USART模式:逐字节轮询发送,兼容性好但速度慢。
该函数使 printf()puts() 等标准库函数可无缝工作,无需修改上层代码。

_sbrk
#

void *_sbrk(ptrdiff_t incr)
实现C库动态内存分配(malloc)所需的堆扩展函数。用于在堆空间不足时向操作系统申请更多内存。

参数:

名称 类型 简述
incr ptrdiff_t 请求增加的堆空间字节数(可为负数,用于释放)

返回值:
void *:分配前的堆指针,失败时返回 (void *)-1

该函数通过链接脚本定义的 _end_heap_end 符号管理堆边界,防止堆溢出。若 incr 超出允许范围,返回错误指针,避免破坏系统栈或其它内存区域。在使用 malloccalloc 等函数时必须实现此函数,否则链接失败。

Ch32v00x软件文档 - 这篇文章属于一个选集。
§ 1: 本文

相关文章

ch32v00x.h

该文件是 CH32V003 微控制器的外设访问层头文件,定义了所有外设寄存器的内存映射、位域常量、中断向量、时钟配置、GPIO 控制结构及系统级常量。它为标准外设库提供底层硬件抽象,使开发者可通过结构体指针直接访问寄存器,或通过位掩码配置外设功能。本文件不包含函数原型,仅提供寄存器定义与常量,是所有外设驱动开发的基础。

ch32v00x_adc.h

该文件定义了 CH32V00x 系列微控制器 ADC 外设的固件库所有函数原型、常量、枚举和结构体。ADC(模数转换器)支持单通道与多通道扫描转换、注入通道、模拟看门狗、DMA 请求、软件与外部触发等多种模式,适用于高精度模拟信号采集场景。本库通过寄存器掩码操作实现灵活配置,所有常量均以 uint32_t 或 uint8_t 类型定义,确保与硬件寄存器位域精确匹配。函数设计遵循标准外设库风格,支持初始化、启动、中断、校准、偏移设置等完整功能链,适用于工业控制、传感器接口、电源管理等嵌入式应用。

ch32v00x_dbgmcu.h

该文件包含 DBGMCU(调试监控单元)固件库的所有函数原型与常量定义,用于在调试模式下控制外设行为,如暂停看门狗、定时器等,以方便开发与调试。DBGMCU 允许在 CPU 停止时保持某些外设的暂停状态,避免调试过程中触发意外复位或计数,是嵌入式调试环境中关键的低层控制接口。所有配置均通过写入调试控制寄存器(DEBUG_CR,地址 0x7C0)实现,该寄存器由 CPU 的 CSR 指令直接访问,具有极低的延迟和硬件级控制能力。