1 原理分析
本章用到的硬件资源和上一章的一样,我们就不再详细介绍了(原理分析部分大家可以参照上一章)。
2 程序设计
本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\13_printf 目录下。我们在Ubuntu系统下使用命令“mkdir 13_printf”建立“13_printf”文件夹,如图 2.1所示:
然后使用“cd 13_printf”命令进入到13_printf文件夹,如图 2.2所示:
然后使用命令“cp -r …/12_uart/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“13_printf”里面,如图 2.3所示:
然后我们使用ssh文件传输工具,拷贝网上别人移植完成的格式化函数库到我们刚才创建的“13_printf”文件夹目录下面(stdio格式化函数库在光盘资料的:“i.MX6UL终结者光盘资料\10_其它参考资料\格式化函数库”目录下面),最终的目录如图 2.4所示:
我们可以找到printf函数的源码,在“stdio/lib/printf.c”文件。我们打开该文件,看下printf函数的定义,代码如下:
17 int printf(const char *fmt, ...)
18 {
19 int i;
20 int len;
21 va_list args;
22
23 va_start(args, fmt);
24 len = vsprintf(g_pcOutBuf,fmt,args);
25 va_end(args);
26 for (i = 0; i < strlen(g_pcOutBuf); i++)
27 {
28 putc(g_pcOutBuf[i]);
29 }
30 return len;
31 }
我们看到printf函数的具体实现是获取到所有的参数值,最终调用putc字符输出函数,将所有的参数组成的字符串一个一个的输出。我们看到putc函数是不是有点熟悉,还记得上一章例程我们在串口驱动里面定义的putc函数吗?没错,printf函数里面的这个putc就是调用的串口驱动函数里面的putc函数,因为我们在printf.c的第4行包含了“uart.h”串口驱动的头文件了,如图 2.5所示:
同理大家可以自行在stdio文件夹下查找下scanf函数的实现。
然后我们打开main.c文件,在里面输入下面的内容:
1 #include "clk.h"
2 #include "delay.h"
3 #include "led.h"
4 #include "beep.h"
5 #include "key.h"
6 #include "int.h"
7 #include "uart.h"
8 #include "stdio.h"
9
10 /*
11 * @description : main函数
12 * @param : 无
13 * @return : 无
14 */
15 int main(void)
16 {
17 unsigned char state = OFF;
18 int a , b;
19
20 int_init(); /* 初始化中断(一定要最先调用!) */
21 imx6u_clkinit(); /* 初始化系统时钟 */
22 delay_init(); /* 初始化延时 */
23 clk_enable(); /* 使能所有的时钟 */
24 led_init(); /* 初始化led */
25 beep_init(); /* 初始化beep */
26 uart_init(); /* 初始化串口,波特率115200 */
27
28 while(1)
29 {
30 printf("输入两个整数,使用空格隔开:");
31 scanf("%d %d", &a, &b); /* 输入两个整数 */
32 printf("\r\n数据%d + %d = %d\r\n\r\n", a, b, a+b);/* 输出两个数相加的和 */
33
34 state = !state;
35 led_switch(LED0,state);
36 }
37
38 return 0;
39 }
第30行使用printf函数在串口输出提示信息。
第31行使用scanf函数获取串口输入两个整数
第32行使用printf函数输出两个整数的和。