硬件工程师培训之GPIO

日期:2020-03-09 人气:1235546

image.png

        各位同事,在我们正式上课前,我们先看一个小的笑话,在这个角度看,认知GPIO,并不仅仅是一个软件工程必须的底层知识,具体到设计的时候,硬件工程师也需要对他们进行常识性的理解。

        GPIO是什么?

        

        字面意思看,GPIO=General Purpose Input Output,通用输入输出。有时候简称为“IO口”。通用,就是说它是万金油,干什么都行。输入输出,就是说既能当输入口使用,又能当输出口使用。端口,就是元器件上的一个引脚。怎么用?写软件控制。


        总结:GPIO就是芯片上的一根干啥都行的引脚。


        讲了这么多,相信不懂的人还是一头雾水,咱们对着案例看看GPIO怎么用至于上拉、下拉、悬空、高阻、开漏、推挽之类的概念,可以以后再慢慢琢磨。

        image.png

                                                    GPIO控制LED灯的开关

        

        GPIO用来做开关控制,是最常见的应用场景。


        如上图,P21这个GPIO口,输出1的时候,LED403点亮,输出0或者没有输出的时候,LED403熄灭。


        GPIO口是怎么被控制的呢?通过软件代码。需要亮灯的时候调用GPIO口拉高的函数,需要熄灯的时候调用GPIO拉低的函数,即可实现控制。函数的操作,最终变成了向这个GPIO的硬件寄存器写入数据,硬件的状态会跟随寄存器的数据改变而改变。


        硬件寄存器在这里可以理解为一个电子开关,好比你告诉家里的保姆说“去吧客厅的灯关上”,他就走过去按动灯的开关,然后灯就灭了。你下的这个指令的动作相当于调用了GPIO操作的函数,保姆去按开关这个动作相当于函数配置寄存器。


        当然你也可以直接去按这个开关(直接操作寄存器),这个做法虽然能工作,但是在代码设计中是不符合规范的。后续修改中很容易导致误操作。实际操作中需要预先初始化,配置GPIO的参数,把寄存器建立接口给其他进程调用等软件类的操作。
        image.png
                                        重力传感器输出中断信号给MCU的GPIO口
        G-sensor,也叫做重力传感器/加速度传感器/运动传感器,检测设备是否在运动的。咱们平时用的蓝牙手环的计步器主要就是根据G-sensor采样回来的运动数据计算而来的。
        
        设备不动的时候,G-sensor和MCU都是休眠状态以节省电量。

        设备动一动,G-sensor感受到了就被唤醒了,就往中断口上(GSENSOR_INT)发一个高电平信号,MCU感受到这个中断口的电平从低变成高了,就退出休眠开始正常运行。

        然后MCU就通过I2C数据接口读取G-sensor里的数据。
        如何理解中断呢?你正在睡觉,突然有人来找你,他就要先把你摇醒才行。这就是把你的睡眠中断了,让你从睡眠中被唤醒
        
        同样,如果你正在看电影,突然手机铃声响了,一看是女朋友来电话了,就要把电影暂停,保留电影当前的播放位置,然后去接女朋友的电话。接完了电话,再继续从之前的播放位置开始播放。
        这个电话就是中断信号,保存电影位置就是中断响应前的状态入栈,接电话的过程就是中断服务程序,挂了电话继续播放就是中断的状态出栈。
        可能有人会说,为什么多此一举,G-sensor不能直接把数据发送给MCU么?这是因为I2C只能由主设备主动发起数据传输的请求,从设备是不能主动发送数据的(只能任由主设备过来读取数据)。
        用GPIO做中断,还需要特别特别注意一条:如果选择这个中断口来唤醒系统,那一定要对照芯片规格书看清楚,选择的中断口能不能唤醒系统?
        对于大部分单片机,几乎每一个中断口都可以唤醒系统,但对于高主频的处理器,如手机和平板电脑的,并不是所有的GPIO都可以配置成中断,也不是所有的中断都能唤醒系统。
        
高阶应用
        GPIO做ADC,最常遇到的问题是:
        一,不是所有的GPIO口可以做ADC使用,一定要看清楚规格书!
        二,ADC有电压域限制的,3V供电的ADC测量不到超过3V的电压。例如上面第一张图,MCU用3V电池供电,此时GPIO/ADC的供电电压是3V,最大量程也是3V,可以测量到电池电压。而第二张图锂离子电池电压是4.2V,MCU供电是3V,GPIO/ADC工作电压也是3V,就量不到这么高的电压了。超出量程测量出来的都是一样的。因此利用电阻分压,把4.2V的电池电压折半降低到2.1V,给3V量程的ADC使用。
        以上知识点,请大家先自行消化下,后续我们还会继续讲解,有GPIO应用引起的PWM、I2C、CAN、SPI等外设通讯总线。
        深圳市桂科微电子有限公司,注重技术型的科技制造,努力为企业提供稳定,可控,具有性价比的PCBA控制板,通过企业自主技术研究,将有效元器件应用恰当,不附加,不合格不予采用原则。公司负责人为技术工程出身,以身作则,努力践行对每位客户的承诺。让GKVAY这个电控品牌发光发热。着重设计,认真选型,严格把控生产制造过程,SMT加工,DIP后焊,成品检验,本着认真负责的姿态,承担企业的责任义务。
    免责声明:整理本文出于传播相关技术知识,版权归原作者所有。 







    您的观点
    相关内容