阅读小tips!(Look at my eyes!)


本篇基于电子类大学生自主学习嵌入式的学习总结,知识点理解输出较于浅显,只适用于深入学习stm32前的一些理解和引导,或是大学期末前一周速通,若要深入学习嵌入式,可借助阅读本篇来搭建一个入门嵌入式的框架,而后想深入可转战b站等学习网站,有更多的大牛在等待你!

一. 环境搭建


本篇学习使用市面上常用的KeliArm+STM32cubeMX!

博主已将下载链接放在下行,有需要自行下载!包括 isp,以及博主认为好用的串口助手 ! 

 通过网盘分享的文件:环境
链接: https://pan.baidu.com/s/1kbvOHSh7MQoJGi6vWw9fSA?pwd=2weg 提取码: 2weg

下载方面的教程可自行移步到b站大学!博主(交学费版)在此感谢up主铁头山羊老师!

博主的学习笔记中摘取了铁头山羊老师的讲义,有需要可异步至b站听取老师视频教程!

二.  GPIO


1.  什么是GPIO?

初学者总疑问GPIO到底代表什么?其实并没有那么深奥,就是简单的英文代称如下:

没错,就是这么简单直白,GPIO就是MCU上一种片上外设。初学者不妨先这么理解,CPU控制GPIO输入0/1,通过引脚向外界输出高电平或低电平,或通过外部信号输入至内部寄存器。


2. GPIO的八种工作模式

八种工作模式: 


输出模式:

通用模式:如下图,通过CPU直接输出0/1,控制引脚输出高低电平。

复用模式:如下图,通过其他片上外设来控制引脚输出高低电平。

推挽模式:

提示:Vdd(voltage drain drain)- 高电压,此处为3.3V

           Vss(voltage source source)- 此处为GND 

推挽模式中 :P-MOS 与 N-MOS 交替导通!!!


推(推出)模式中:

CPU输出1,内置P-MOS导通,N-MOS断开,电流从Vdd输入,IO口连接高电压,输出高电平。

挽(挽留)模式中:

CPU输出0,内置P-MOS断开,N-MOS导通,电流流向Vss,IO口连接GND,输出低电平。


开漏模式:

为何称为开漏?

如下图中,IO口连接 P-MOS 源极与 N-MOS 漏极,在此模式下,P-MOS 恒断开,由于IO口

连接 N-MOS 漏极,即称为开漏模式。

 开漏模式

当CPU输出0,内置P-MOS断开,N-MOS导通,电流流向Vss,IO口连接GND,输出低电平。

当CPU输出1,内置P-MOS断开,N-MOS断开,IO口上无电流,此时R无穷大,称为高阻态。


输入模式:

 外界方波信号通过IO口输入至内部经过施密特触发器(想学的深入数字电路)将高电平转化为1,将低电平转化为0,不过不用担心,在这里可以将施密特触发器看做无穷大电阻,电流趋近于0。

输入上拉:

IO口输入高电平,经过转换,向输入数据寄存器中写1 。

输入下拉:

IO口输入低电平,经过转换,向输入数据寄存器中写0 。

保护二极管作用:

防止静电,当外部输入携带正电荷时,电流从IO口通过上方二极管流向Vdd。

当外部输入携带负电荷时,电流从Vss通过下方二极管流向IO口。

上拉电阻和下拉电阻:

当IO口为输入浮空状态时,若上拉电阻使能,给电路提供默认高电压,将施密特触发器看做无穷大电阻,则此处分得高电压,将此处电压转化为1,写入输入数据寄存器。

若下拉电阻使能,给电路提供默认低电压,同理此处分得低电压,将此处电压转化为0,写入输入数据寄存器。

3.GPIO的最大输出速度


什么是IO的最大输出速度呢?

理想如图所示,但现实情况并非如此。

在实际的向IO写0/1时,电压并不能瞬间从3.3V切换至0V,而是有上升时间,下降时间,以及真正有效的电压转换的保持时间。上升时间与下降时间越短,IO的最大输出速度也就越大。

如下图所示中:

 但随着上升时间下降时间的变短,上升下降坡度越来越陡,保持时间趋向0时,则不能采集到实际的电压变化,在保持时间内电压状态才能正常采集。

STM32中共有三种输出速度:

低速 = 1/(125+250+125)ns = 2MHz 

中速 = 1/(25+50+25)ns = 10MHz 

高速 = 1/(5+10+5)ns = 50MHz 

 提示:在配置输出速度时,并不是速度越快越好,而是要选取满足要求的最小值

这是由于

过于陡峭的边沿会增加功耗(耗电过大),并引入EMI问题(对其他电子元器件产生电磁干扰)。

GPIO的输出实验

基于标准库实现,LED灯的闪烁实验:

               LED灯的推挽接法                                                            LED灯的开漏接法

限流电阻的作用:

通过发光二级管的电流通常为2-10mA,限流电阻将电流控制在此范围内,保护二极管。

LED实验代码部分(main)

模版链接:https://pan.baidu.com/s/1kcKd063anDtFZ1gG97cOKg?pwd=3kvt 提取码:3kvt

tips:铁头山羊老师的模版,应用标准库,另添加了PAL库。

LED原理图如下:

伪代码: 

//1.开启GPIOC时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);

 为何要开启GPIOC的时钟?

MCU为节省功耗,默认情况下,部分片上外设时钟处于关闭状态,需要手动使能。

//2.初始化IO引脚,PC13通用输出开漏模式
GPIO_InitTypeDef GPIO_InitStruct = {0};

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_13;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOC,&GPIO_InitStruct);

LED间隔0.1s闪烁

#include <delay.h> //PAL库
while(1)
{
    GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//亮
    Delay(100);
    GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//灭
    Delay(100);
}

GPIO的输入实验

基于标准库实现,通过按钮控制LED亮灭。采用上方LED,此处默认LED已初始化。

//1.开启GPIOA时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

//2.初始化IO引脚,PA1采用输入上拉模式
//GPIO_InitTypeDef GPIO_InitStruct = {0};//可省略

GPIO_InitStruct.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;
//GPIO_InitStruct.GPIO_Speed = GPIO_Speed_2MHz;

GPIO_Init(GPIOA,&GPIO_InitStruct);

 按键主函数,按下点亮,松开熄灭


while(1)
{
   if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)==Bit_RESET)//按下
    {
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_RESET);//亮
    }

  else
    {
        GPIO_WriteBit(GPIOC,GPIO_Pin_13,Bit_SET);//灭
    }
}

创作不易,请多多点赞,收藏,转发,您的支持,是我创作最大的动力!

内容若有误,在所难免,还望指出,定会积极订正,不胜感激,还望海涵!

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐