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

2024-06-06 04:12

本文主要是介绍I.MX6ULL 串口格式化函数移植实验,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

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
在这里插入图片描述

这篇关于I.MX6ULL 串口格式化函数移植实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035058

相关文章

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

Python中help()和dir()函数的使用

《Python中help()和dir()函数的使用》我们经常需要查看某个对象(如模块、类、函数等)的属性和方法,Python提供了两个内置函数help()和dir(),它们可以帮助我们快速了解代... 目录1. 引言2. help() 函数2.1 作用2.2 使用方法2.3 示例(1) 查看内置函数的帮助(