1)实验平台:正点原子阿尔法Linux开发板 2)平台购买地址:https://item.taobao.com/item.htm?id=603672744434 2)全套实验源码+手册+视频下载地址:http://www.openedv.com/thread-300792-1-1.html 3)对正点原子Linux感兴趣的同学可以加群讨论:935446741 4)关注正点原子公众号,获取最新资料更新
第二十二章 串口格式化函数移植实验
上一章实验我们实现了UART1基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。如果需要输出数字的时候就需要我们自己先将数字转换为字符,非常的不方便。学习STM32串口的时候我们都会将printf函数映射到串口上,这样就可以使用printf函数来完成格式化输出了,使用非常方便。本章我们就来学习如何将printf这样的格式化函数移植到I.MX6U-ALPHA开发板上。
22.1 串口格式化函数简介 格式化函数说的是printf、sprintf和scanf这样的函数,分为格式化输入和格式化输出两类函数。学习C语言的时候常常通过printf函数在屏幕上显示字符串,通过scanf函数从键盘获取输入。这样就有了输入和输出了,实现了最基本的人机交互。学习STM32的时候会将printf映射到串口上,这样即使没有屏幕,也可以通过串口来和开发板进行交互。在I.MX6U-ALPHA开发板上也可以使用此方法,将printf和scanf映射到串口上,这样就可以使用SecureCRT作为开发板的终端,完成与开发板的交互。也可以使用printf和sprintf来实现各种各样的格式化字符串,方便我们后续的开发。串口驱动我们上一章已经编写完成了,而且实现了最基本的字节收发,本章我们就通过移植网上别人已经做好的文件来实现格式化函数。 22.2 硬件原理分析 本章所需的硬件和上一章相同。 22.3 实验程序编写 本实验对应的例程路径为:开发板光盘-> 1、裸机例程-> 14_printf。 本章实验所需要移植的源码已经放到了开发板光盘中,路径为:1、例程源码->5、模块驱动源码->2、格式化函数源码->stdio,文件夹stdio里面的文件就是我们要移植的源码文件。本章实验在上一章例程的基础上完成,将stdio文件夹复制到实验工程根目录中,如图22.3.1所示:
图22.3.1 添加实验源码 stdio里面有两个文件夹:include和lib,这两个文件夹里面的内容如图22.3.2所示:
图22.3.2 stdio所有源码文件 图22.3.2就是stdio里面的所有文件,stdio里面的文件其实是从uboot里面移植过来的。后面学习uboot以后大家有兴趣的话可以自行从uboot源码里面“扣”出相应的文件,完成格式化函数的移植。这里要注意一点,stdio中并没有实现完全版的格式化函数,比如printf函数并不支持浮点数,但是基本够我们使用了。 移植好以后就要测试相应的函数工作是否正常,我们使用scanf函数等待键盘输入两个整数,然后将两个整数进行相加并使用printf函数输出结果。在main.c里面输入如下内容:
示例代码22.3.1 main.c文件代码
/**************************************************************
Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.
文件名 : main.c
作者 : 左忠凯
版本 : V1.0
描述 : I.MX6U开发板裸机实验14 串口print实验
其他 : 本实验在串口上移植printf,实现printf函数功能,方便以后的
程序调试。
论坛 : www.openedv.com
日志 : 初版V1.0 2019/1/15 左忠凯创建
**************************************************************/
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这两个函数是否正常工作。
22.4 编译下载验证 22.4.1 编写Makefile和链接脚本 修改Makefile中的TARGET为printf,在INCDIRS中加入“stdio/include”,在SRCDIRS中加入“stdio/lib”,修改后的Makefile如下:
示例代码22.4.1.1 Makefile文件代码
1 CROSS_COMPILE ?= arm-linux-gnueabihf-
2 TARGET ?= printf
3
4 /* 省略掉其它代码...... */
5
6 INCDIRS := imx6ul \
7 stdio/include \
8 bsp/clk \
9 bsp/led \
10 bsp/delay \
11 bsp/beep \
12 bsp/gpio \
13 bsp/key \
14 bsp/exit \
15 bsp/int \
16 bsp/epittimer \
17 bsp/keyfilter \
18 bsp/uart
19
20 SRCDIRS := project \
21 stdio/lib \
22 bsp/clk \
23 bsp/led \
24 bsp/delay \
25 bsp/beep \
26 bsp/gpio \
27 bsp/key \
28 bsp/exit \
29 bsp/int \
30 bsp/epittimer \
31 bsp/keyfilter \
32 bsp/uart
33
34 /* 省略掉其它代码...... */
35
36 $(COBJS) : obj/%.o : %.c
37 $(CC) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?