您当前的位置: 首页 >  嵌入式

正点原子

暂无认证

  • 2浏览

    0关注

    382博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【正点原子Linux连载】第二十二章 串口格式化函数移植实验-摘自【正点原子】I.MX6U嵌入式Linux驱动开发指南V1.0

正点原子 发布时间:2021-08-23 11:46:01 ,浏览量:2

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 $@ $            
关注
打赏
1665308814
查看更多评论
0.0462s