完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
1)实验平台:正点原子Linux开发板 2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南》关注官方微信号公众号,获取更多资料:正点原子 第二十二章串口格式化函数移植实验 上一章实验我们实现了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.2stdio所有源码文件 图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 */ 15int main(void) 16{ 17 unsignedchar 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("rn数据%d + %d = %drnrn", a, b, a+b);/* 输出和 */ 33 34 state =!state; 35 led_switch(LED0,state); 36 } 37 38 return0; 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 $@ $< 38 39 clean: 40 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS) 第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' 链接脚本保持不变。 22.4.2编译下载 使用Make命令编译代码,编译成功以后使用软件imxdownload将编译完成的printf.bin文件下载到SD卡中,命令如下: chmod 777 imxdownload //给予imxdownload可执行权限,一次即可 ./imxdownload printf.bin /dev/sdd //烧写到SD卡中 烧写成功以后将SD卡插到开发板的SD卡槽中,打开SourceCRT,设置好连接,然后复位开发板。SourceCRT显示如图22.4.2.1所示: 图22.4.2.1 SourceCRT默认显示界面 根据图22.4.2.1所示的提示,输入两个整数,使用空格隔开,输入完成以后按下“回车键”,结果如图22.4.2.2所示: 图22.4.2.2计算输入结果显示 从图22.4.2.2可以看出,输入了32和5,这两个整数,然后计算出32+5=37。计算和显示都正确,说明格式化函数移植成功,以后我们就可以使用printf来调试程序了。 |
|
相关推荐
|
|
1042 浏览 0 评论
IaaS+on+DPU(IoD)+下一代高性能算力底座技术白皮书
2035 浏览 0 评论
飞凌嵌入式-ELFBOARD 常用的USB接口及其不同版本介绍第1期
1074 浏览 0 评论
【Vision Board创客营连载体验】RA8D1-Vision Board上OSPI-Flash实践
1533 浏览 0 评论
I.MX6ULL-飞凌 ElfBoard ELF1板卡- 应用层更改引脚复用的方法
3755 浏览 0 评论
65237 浏览 21 评论
嵌入式热门DIY项目:智能机器人开源资料合集(原理图、代码、论文)
67782 浏览 22 评论
57821 浏览 32 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-18 06:34 , Processed in 0.327382 second(s), Total 31, Slave 24 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号