嵌入式开发学习之--点亮LED灯(下)

news2025/1/17 14:07:36

上篇我们主要学习的是环境搭建和实际操作,这篇详细记录一下整个思考的过程。

首先,我们需要想一个问题,这个灯为什么会亮?

物理上来说,LED灯属于发光二极管,只要有正确的电压就会发亮。也就是说,我们烧写的代码,让led灯有了电压,那么电压又是如何形成的呢?我们来看一下原理图。

通过原理图我们可以看到,有三个灯,分别标识着是R(red)/G(green)/B(blue)红绿蓝三种颜色。他们的左端连接在一起,通过一个跳线帽连接在了3.3V电源上,另一端各自经过一个电阻,分别连接在了单片机的PH10,PH11,PH12上,而我们如果要让任何一路灯亮,需要做的就是让其形成回路。比如我们要将红灯点亮,如图,只需要将PH10引脚接地,这样就会形成回路,从而点亮LED灯。也就是说,我们可以把“点亮led灯”这个任务转换成控制单片机引脚PH10接地,而控制的方法就是配置对应的寄存器。

什么是寄存器

寄存器是一个非常重要的概念。但要具体了解他,还需要了解单片机的组成,结构,等等一系列让人看着头晕脑胀的东西。所以我们尝试换个角度来解读:

单片机有很多引脚很多功能,我们要调用单片机的某项功能,则需要找到能够实现该功能的地址,而寄存器就是寄存对应地址的内存单元。通过寄存器就能更方便的找到对应的功能。

举个例子:我们来到一个城市,要去找一间酒店住下,我们要做的是首先打开百度地图,输入该酒店的名称,然后跟着导航就能过去了。我们把城市看成是个单片机,这个城市里的酒店,网吧,饭店等等就是这个城市的各项功能。当我们想要享受这些功能时,我们需要的是先找到它们的地址。而真实的地址是什么,是一个经纬度坐标,可如果你告诉司机师傅你要去36.10849,114.35511,那么估计师傅会客气的让你滚,因为这不是正常人能聊的出来的东西。而我们如果添加一个映射,将这个经纬度坐标映射到“河南省安阳市北关区星程酒店”,我们只需要知道这个地址,而不需要再关心后面的经纬度坐标,这样是不是就好记了很多。

同理,在单片机中也是有着丰富的资源,他们都有着属于自己的地址,但如果你要直接调用这些地址,也不是不行,但是非常容易出错,而且也不容易记得住。但如果我们根据他们的功能,起不同的名字,并把他们的地址和这些名字映射在一起,那么,我们只需要告诉单片机这些名字而不用关心后面的地址,这样便不容易出错,而且代码的可读性也会上升一大个层次。专业的说存储地址的内存单元就叫寄存器,而我们起名字的这个行为,就叫做寄存器映射。

这两者本质相同

花了不少篇幅来写寄存器,因为我们后面基本会一直和它打交道,写到这里其实还有一个想说的,那就是映射。

映射是一个数学名词,是说两个集合X,Y如果存在某种法则,使X中的元素x有唯一的y与之对应,那么这种关系可以称为映射。

在编程中,我们其实无时无刻的不在用这种理念,无论是函数,结构体,什么接口,驱动,包括c++的类,对象,再包括其它语言中的插件,控件,等等,在我的理解里本质上都是映射。而映射的好处太多了,提高效率,可读性强,扩展性好。所以在自己想要完成一项作品时,一定要有这种概念。如果后续能坚持继续更新,我会结合实际例子来说一下。

好了,继续说回点亮led灯。现在已知我们想要点亮led灯,那么就需要将PH10引脚给接地。又简单地了解了想要控制单片机里的各种资源,只需要找到对应的寄存器便好了,那么也就是说我们需要找到对应的寄存器控制PH10引脚接地,那么便可以点亮led灯。也就是说,现在我们的任务,是寻找对应的寄存器。

GPIO端口

在查找寄存器之前,我们再来了解一下什么是gpio端口,它是通用输入输出端口的简称,是引脚最普通的一种用法,其实芯片上的大部分引脚都是gpio端口。我们一直说的PH10也是一个gpio端口,他可以配置成多种输入输出模式(配置方式当然还是通过寄存器),通过上拉和下拉输出高电平和低电平。而我们所说的控制PH10引脚接地,也就是控制这个引脚输出一个低电平。

也就是说,要点亮led灯,最终我们需要做的就是通过寄存器将PH10引脚配置成输出模式,并输出一个低电平。

高电平与低电平

我们知道计算机是二级制语言,无论你的软件是用何种语言,何种框架,最终转换到计算机上的就是0和1,而物理上对应的就是低电平和高电平。这里注意的是,高低电平是相对的,而不是固定的电压值。
 

 

GPIO端口的工作模式

gpio的工作模式有普通的输入输出,复用,模拟几种,而输出又包括了上拉,下拉,推挽,开漏。如下图,每种模式有其自身的特点,如上拉下拉比较弱,推挽输出高低电平0-3.3v快速切换,开漏可以高阻态,拉升到5v,复用会配置成特殊功能等等,这里不做详细介绍,我们只需要点亮一个LED灯,把引脚配置成普通输出-推挽模式就可以,这也是除了复用以外最常用的一种输出配置

启动文件

理论整理的差不多了,接下来就该是代码工程了。首先是启动文件,顾名思义,单片机上电启动后,会首先先执行启动文件里的内容。它里面有汇编写好的程序,启动后,就给我们建立起c语言运行的环境。该文件使用的汇编指令是 Cortex-M4 内核支持的指令,可从《Cortex-M4 Technical Reference Manual》查到,也可参考《Cortex-M3 权威指南中文》,M3 跟 M4 大部分汇编指令相同。

当然,这个文件并不需要我们编写,官网有现成的,所以我们简单了解下他的作用。

1.初始化堆栈指针SP(Stack Pointer)

2.初始化程序计数器指针PC(Program Counter)

3.设置堆、栈的大小

4.设置中断向量表的入口地址

5.配置外部SRAM为外部存储器(一般由用户配置,因为一般的板子没有这        个)

6.调用SystemInit()函数配置系统时钟。

7.设置C库的分支入口“_main()”(最终调用main函数)

以上内容不太懂的话看看就好,你只需要知道去官网找到和你单片机匹配的启动文件(或者开源工程里找),然后把它加入到你的代码工程中去,然后你就可以通过SystemInit()配置时钟,main()函数写应用程序。

有了启动文件,有了入口函数,那么我们便可以写自己的代码了。还记得我们的任务吗?点亮led灯=>通过寄存器将PH10引脚配置成输出模式并输出低电平。既然要控制寄存器,那么就要先做好寄存器映射,这些内容都在"stm32f4xx.h"中,如图。

有了启动文件,寄存器配置文件,接下来,我们便可以创建main文件来写自己的代码了。这个我们下一章再说。

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

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

相关文章

01 DevOps 之 Git 命令使用

1. 前言 由于项目没有外网,需要在内网打镜像。但自己对git 还不是太熟悉。看着pipline 一脸懵逼。所有针对git 命令在工作中常用的参数及用法简单学习记录下。因为git 是DevOps中的编码的一部分,下面先介绍下DevOps整体的框架。 1.1 DevOps介绍 DevOp…

Linux-磁盘分区,挂载

Linux分区 Linux来说无论有几个分区,分给哪一个目录使用,它归根结底就只有一个根目录,一个独立且唯一的文件结构,Linux中每个分区都是用来组成文件系统的一部分 Linux采用了一种载入的处理方法,它的整个文件系统包含了…

智能运维应用之道,告别企业数字化转型危机

面临的问题及挑战 数据中心发展历程 2000 年中国数据中心始建,至今已经历以下 3 大阶段。早期:离散型数据中心 IT 因以项目建设为导向,故缺乏规划且无专门运维管理体系,此外,开发建设完的项目均是独立运维维护&#…

rust编程初探-猜数游戏(chapter 2)

目录 1. 创建项目 2. 猜数的输入 3. 随机数生成 3.1 rand库依赖 3.2 随机数生成 4. 猜数和随机数的比对 4.1 std::cmp::Ordering类型 4.2 match表达式(expression) 4.3 输入类型的转换 5. 支持多次猜测(使用循环) 6. 错…

MySql学习之慢SQL优化和慢SQL案例

一、慢SQL优化思路 慢查询日志记录慢SQLexplain查询SQL的执行计划profile分析执行耗时Optimizer Trace分析详情 1、慢查询日志记录慢SQL show variables like slow_query_log%; show variables like long_query_time;查看下慢查询日志配置,我们可以使用show vari…

对MMVAE中IWAE代码实现的理解

原始的IWAE 优化目标: LIWAE(x1:M)Ez1:K∼qΦ(z∣x1:M)[log⁡∑k1K1KpΘ(zk,x1:M)qΦ(zk∣x1:M)](1)\mathcal{L}_{\mathrm{IWAE}}\left(\boldsymbol{x}_{1: M}\right)\mathbb{E}_{\boldsymbol{z}^{1: K} \sim q_{\Phi}\left(\boldsymbol{z} …

JavaScript

目录 1、JavaScript简介 2、JavaScript引入方式 2.1、内部脚本 2.2、外部脚本 3、JavaScript基础语法 3.1、书写语法 3.2、输出语句 3.3、变量 3.4、数据类型 3.5、运算符 3.5.1、 和 的区别 3.5.2、类型转换 3.6、流程控制语句 3.6.1、if语句 3.6.3、for循环语…

【毕业设计】时间序列天气预测系统 - LSTM

文章目录0 前言1 数据集介绍2 开始分析2.1 单变量分析2.1.1 温度变量2.2 将特征和标签切片2.3 建模2.4 训练模型2.5 多变量分析2.5.1 压强、温度、密度随时间变化绘图2.5.2 将数据集转换为数组类型并标准化2.5.3 多变量建模训练训练3 最后0 前言 🔥 Hi,…

vue项目身份认证,vuex,token

vuex存储用户登录信息以及解决页面刷新vuex数据丢失问题 我的文章:vuex页面刷新数据丢失问题的多种解决方法 有写到 身份认证 虽然完成了登录功能,但实际上现在用户没登录也能访问(对应的url),这样的话显得登录功能毫无意义。 为了让登录变得有意义&am…

【Linux】Linux系统管理详解

目录一.服务管理1.Linux中的进程和服务2.systemctl(CentOS 7版本)(1)基本语法(2)经验技巧二.系统运行级别1.CentOS的运行级别三.配置服务开机自启和关闭防火墙1.图形化服务开机自启2.命令行服务开机自启3.关闭防火墙自启动四.关机重启以下内容都是基于Ce…

排序算法-希尔排序

希尔排序 概念 希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。 希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。 它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小&a…

通达信最新交易接口系统开发源码有哪些?

通达信最新交易接口其实跟市面上的自动交易接口api是比较安全稳定接口,只需要通过第三方证券公司完成交易,也或者是个人与机构做私募量化投资也是可以的。但是最近小编就有注意到,在此之前的通达信接口已经完成了再次升级,那么&am…

JAVA开发(分布式SpringCloud全家桶一些组件读法)

配置管理,服务发现,断路器,路由,微代理,事件总线,全局锁,决策竞选,分布式会话构成SpringCloud的集合。 Eureka服务注册与发现(Eureka:怎么读?&…

没基础的大学生如何自学c语言 ?

C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点,在程序设计中备受青睐。真的太多人学也有太多要学的东西了,以至于后台总有人问C语言该怎么学,甚至还有具体问编程问题的。 这一点专门针对「大部分时间都在写着重复的代码&a…

uniapp初步搭建:如何引入uview库(跨移动多端ui库)

uView是uni-app生态专用的UI框架,uni-app 是一个使用 Vue.js 开发所有前端应用的框架,开发者编写一套代码, 可发布到iOS、Android、H5、以及各种小程序(微信/支付宝/百度/头条/QQ/钉钉)等多个平台(引言自uni-app网) 1. 查看项目根目录有没有p…

公钥密码学中的公钥和私钥

公钥密码学解释:它是什么? 公钥基础设施 (PKI) 用于管理互联网通信中的身份和安全性。 启用 PKI 的核心技术是公钥密码术,这是一种依赖于使用两个相关密钥(公钥和私钥)的加密机制。 这两个密钥一起用于加密和解密消息。…

CM311-3_YST_晨星MSO9385_2+8_安卓9.0_TTL免费升级固件【含教程】

新魔百盒CM311-3_YST_晨星MSO9385_28_安卓9.0_TTL免费升级固件【含教程】 固件特点: 1、修改dns,三网通用; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、无开机广告,无系统更新,不在被强制升级&…

网站攻击技术,一篇打包带走!

大家好,今天给大家介绍一下,Web安全领域常见的一些安全问题。 1. SQL 注入 SQL注入攻击的核心在于让Web服务器执行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作,达到其邪恶的…

分布式应用之监控平台zabbix的认识与搭建

内容预知 1.监控系统的相关知识 1.1 监控系统运用的原因 1.2 网站的可用性 1.3 市面上常用的监控系统 2.zabbix的相关知识 2.1 zabbix的概述 2.2 zabbix 是什么? 2.3 zabbix的监控原理 2.4 zabbix监控系统中五个常用程序 3. zabbix 服务端的部署 4. 部署…

C++ 不知图系列之基于链接表的无向图最短路径搜索

1. 前言 图的常用存储方式有 2 种: 邻接炬阵。 链接表。 邻接炬阵的优点和缺点都很明显。优点是简单、易理解,但是对于大部分图结构而言,都是稀疏的,使用矩阵存储,空间浪费就较大。 链接表相比较邻接矩阵存储方案…