i.MX6ULL终结者串口格式化函数例程原理分析及程序设计

1 原理分析

本章用到的硬件资源和上一章的一样,我们就不再详细介绍了(原理分析部分大家可以参照上一章)。

2 程序设计

本实验的源码工程在开发板光盘资料的:i.MX6UL终结者光盘资料\04_裸机例程源码\13_printf 目录下。我们在Ubuntu系统下使用命令“mkdir 13_printf”建立“13_printf”文件夹,如图 2.1所示:
在这里插入图片描述

图 2.1

然后使用“cd 13_printf”命令进入到13_printf文件夹,如图 2.2所示:
在这里插入图片描述

图 2.2

然后使用命令“cp -r …/12_uart/* ./”将上一章试验中的所有内容拷贝到刚刚新建的“13_printf”里面,如图 2.3所示:
在这里插入图片描述

图 2.3

然后我们使用ssh文件传输工具,拷贝网上别人移植完成的格式化函数库到我们刚才创建的“13_printf”文件夹目录下面(stdio格式化函数库在光盘资料的:“i.MX6UL终结者光盘资料\10_其它参考资料\格式化函数库”目录下面),最终的目录如图 2.4所示:
在这里插入图片描述

图 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所示:
在这里插入图片描述

图 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函数输出两个整数的和。在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_46635880/article/details/109110324