1.GPIO口概念:
GPIO(英语:General-purpose input/output),通用型之输入输出的简称,,其接脚可以供使用者由程控自由使用,PIN脚依现实考量可作为通用输入(GPI)或通用输出(GPO)或通用输入与输出(GPIO),如当clk generator, chip select等。 既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。(以上内容引用百度百科,如有侵权,立刻删除)
目前我们使用的单片机型号:STM32F103R8T6 (注意:不管是用的哪一款ST的单片机芯片,永远记住不要去记代码,重要的是方法和理解。) 单片机型号含义如下图所示:
2.我对IO口的理解
目前来说单片机的功能也是越来越强大,主要表现在数据处理方面,以及集成的片上外设方面,这么强大功能,最终都是需要通过一个个IO口来展示给大家,IO口就像单片机和外部沟通的桥梁,就像我们平时交流所用的语言一样,语言就是我们人与人之间沟通的桥梁。 IO口顾名思义,就是输入输出管脚,单片机无非就是控制外部设备,以及检测外部设备状态,这一切都需要通过IO口来实现,所以你说IO口重要吗?答案是肯定的,非常重要,但是并不是很难,至少用起来不是很难,只要你明白其中的原理。 IO口的命名方式: GPIO—通用的输入输出引脚 端口—使用英文字母表示,每一个端口下16个引脚(因此一个单片机需要多少端口,是根据IO口数量来确定的)。 PA0—A端口的第0个管脚 PB5—B端口的第5个管脚 PB16—这是错误的, 没有PB16(引脚的计数是从0开始的)
3.一个经典的例子–点亮LED
其实在从刚接触到单片机之后很长一段时间内,都不是特别理解为什么很多书籍中都要以点亮一个LED灯这个实验来开始单片机课程的讲解,直到自己对单片机有了深入的理解之后,才发现这个实验确实是一个很经典而且很有代表性的一个实验。作为单片机的入门再合适不过了。 作为一名嵌入式工程师,硬件知识肯定是不可或缺的,关于硬件方面的内容,请大家自行学习,我后续也会对硬件方面进行一些整理(等工作不忙了的时候会整理)首先我们需要先分析原理图:
电路比较简单,首先你必须分析出来一下内容(我们首先分析D3一个LED灯):
D3亮---LED2必须是低电平
D3灭---LED2必须是高电平
然而LED2是在我们的单片机上连接着的,通过以上原理图可以得知LED2连接单片机的PB1管脚,因此可以得出只要PB1管脚输出高电平或者低电平的话,就可以控制我们的LED灯。
通过原理图,你必须分析出以上内容,如果以上内容分析不出来的,我建议你可以先看看电路方面的知识。 那么问题又来了,单片机中使用的是LVTTL(Low Voltage TTL)电平:
3.3V LVTTL: Vcc:3.3V;VOH>=2.4V;VOL<=0.4V;VIH>=2V;VIL<=0.8V。
我们大家都知道,计算机真正可以识别的只有二进制数,那怎么办呢?
因此就又引入了数字量的概念,当输出或者输入高电平的时候,用数字量1表示,
当输出或者输入低电平的时候,用数字量0表示。
高电平----1
低电平----0
所以在以上内容都已经搞明白之后,我们必须得出这样一个结论: 控制LED灯的本质就是,单片机通过IO口输出一个高电平或者低电平,我们需要做的工作就是如何去配置单片机产生一个高电平或者低电平,通过IO口输出去控制外部的LED灯工作。 其次特别注意的是,我说的输出,此时我们的IO口是输出一个信号。
4.配置单片机
通过上面的学习,我们已经有了一个清晰的思路,那就是我们需要单片机输出一个信号,去控制LED灯。 在写程序之前一定要有一个清晰的思路,如果此时没有思路的话,我建议你先不要去写程序,因为那样即使写的话,也会出现很多错误。 单片机的配置方式目前用的比较多的就是库函数的配置方式,寄存器也有,但是工作中现在用的比较少了,我们以库函数的配置方法为例,来实现LED的实现。
4.1配置前的准备工作
时钟的概念 时钟:简单的说,时钟是单片机的脉搏,是单片机的驱动源,使用任何一个外设都必须打开相应的时钟。这样的好处是,如果不使用一个外设的时候,就把它的时钟关掉,从而可以降低系统的功耗,达到节能,实现低功耗的效果。每个时钟tick,系统都会处理一步数据,这样才能让工作不出现紊乱。 关于时钟的理解,其实还有很多,在此大家先要明白,时钟是干什么的,先会用,等你后期对单片机有一定的了解了,再深入去学习时钟比较好,因为时钟的内容也比较多,此刻你只需要记住一点,我们在使用单片机的上的任何一项功能,都必须先打开和此项功能对应的时钟。 简单的来说对于我们现在的工作,就是打开PB1所对应的时钟,也就是B端口的时钟。 IO口模式选择 STM32的输入输出方式总共有8种 详细的介绍请大家去看以下博客: https://blog.csdn.net/liuyu60305002/article/details/6869715?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.highlightwordscore&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-1.highlightwordscore 我在此只是以写程序的角度简单给大家做一个总结,因为内部牵扯很多硬件的知识,其大家去看以上博客。 输出方式4种: 通用推挽输出–可以输出高电平或者低电平 通用开漏输出–只能够输出低电平,需要借助外部电路,才可以输出高电平 (注意:通用功能是可以通过ODR寄存器进行配置IO口状态的,但是复用功能的话ODR寄存器是控制不了的,ODR–输出数据寄存器) 复用开漏和复用推挽–一直没找到非常合适讲解,整个在我现在看来,非常不好说,必须靠理解,我的理解就是IO口的第二功能,就像我们每一个人一样,你现在会写单片机代码,但是你还是怕失业,因此你又熬了无数个夜晚学会了画PCB,学会系统编程,学会了SQL等等,你成为了一个大牛,其实复用就是将IO口用作除了输出单纯的高低电平之外的其他功能(只是限于片上外设的),以下是给大家截了一个图,自己慢慢体会吧,只可意会,不可言传。
输入方式4种: 浮空输入–电平状态是不确定的,正如它的名字一样,引脚处于悬空状态,即可能是高电平,也可能是低电平,也可能处于二者之间,一般在按键配置中会用到; 模拟输入–一句话主要用于AD转换 上拉输入–IO内部连接上拉电阻输入 下拉输入–IO内部连接下拉电阻输入 以上部分我主要是站在写程序的角度,去给大家简单说了一下,输入输出方式,随着你自己能力的提升,这些内容,都需要你自己深入去学习和理解。 通过以上内容的学习,我们应该得出一个结论,就是我们的PB0需要配置为通用推挽输出(因为输出开关量,不属于复用功能,LED灯也不属于单片机的片上外设) 首先需要先修改编译平台的宏定义如下所示:
4.2代码部分
那么接下来我们就直接上代码了: LED灯初始化函数: 看到代码还是一头雾水,其实以上代码主要内容都来自我们之前新建工程移植的官方库内部: GPIO_Pin_1—我们用的PB1,在此只是确定了我们用的是第一个引脚 GPIO_Speed_10MHz—IO口工作速率 GPIO_Mode_Out_PP—通用推挽输出 GPIO_Init();–对B端口进行初始化 设置IO口状态的两个函数: delay()–延时函数 至此一个简单的LED灯配置已经完成了。
最后一定要注意声明,和在主函数中调用: 声明: 调用:
4.3总结
a.首先一定要能够看懂原理图
b.IO口的输入输出方式一定要搞明白
c.代码部分可能与的同学还是很迷茫,怎么突然间就出现了这么多代码,我建议大家多去看看官方的库函数,这些其实都是固定的格式,前提是你要明白,为什么这样做。
d.程序的编写步骤:
打开时钟--配置IO口--最后编写了一个闪烁灯实验
学习没有什么捷径,必须要多练习,多去思考。
|