描述 #
该文件定义了用于调试输出的通用函数接口,包括串口打印(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超出允许范围,返回错误指针,避免破坏系统栈或其它内存区域。在使用malloc、calloc等函数时必须实现此函数,否则链接失败。