第五课(上)
C语言printf的实现
首先了解一下printf的格式字符有哪些,如%d,%u以及它的含义,以及如何实现使用CDC实现printf函数发送字符。代码如下- #include "./comm/stc32g.h"
- #include "./comm/stc32_stc8_usb.h"
- #include <stdio.h>
-
- void sys_init();
-
- //USB调试及复位所需定义
- char *USER_DEVICEDESC = NULL;
- char *USER_PRODUCTDESC = NULL;
- char *USER_STCISPCMD = "@STCISP#"; //设置自动复位到ISP区的用户接口命令
-
- void main()
- {
-
- sys_init();
- usb_init(); //USB初始化
- EUSB =1;
- EA = 1;
- while(DeviceState != DEVSTATE_CONFIGURED);
- while (1)
- {
- if(bUsbOutReady)
- {
- //USB_SendData(UsbOutBuffer,OutNumber);
- usb_OUT_done();
- printf("hello world");
- }
- P20=0;
-
- }
- }
- void sys_init()
- {
- WTST = 0; //设置程序指令延时参数,赋值为0可将CPU执行指令的速度设置为最快
- EAXFR = 1; //扩展寄存器(XFR)访问使能
- CKCON = 0; //提高访问XRAM速度
-
- P0M1 = 0x30; P0M0 = 0x30; //设置P0.4、P0.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P1M1 = 0x32; P1M0 = 0x32; //设置P1.1、P1.4、P1.5为漏极开路(实验箱加了上拉电阻到3.3V), P1.1在PWM当DAC电路通过电阻串联到P2.3
- P2M1 = 0x3c; P2M0 = 0x3c; //设置P2.2~P2.5为漏极开路(实验箱加了上拉电阻到3.3V),设置开漏模式需要断开PWM当DAC电路中的R2电阻
- P3M1 = 0x50; P3M0 = 0x50; //设置P3.4、P3.6为漏极开路(实验箱加了上拉电阻到3.3V)
- P4M1 = 0x3c; P4M0 = 0x3c; //设置P4.2~P4.5为漏极开路(实验箱加了上拉电阻到3.3V)
- P5M1 = 0x0c; P5M0 = 0x0c; //设置P5.2、P5.3为漏极开路(实验箱加了上拉电阻到3.3V)
- P6M1 = 0xff; P6M0 = 0xff; //设置为漏极开路(实验箱加了上拉电阻到3.3V)
- P7M1 = 0x00; P7M0 = 0x00; //设置为准双向口
- //设置USB使用的时钟源
- //IRC48MCR = 0x80; //使能内部48M高速IRC
- // while (!(IRC48MCR & 0x01)); //等待时钟稳定
-
- //USBCLK = 0x00; //使用CDC功能需要使用这两行,HID功能禁用这两行。
- //USBCON = 0x90;
- }
复制代码
但是如果直接复制usb的头文件和lib会出现警告,通过研究发现要在usb头文件中开启printf功能
#define PRINTF_HID //printf输出直接重定向到USB HID接口
要把这段注释取消掉因为这个定义了printf的重定向,代码在后面
-
- int printf_hid (const char *fmt, ...);
-
- #if defined PRINTF_SEGLED
- #define printf SEG7_ShowString
- #elif defined PRINTF_HID
- #define printf printf_hid
- #endif
复制代码
这段把printf定义到int printf_hid (const char *fmt, ...);如果没有这个定义printf不会起作用。
把这段代码写好之后,编译上传,CDC串口就会输出字符串。hello world。
通过这节课,我这边了解了printf的字符定义,为下节课做好准备。以及了解怎么去根据错误提示去排错。 |