Bootstrap

I.MX6ULL 串口格式化函数移植实验

系列文章目录

I.MX6ULL高精度延时实验



一、前言

上一节实验实现了 UART1 基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。如果需要输出数字的时候就需要我们自己先将数字转换为字符,非常的不方便。
学习 STM32 串口的时候我们都会将 printf 函数映射到串口上,这样就可以使用printf 函数来完成格式化输出了,使用非常方便。本章我们就来学习如何将 printf 这样的格式化函数移植到 I.MX6U-ALPHA 开发板上。


二、串口格式化函数简介

格式化函数说的是 printf、sprintf 和 scanf 这样的函数,分为格式化输入和格式化输出两类函数。学习 C 语言的时候常常通过 printf 函数在屏幕上显示字符串,通过 scanf 函数从键盘获取输入。这样就有了输入和输出了,实现了最基本的人机交互。
学习 STM32 的时候会将 printf 映射到串口上,这样即使没有屏幕,也可以通过串口来和开发板进行交互。
在 I.MX6U-ALPHA 开发板上也可以使用此方法,将 printf 和 scanf 映射到串口上,这样就可以使用 SecureCRT 作为开发板的终端,完成与开发板的交互。也可以使用 printf 和 sprintf 来实现各种各样的格式化字符串,方便我们后续的开发。
串口驱动在该文章已经编写完成了,而且实现了最基本的字节收发,本节我们就通过移植网上别人已经做好的文件来实现格式化函数。


三、硬件原理分析

与该文章相同


四、实验程序编写

文件夹 stdio 里面的文件就是我们要移植的源码文件
本节实验在该文章的基础上完成,将 stdio 文件夹复制到实验工程根目录中

stdio 里面有两个文件夹:include 和 lib,这两个文件夹里面的内容如图所示:
在这里插入图片描述
图就是 stdio 里面的所有文件,stdio 里面的文件其实是从 uboot 里面移植过来的(从 uboot 源码里面“扣”出相应的文件,完成格式化函数的移植)。
这里要注意一点,stdio 中并没有实现完全版的格式化函数,比如 printf 函数并不支持浮点数,但是基本够我们使用了。移植好以后就要测试相应的函数工作是否正常,我们使用 scanf 函数等待键盘输入两个整数,然后将两个整数进行相加并使用 printf 函数输出结果。
在 main.c 里面输入如下内容:

1 #include "bsp_clk.h"
2 #include "bsp_delay.h"
3 #include "bsp_led.h"
4 #include "bsp_beep.h"
5 #include "bsp_key.h"
6 #include "bsp_int.h"
7 #include "bsp_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 函数输出两个整数的和。程序很简单,但是可以验证 printf 和 scanf 这两个函数是否正常工作。


五、编译下载验证

编写 Makefile 和链接脚本
修改 Makefile 中的 TARGET 为 printf,在 INCDIRS 中加入“stdio/include”,在 SRCDIRS
中加入“stdio/lib”,修改后的 Makefile 如下:
在这里插入图片描述
在这里插入图片描述

第 2 行修改变量 TARGET 为“printf”,也就是目标名称为“printf”。
第 7 行在变量 INCDIRS 中添加 stdio 相关头文件(.h)路径。
第 28 行在变量 SRCDIRS 中添加 stdio 相关文件(.c)路径。
第 37 行在编译 C 文件的时候添加了选项“-Wa,-mimplicit-it=thumb”,否则的话会有如下
类似的错误提示:

thumb conditional instruction should be in IT block -- `addcs r5,r5,#65536'

链接脚本保持不变。


编译下载
使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 printf.bin 文
件下载到 SD 卡中,命令如下:

chmod 777 imxdownload //给予 imxdownload 可执行权限,一次即可
./imxdownload printf.bin /dev/sdd //烧写到 SD 卡中,不能烧写到/dev/sda 或 sda1 设备里面!

烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,打开 SecureCRT,设置好连接,然后复
位开发板。SecureCRT 显示如图所示:
在这里插入图片描述
根据图所示的提示,输入两个整数,使用空格隔开,输入完成以后按下“回车键”,结果如图所示:
在这里插入图片描述
从图可以看出,输入了 32 和 5,这两个整数,然后计算出 32+5=37。计算和显示都正确,说明格式化函数移植成功,以后我们就可以使用 printf 来调试程序了。


END
在这里插入图片描述

;