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

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

物理上来说,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文件来写自己的代码了。这个我们下一章再说。

嵌入式开发学习之--点亮LED灯(中)相关推荐

  1. 嵌入式开发学习之--点亮LED灯(上)

    在嵌入式学习里,点亮LED灯的地位就如同编程语言学习里的"hello world",是每个初学者都必须经历的一关,因为点亮了LED灯,至少可以说明几件事: 1.开发环境没问题,包括 ...

  2. 【STM32学习笔记-点亮LED灯】

    STM32学习笔记-点亮LED灯 文章目录 STM32学习笔记-点亮LED灯 一.原理图分析 二.代码分析 1.mian函数 2.led.c函数 3.led.h函数 4.函数文件整理 5.LED_In ...

  3. STM8学习笔记---点亮LED灯

    对单片机操作时一般有三个步骤,1.系统时钟选择.2.单片机外设初始化.3主程序编写. 同样要点亮LED灯时,也要按照这个步骤来. 首先选择系统时钟,打开STM8S中文参考手册,找到时钟寄存器 可以看到 ...

  4. 【小月电子】安路国产FPGA开发板系统学习教程-LESSON1点亮LED灯

    点亮LED灯例程讲解 若要观看该博客配套的视频教程,可点击此链接 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去其中一些步骤.比如非常简单的项目,我们 ...

  5. 【小月电子】XILINX FPGA开发板(XLOGIC_V1)系统学习教程-LESSON1点亮LED灯

    点亮LED灯例程讲解 若要观看该博客配套的视频教程,可点击此链接 开发板实物图 图1.FPGA设计流程 根据多年工作经验,总结出的FPGA的设计流程,概括起来总共有以上12步,其中根据项目难易度可省去 ...

  6. 嵌入式开发学习笔记9-做一个好玩的LED闪烁

    嵌入式开发学习笔记9-做一个好玩的LED闪烁 前言 实际操作 程序功能 实现思路 程序源码 实现效果展示 前言 LED小灯闪烁实质是控制单片机上的I/O口,通过向I/O口循环输入高低电平,从而控制LE ...

  7. 和12岁小同志搞创客开发:手撕代码,点亮LED灯

    目录 1.Arduino编程架构 2.点亮LED灯 机缘巧合在网上认识一位12岁小同志,从零开始系统辅导其创客开发思维和技巧. 项目专栏:https://blog.csdn.net/m0_381069 ...

  8. DSP(TMSF280049C)学习笔记2:点亮LED灯

    DSP(TMSF280049C)学习笔记2:点亮LED灯 实验目的:点亮Texas InstrumentsTMSF280049C开发板,LED0与GPIO23相连,下载到FLASH,具体代码如下: # ...

  9. Arduino学习(三)点亮LED灯

    本篇开始,学习用Arduino控制各种外部电子元器件.传感器等,学习如何搭建相关电路. 用Arduino搭建电路有两种方式: 方式1: 购买并使用Arduino现成的模块:由于模块本身已经做好了电路, ...

最新文章

  1. 第二篇T语言实例开发(版本5.3),福彩3D摇号器
  2. access开发精要(10)-筛选
  3. linux 查看内核属性,怎么查看linux操作系统
  4. Java多线程-线程中止
  5. apache ftp server的外网访问问题
  6. SwipeRefreshlayout+RecyclerView+binding实现上拉和下拉刷新
  7. linux下rust编译环境搭建
  8. oracle 证书编号,说说Oracle的rowid
  9. android 列表图片优化经历
  10. 【爬虫剑谱】一卷2章 软件篇-EdgeDriver的安装及配置
  11. android 触摸监听重写_第六十四回:Android中UI控件之SeekBar
  12. 【原始图像】对数及对比度扩展变换
  13. 恐怖谷与深度爵士:计算机艺术能达到人类的高峰吗
  14. 计算机毕业设计-springboot协同办公管理系统-公文流转系统代码设计-多人协同办公讨论管理系统
  15. C++实现化学方程式配平
  16. 变化检测综述:Change Detection Based on Artificial Intelligence: State-of-the-Art and Challenges
  17. 谨慎解决:找不到指定的模块(Exception from HRESULT:0X8007007E)
  18. PTA 7-191 百钱百鸡
  19. opencv中使用摄像头录制视频
  20. 【总结】新产品开发阶段的名词 EVT/DVT/PVT/MP

热门文章

  1. 跟我一起学软考吧 | (中级)多媒体应用设计师—备考软件推荐
  2. 辰华宏命令(Macro Command)使用说明
  3. 大自然背景的清晨闹铃.wav
  4. 基于Java的蛋糕甜点店销售(商城)系统
  5. 韦一之内存控制器,2440地址空间,NOR flash和SDRAM(012课)
  6. 2023 源支付码支付系统源码v3.0 二开修复版 全本地化
  7. 软件/APP/产品投放渠道分类大全
  8. 一文读懂AlphaGo背后的强化学习
  9. C# 中用 Sqlparameter 的几种用法
  10. 数组遍历产生的索引越界问题