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

相关文章

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

Android Kotlin 高阶函数详解及其在协程中的应用小结

《AndroidKotlin高阶函数详解及其在协程中的应用小结》高阶函数是Kotlin中的一个重要特性,它能够将函数作为一等公民(First-ClassCitizen),使得代码更加简洁、灵活和可... 目录1. 引言2. 什么是高阶函数?3. 高阶函数的基础用法3.1 传递函数作为参数3.2 Lambda

C++中::SHCreateDirectoryEx函数使用方法

《C++中::SHCreateDirectoryEx函数使用方法》::SHCreateDirectoryEx用于创建多级目录,类似于mkdir-p命令,本文主要介绍了C++中::SHCreateDir... 目录1. 函数原型与依赖项2. 基本使用示例示例 1:创建单层目录示例 2:创建多级目录3. 关键注

C++中函数模板与类模板的简单使用及区别介绍

《C++中函数模板与类模板的简单使用及区别介绍》这篇文章介绍了C++中的模板机制,包括函数模板和类模板的概念、语法和实际应用,函数模板通过类型参数实现泛型操作,而类模板允许创建可处理多种数据类型的类,... 目录一、函数模板定义语法真实示例二、类模板三、关键区别四、注意事项 ‌在C++中,模板是实现泛型编程

kotlin的函数forEach示例详解

《kotlin的函数forEach示例详解》在Kotlin中,forEach是一个高阶函数,用于遍历集合中的每个元素并对其执行指定的操作,它的核心特点是简洁、函数式,适用于需要遍历集合且无需返回值的场... 目录一、基本用法1️⃣ 遍历集合2️⃣ 遍历数组3️⃣ 遍历 Map二、与 for 循环的区别三、高

C语言字符函数和字符串函数示例详解

《C语言字符函数和字符串函数示例详解》本文详细介绍了C语言中字符分类函数、字符转换函数及字符串操作函数的使用方法,并通过示例代码展示了如何实现这些功能,通过这些内容,读者可以深入理解并掌握C语言中的字... 目录一、字符分类函数二、字符转换函数三、strlen的使用和模拟实现3.1strlen函数3.2st

如何使用C#串口通讯实现数据的发送和接收

《如何使用C#串口通讯实现数据的发送和接收》本文详细介绍了如何使用C#实现基于串口通讯的数据发送和接收,通过SerialPort类,我们可以轻松实现串口通讯,并结合事件机制实现数据的传递和处理,感兴趣... 目录1. 概述2. 关键技术点2.1 SerialPort类2.2 异步接收数据2.3 数据解析2.

QT移植到RK3568开发板的方法步骤

《QT移植到RK3568开发板的方法步骤》本文主要介绍了QT移植到RK3568开发板的方法步骤,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录前言一、获取SDK1. 安装依赖2. 获取SDK资源包3. SDK工程目录介绍4. 获取补丁包二

MySQL中COALESCE函数示例详解

《MySQL中COALESCE函数示例详解》COALESCE是一个功能强大且常用的SQL函数,主要用来处理NULL值和实现灵活的值选择策略,能够使查询逻辑更清晰、简洁,:本文主要介绍MySQL中C... 目录语法示例1. 替换 NULL 值2. 用于字段默认值3. 多列优先级4. 结合聚合函数注意事项总结C

Java8需要知道的4个函数式接口简单教程

《Java8需要知道的4个函数式接口简单教程》:本文主要介绍Java8中引入的函数式接口,包括Consumer、Supplier、Predicate和Function,以及它们的用法和特点,文中... 目录什么是函数是接口?Consumer接口定义核心特点注意事项常见用法1.基本用法2.结合andThen链