CH579CH573CH583CH57xCH58xprintf串口打印相关

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

CH579CH573CH583CH57xCH58xprintf串⼝打印相关本⽂⽬的
本⽂将记录如何在沁恒的ble芯⽚上修改printf的串⼝重定向,禁⽤,以及相关的注意事项
适⽤芯⽚
CH579/ch578/ch577
CH573/CH571
CH583/CH582/CH581
printf 中特性
默认冲过UART1出输出,即PA9,波特率115200
半阻塞模式(没有软件缓冲实现,只有芯⽚UART带的8字节硬件fifo)
SDK中使⽤PRINT 宏来实现
⼀,SDK中 printf重定向实现原理
在KEIL中
待编辑
在mounriver studio(eclipse+gcc)中
宏定义
官⽹的默认例程中,printf 通过PRINT宏来定义:
在CH573SFR.h⽂件中
#ifdef DEBUG
#define PRINT(X...) printf(X)
#else
#define PRINT(X...)
#endif
其中这个DEBUG,官⽅的默认⼯程在IDE的全局定义中是:
这⾥还可以定义为其他值(CH57x_common.h)
#define Debug_UART0 0
#define Debug_UART1 1
#define Debug_UART2 2
#define Debug_UART3 3
初始化
在main函数中,上来进⾏串⼝初始化:
#ifdef DEBUG
GPIOA_SetBits(bTXD1);
GPIOA_ModeCfg(bTXD1, GPIO_ModeOut_PP_5mA);
UART1_DefInit( );
#endif
串⼝输出
以下定义在⽂件"CH57x_sys.c"中
其中这⾥的Debug_UART0-Debug_UART3 对应就是0-3,
实际上printf最终会调⽤下⾯的函数,并根据对应的宏对不同的串⼝寄存器阻塞⽅式写数据.
#ifdef DEBUG
int _write(int fd, char *buf, int size)
{
int i;
for(i=0; i<size; i++)
{
#if DEBUG == Debug_UART0
while( R8_UART0_TFC == UART_FIFO_SIZE ); /* 等待数据发送 */
R8_UART0_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART1
while( R8_UART1_TFC == UART_FIFO_SIZE ); /* 等待数据发送 */
R8_UART1_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART2
while( R8_UART2_TFC == UART_FIFO_SIZE ); /* 等待数据发送 */
R8_UART2_THR = *buf++; /* 发送数据 */
#elif DEBUG == Debug_UART3
while( R8_UART3_TFC == UART_FIFO_SIZE ); /* 等待数据发送 */
R8_UART3_THR = *buf++; /* 发送数据 */
#endif
}
return size;
}
#endif
⼆,修改printf 的串⼝
在mounriver studio(eclipse+gcc)中
很明显,PRINT 最终是调⽤
int _write(int fd, char *buf, int size) 函数实现的,
⽽这个函数⾥,根据不同的宏,写不同串⼝的输出寄存器,所以我们修改printf串⼝只需要两步:
1, main函数⼀开始的地⽅,初始化对应的要printf输出串⼝
2, 在全局宏⾥⾯修改 DEBUG的宏的值即可
三,低功耗下的串⼝打印的注意事项
由于WCH的串⼝是有8字节的硬件fifo的,由上⾯的代码我们可以看出,其打印并不会等到硬件为空时候才退出,⽽在进⼊睡眠后串⼝是不能正常⼯作的,如果此时串⼝的TX fifo⾮空,我们就需要等待空了后再睡眠
在WCH 提供的代码的sleep.c 函数中,我们可以看到⼤概下⾯的处理⽅式: (很明显,wch的sdk中只实现了UAR1的的串⼝处理,其他的我们需要⼿动添加.)
u32 CH58X_LowPower( u32 time )
{
#if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE)
<...>
#if( DEBUG == Debug_UART1 ) // 使⽤其他串⼝输出打印信息需要修改这⾏代码
while( ( R8_UART1_LSR & RB_LSR_TX_ALL_EMP ) == 0 )
{
__nop();
}
#endif
<...>
#endif
return 0;
}
注意事项
wch 官⽹CH573/CH583 的例程中即使把DEBUG全局宏去了,仍然会存在定义为UART0,如果这时候没有初始化UART0,会导致卡在printf 函数⾥, 解决⽅法是注释掉"CH57x_common.h" ⽂件中的 #ifndef DEBUG 下⾯的 "#define DEBUG Debug_UART0 "
如果是取消printf打印,⼀定是关闭宏,不可以直接注释掉打印串⼝的初始化,否则会引起后⾯调⽤打印的时候,卡到具体的串⼝输出函数⾥其他事项
关于浮点打印
关于⼀些标准函数诸如sprintf 之类的函数
关于串⼝打印占⽤的资源。

相关文档
最新文档