目录
前言
格式化函数
实验程序编写
stdio文件夹
main.c
Makefile修改
编译下载
前言
在学习实验12:imx6ull串口通信实验,我们实现了 UART1 基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。
本讲实验我们就来学习如何将 printf 这样的格式化函数,移植到正点原子 I.MX6U-ALPHA 开发板上。
格式化函数
格式化函数说的是 printf、 sprintf 和 scanf 这样的函数,分为格式化输入和格式化输出两类函数。
我们刚开始学习 C 语言的时候,常常通过 printf 函数在屏幕上显示字符串,通过 scanf 函数从键盘获取输入。
在 I.MX6U-ALPHA 开发板上也可以,将 printf 和 scanf 映射到串口上,这样就可以使用 MobaXterm 作为开发板的终端, 完成与开发板的交互。
也可以使用 printf 和 sprintf 来实现各种各样的格式化字符串,方便我们后续的开发。
实验程序编写
stdio文件夹
在正点原子提供的源码资料里,有一个文件夹 stdio ,里面的文件就是我们要移植的源码文件。
stdio 里面有两个文件夹: include 和 lib,这两个文件夹里面的内容如图:
stdio 里面的文件其实是从 uboot 里面移植过来的,但stdio 中并没有实现完全版的格式化函数,比如 printf 函数并不支持浮点数。
main.c
移植好以后就要测试相应的函数工作是否正常,我们使用 scanf 函数等待键盘输入两个整数,然后将两个整数进行相加并使用 printf 函数输出结果。
int main(void)
{unsigned char state = OFF;int a , b;int_init(); /* 初始化中断(一定要最先调用!) */imx6u_clkinit(); /* 初始化系统时钟 */delay_init(); /* 初始化延时 */clk_enable(); /* 使能所有的时钟 */led_init(); /* 初始化led */beep_init(); /* 初始化beep */uart_init(); /* 初始化串口,波特率115200 */while(1) { printf("输入两个整数,使用空格隔开:");scanf("%d %d", &a, &b); /* 输入两个整数 */printf("\r\n数据%d + %d = %d\r\n\r\n", a, b, a+b); /* 输出两个数相加的和 */state = !state;led_switch(LED0,state);}return 0;
}
Makefile修改
修改 Makefile 中的 TARGET 为 printf,在 INCDIRS 中加入“stdio/include”,在 SRCDIRS中加入“stdio/lib”,
在编译 C 文件的时候添加了选项“-Wa,-mimplicit-it=thumb”,
否则的话会有如下类似的错误提示:
thumb conditional instruction should be in IT block -- `addcs r5,r5,#65536'
编译下载
使用 Make 命令编译代码,编译成功以后使用软件 imxdownload 将编译完成的 printf.bin 文件下载到 SD 卡中,命令如下:
烧写成功以后将 SD 卡插到开发板的 SD 卡槽中,打开 MobaXterm,设置好连接,然后复位开发板。
根据提示,输入两个整数,使用空格隔开,输入完成以后按下“回车键”,
本讲实验到此结束啦,是不是很简单~
我们下次见,比心~