Linux学习笔记5-GPIO(3)

经过之前的学习,想开始利用GPIO做一些简单的开发板应用了,做个程序完成2个功能

1.LED灯闪灭
2.通过按键来控制输出,控制开发板的蜂鸣器蜂鸣

第一个功能,LED闪灭比较简单,可以写一个led_switch函数,仍然是操作DR寄存器

void led_switch(int led, int status)
{	switch(led){case LED0:  //这里只用了LED0,可以扩展if(status == ON)GPIO1->DR &= ~(1<<3);	// 打开LED0else if(status == OFF)GPIO1->DR |= (1<<3);	// 关闭LED0break;}
}

第二个功能可以做一个条件语句,即key被按下,则switch beep的状态,和LED类似,只需要改一下GPIO的组和相应位数可以完成beep_switch()函数的定义,这里不赘述。
如何获取key按没按下,可以编写一个获取key状态的函数,方便以后在项目里通用。
原理图上KEY0连接的是UART1_CTS,通过查看手册,这个IO口是和GPIO1_IO18复用的,所以可以利用上节定义的gpio_pinread(GPIO1, 18)来读取KEY0对应的GPIO口的电平值。
获取key状态的函数不难理解,可以看注释

int key_getvalue(void)
{int ret = 0;  //返回值,即按下的是哪个键static unsigned char release = 1;  //标记,release代表是否松开,1代表已经松开,初始值是1if((release == 1)&&(gpio_pinread(GPIO1, 18) == 0))  //Key0键按下{delay(10);  //延时消抖,这个单片机也一样有release = 0;  //标记按键已按下if(gpio_pinread(GPIO1, 18) == 0)  //再次确认KEY0被按下ret = KEY0_VALUE;}else if(gpio_pinread(GPIO1, 18) == 1)  //没有按键被按下{ret = 0;  release = 1;  //按键松开}return ret;
}

这个函数可以扩展,从KEY0到KEYN都可以用,只要找到相应的GPIO口即可,可以在多按键应用中使用。

按照工程习惯,把所有外设的.c.h文件都编写好,并编写main.c。main函数要完成的工作就是在while(1)循环中实现led_switch和等待按键被按下后实现beep_switch功能即可,这里就不赘述了。
这是第一个要在开发板上编译和执行的工程,重点可以放在Makefile的编写上,而且工程的结构和以后要做的大型项目也差不多,都是外设单独写源文件,所以正好也可以看看实际工程上是怎么利用Makefile来进行编译和链接的。
这个Makefile可以作为通用版本,在大多数工程项目上都可以利用,只需要根据实际情况修改几处即可

CROSS_COMPILE 	?= arm-linux-gnueabihf-  #交叉编译器名称
TARGET		  	?= key  #代表.bin的文件名CC 				:= $(CROSS_COMPILE)gcc
LD				:= $(CROSS_COMPILE)ld    #链接器
OBJCOPY 		:= $(CROSS_COMPILE)objcopy
OBJDUMP 		:= $(CROSS_COMPILE)objdump  #反编译相关INCDIRS 		:= imx6ul \   #设置头文件所在位置(文件夹)bsp \SRCDIRS			:= project \  #设置源文件所在位置bsp \INCLUDE			:= $(patsubst %, -I %, $(INCDIRS))SFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S))
CFILES			:= $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c))SFILENDIR		:= $(notdir  $(SFILES))
CFILENDIR		:= $(notdir  $(CFILES))SOBJS			:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))
COBJS			:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))
OBJS			:= $(SOBJS) $(COBJS)VPATH			:= $(SRCDIRS).PHONY: clean$(TARGET).bin : $(OBJS)$(LD) -Timx6ul.lds -o $(TARGET).elf $^$(OBJCOPY) -O binary -S $(TARGET).elf $@$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis$(SOBJS) : obj/%.o : %.S$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<$(COBJS) : obj/%.o : %.c$(CC) -Wall -nostdlib -c -O2  $(INCLUDE) -o $@ $<clean:rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)

在用于不同工程时,只需要修改TARGET的值,和头文件、源文件文件夹,其他无需修改,就可以应用了,非常方便,所以可以把这个Makefile当作万金油。

直接在Ubuntu系统内的工程文件夹下打开中端,键入make并回车,没有问题的话就可以生成bin文件。使用正点原子推荐的SD卡烧写方式,插入到开发板上从SD卡启动,程序启动后LED0闪灭,按KEY0后蜂鸣器会响,再按一下会停,达到了我需要的功能,测试成功。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/156558.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

IP地址定位是如何实现的?

IP定位的实现是通过查找IP地址对应的地理位置信息来实现的。具体来说&#xff0c;IP定位是通过查询IP地址对应的地理位置数据库来获取地理位置信息。这个数据库可以是公共的或者私有的&#xff0c;其中包含了IP地址和地理位置信息之间的映射关系。 在实际操作中&#xff0c;IP定…

C++初级项目-webserver(1)

1.引言 Web服务器是一个基于Linux的简单的服务器程序&#xff0c;其主要功能是接收HTTP请求并发送HTTP响应&#xff0c;从而使客户端能够访问网站上的内容。本项目旨在使用C语言&#xff0c;基于epoll模型实现一个简单的Web服务器。选择epoll模型是为了高效地处理大量并发连接…

Gradle版本兼容性

Gradle版本兼容性 一、Gradle版本和Java版本对应关系 Java版本第一个支持它的Gradle版本82.094.3104.7115.0125.4136.0146.3156.7167.0177.3187.5197.6208.1 参考&#xff1a;Gradle官网) 二、Gradle版本和Kotlin版本对应关系 Gradle 版本Kotlin插件版本Kotlin 语言版本5.…

力扣 622.设计循环队列

目录 1.解题思路2.代码实现 1.解题思路 首先&#xff0c;该题是设计循环队列&#xff0c;因此我们有两种实现方法&#xff0c;即数组和链表&#xff0c;但具体考虑后&#xff0c;发现数组实现要更容易一些&#xff0c;因此使用数组实现&#xff0c;因此我们要给出头和尾变量&a…

Python (十二) 文件

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一份大厂面试资料《史上最全大厂面试题》&#xff0c;Springboot、微服务、算法、数据结构、Zookeeper、Mybatis、Dubbo、linux、Kafka、Elasticsearch、数据库等等 …

编写支持灵活过滤的列表接口以解析前端过滤表达式

为了实现支持灵活过滤的列表接口&#xff0c;你可以考虑使用一种常见的方法是通过HTTP查询参数来传递过滤条件。前端可以通过构建适当的查询参数来指定过滤条件&#xff0c;而后端则需要解析这些参数并应用到数据列表上。 以下是一个基本的示例&#xff0c;演示如何在后端使用…

Java操作MongoDB报错 java.lang.IllegalStateException: state should be: open

问题描述 我在使用Spark整合MongoDB&#xff0c;涉及到了MongoDB Colletion中的文档删除与新建&#xff08;也就是更新文档&#xff09;时&#xff0c;出现了报错java.lang.IllegalStateException: state should be: open错误代码如下 /*** 将数据保存到 MongoDB userId ->…

【Java并发编程十】同步控制二

Semaphore 信号量 Semaphore可以减少负载&#xff0c;使限制同时运行的线程数量。Semaphore的执行过程是先获取一定数量的线程&#xff0c;执行完一个释放一个semaphore&#xff0c;再去执行一个新的线程。 import java.util.ArrayList; import java.util.concurrent.Executor…

【STM32】TF卡FTA32文件系统

一、SD卡介绍 1.SD简介 本质&#xff1a;NandFlash控制芯片 2.SD卡存储容量等级 3.FAT文件系统的使用 4.SD卡速度等级 5.SD卡驱动方式 1.SDIO&&SD 1&#xff09;SDIO接口通信线&#xff1a;CLK/CMD/DAT0-3&#xff08;数据传输线4根&#xff09; 2&#xff09;SPI接口…

高压开关柜无线测温系统

高压开关柜无线测温系统是一种用于监测高压开关柜内部温度的系统。依托电易云-智慧电力物联网&#xff0c;它采用无线通信技术&#xff0c;实现对开关柜内部温度的实时监测和数据传输。下面我将为您介绍高压开关柜无线测温系统的组成、原理、功能以及优势。 一、系统组成 高压开…

JAVA项目测试----用户管理系统

一)项目简介: 用户管理系统是依据于前后端分离来实现的&#xff0c;是基于Spring SpringBoot Spring MVC&#xff0c;SpringAOP&#xff0c;MyBatis等框架来实现的一个用户管理网站&#xff0c;并且已经部署到了云服务器上, 目前的用户管理系统实现了超级管理员的注册功能&…

竞赛 题目:基于深度学习的手势识别实现

文章目录 1 前言2 项目背景3 任务描述4 环境搭配5 项目实现5.1 准备数据5.2 构建网络5.3 开始训练5.4 模型评估 6 识别效果7 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的手势识别实现 该项目较为新颖&#xff0c;适合作为竞赛课题…

python中Thread实现多线程任务

目录 多线程概括&#xff1a; 使用 Thread 模块创建线程 如果不使用多线程&#xff1a; 多线程概括&#xff1a; 多线程是一种并发执行的编程方式&#xff0c;允许程序同时执行多个独立的线程&#xff0c;每个线程在程序中运行独立的任务。每个线程都是程序的基本执行单元&a…

csdn - mermaid

目录 方向节点样式形状箭头 子图流程图类图uml图甘特图 https://blog.csdn.net/sandalphon4869/article/details/89341443 https://blog.csdn.net/swinfans/article/details/89393853 https://zhuanlan.zhihu.com/p/614018391 https://blog.csdn.net/qq_42491125/article/detai…

万字长文深入理解 cache,写出高性能代码

CACHE的一致性 Cache的一致性有这么几个层面 1. 一个CPU的icache和dcache的同步问题 2. 多个CPU各自的cache同步问题 3. CPU与设备&#xff08;其实也可能是个异构处理器&#xff0c;不过在Linux运行的CPU眼里&#xff0c;都是设备&#xff0c;都是DMA&#xff09;的cache同…

用百度AI大模型给头像换风格

心血来潮想尝试尝试AI小应用&#xff0c;给图片加个风格&#xff08;例如微信头像&#xff09;&#xff0c;于是有了这篇简短的教程 目录 1. 领取免费资源2. 在应用列表创建应用3. 在线API调试4. 效果对比 1. 领取免费资源 网站&#xff1a;百度智能云 百度给提供了很多AIGC的…

OpenCV入门7——OpenCV中的滤波器(包括低通滤波与高通滤波,其中低通滤波用于降噪,而高通滤波用于边缘检测)

文章目录 图像滤波卷积相关概念锚点 实战图像卷积Blur an image with a 2d convolution matrix 方盒滤波与均值滤波高斯滤波中值滤波双边滤波高通滤波—索贝尔算子高通滤波—沙尔算子高通滤波—拉普拉斯算子边缘检测Canny 图像滤波 卷积核滤波器 卷积相关概念 锚点 锚点…

详解硬盘的接口、总线和协议

总线&#xff1a;总线是计算机系统中用于连接各个硬件组件的一种通信方式&#xff0c;它可以实现数据、地址和控制信号的传输。在服务器中&#xff0c;内部总线起着承载数据和控制信号的重要作用。总线在单位时间内能传输数据量称为带宽。分为SATA&#xff0c;SAS&#xff0c;P…

linux 系统调用流程分析

x86 1.系统调用 系统调用是用户空间程序与内核交互的主要机制。系统调用与普通函数调用不同&#xff0c;因为它调用的是内核里的代码。使用系统调用时&#xff0c;需要特殊指令以使处理器权限转换到内核态。另外&#xff0c;被调用的内核代码由系统调用号来标识&#xff0c;而…

牛顿迭代法求平方根--C++简单实现

1. 简介 牛顿迭代法是求近似根的一种方法。 以求平方根为例。 如 x 2 m x^2m x2m 令 f ( x ) x 2 − m f(x)x^2-m f(x)x2−m 则 f ′ ( x ) 2 x f(x)2x f′(x)2x 函数 f ( x ) f(x) f(x)在 x 0 x_0 x0​处的切线方程为 g ( x ) f ′ ( x 0 ) ( x − x 0 ) f ( x 0 ) g(…