你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32按键的GPIO模式GPIO_Mode_IPU/GPIO_Mode_IN_FLOATING

[复制链接]
GKoSon 提问时间:2018-6-4 17:09 /

硬件原理图

GPIO的C13和E0是两个按键,平时是高电平,当按键下去的时候就接地变成低电平。

开始软件配置:

宏定义两个按键

#define TSKEY1GPIO                                  GPIOC

#define TSKEY1GPIOPIN                               GPIO_Pin_13

#define TSKEY1IRQ                                   EXTI15_10_IRQn
#define TSKEY1_ExtiPortsource                  GPIO_PortSourceGPIOC
#define TSKEY1_ExtiPin                                    GPIO_PinSource13
#define TSKEY1_Line                                  EXTI_Line13




#define TSKEY2GPIO                                  GPIOE
#define TSKEY2GPIOPIN                               GPIO_Pin_0
#define TSKEY2IRQ                                                EXTI0_IRQn
#define TSKEY2_ExtiPortsource                  GPIO_PortSourceGPIOE
#define TSKEY2_ExtiPin                                    GPIO_PinSource0
#define TSKEY2_Line                                  EXTI_Line0

初始化函数:



void TS_Key_init(void)
{


    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    EXTI_InitTypeDef EXTI_InitStructure;
  
    RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOE| RCC_APB2Periph_AFIO,ENABLE ) ;
          //RCC_APB2Periph_AFIO不能没有!!
       


    GPIO_InitStructure.GPIO_Pin = TSKEY1GPIOPIN ;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;//MUST 如果是GPIO_Mode_IN_FLOATING则失败;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(TSKEY1GPIO, &GPIO_InitStructure);


    NVIC_InitStructure.NVIC_IRQChannel = TSKEY1IRQ;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);


    GPIO_EXTILineConfig(TSKEY1_ExtiPortsource, TSKEY1_ExtiPin);
    EXTI_InitStructure.EXTI_Line = TSKEY1_Line;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;  
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);
               
               
    GPIO_InitStructure.GPIO_Pin = TSKEY2GPIOPIN ;
    GPIO_Init(TSKEY2GPIO, &GPIO_InitStructure);
               
    NVIC_InitStructure.NVIC_IRQChannel = TSKEY2IRQ;
   NVIC_Init(&NVIC_InitStructure);
               
    GPIO_EXTILineConfig(TSKEY2_ExtiPortsource, TSKEY2_ExtiPin);
    EXTI_InitStructure.EXTI_Line = TSKEY2_Line;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling ;  
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_Init(&EXTI_InitStructure);

}


现在就可以用中断了,到it.c去写服务程序吧。

int it=100;

u8 EXit_Delay(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin)//消抖 延时以后去读 如果还是低电平 那就是中断!
{
    OSTimeDlyHMSM(0, 0, 0, 100);
    if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin)==RESET)       
        return 1;
    else
        return 0;
}
这里主要是因为init的时候是下降沿是中断,所以去读,如果是0那就真的是中断。


void EXTI0_IRQHandler(void)
{
       OS_CPU_SR  cpu_sr;
        OS_ENTER_CRITICAL();
        OSIntNesting++;
        OS_EXIT_CRITICAL();


        if(EXTI_GetITStatus(TSKEY2_Line) != RESET)
        {
      
       if( EXit_Delay(TSKEY2GPIO,TSKEY2GPIOPIN))
       {
                 it+=10;
       }
               
                EXTI_ClearITPendingBit(TSKEY2_Line);
        }
        OSIntExit();


}
       

void EXTI15_10_IRQHandler(void)
{
    OS_CPU_SR  cpu_sr;

    OS_ENTER_CRITICAL();
    OSIntNesting++;
    OS_EXIT_CRITICAL();


    if(EXTI_GetITStatus(TSKEY1_Line) != RESET)            
    {
        if( EXit_Delay(TSKEY1GPIO,TSKEY1GPIOPIN))
       {
                 it-=5;
      }
      EXTI_ClearITPendingBit(TSKEY1_Line);
    }
   
    OSIntExit();

}


思考:

1对比文章

http://blog.csdn.net/tianshi_1988/article/details/52175434

为什么 GPIO_Mode_IPU成功  GPIO_Mode_IN_FLOATING失败;

2复用不能丢

3消抖是软件写的,如果你是上升沿触发的话,那就是延时一会读,是1


论坛问问:GPIO_Mode_IPU是怎么回事?我百度看到是:

  1、          上拉输入(GPIO_Mode_IPU)

上拉输入就是信号进入芯片后加了一个上拉电阻,再经过施密特触发器转换成0、1信号,读取此时的引脚电平为高电平;

4、          浮空输入(GPIO_Mode_IN_FLOATING)

信号进入芯片内部后,既没有接上拉电阻也没有接下拉电阻,经由触发器输入。

配置成这个模式后,用电压变量引脚电压为1点几伏,这是个不确定值。由于其输入阻抗比较大,一般把这种模式用于标准的通讯协议,比如IIC、USART的等。

我没有看到 施密特触发器 这个啥呀? 别人博文为什么用 GPIO_Mode_IN_FLOATING行呢?

收藏 评论5 发布时间:2018-6-4 17:09

举报

5个回答
wudianjun2001 回答时间:2018-6-5 08:40:23
输入要有一个固定的电平才好判断,按键要上拉的,否则可能会悬空,输入的电平忽高忽低

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

七哥 回答时间:2018-6-4 18:54:27

11.jpg
12.jpg

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

radio2radio 回答时间:2018-6-4 19:17:25
本帖最后由 radio2radio 于 2018-6-4 19:19 编辑

施密特触发器,相当于一个信号整形器,可以滤除信号的毛刺。
别人博文为什么用 GPIO_Mode_IN_FLOATING行,可能别人的IC外面有上拉电阻。

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

五哥1 回答时间:2018-6-4 19:40:31
程序要配合硬件才行,你的硬件和别人的完全一致吗?不管神马方式方法,只要达成目的就是好的,做为研究这个没有问题,但是你的研究一定要有实物基础,猜测别人的硬件和程序构成是不科学可取的

评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

feixiang20 回答时间:2018-6-5 03:12:25
施密特触发器原理图解详细分析

重要特性:施密特触发器具有如下特性:输入电压有两个阀值VL、VH,VL施密特触发器通常用作缓冲器消除输入端的干扰。

施密特波形图


  施密特触发器也有两个稳定状态,但与一般触发器不同的是,施密特触发器采用电位触发方式,其状态由输入信号电位维持;对于负向递减和正向递增两种不同变化方向的输入信号,施密特触发器有不同的阀值电压。

  门电路有一个阈值电压,当输入电压从低电平上升到阈值电压或从高电平下降到阈值电压时电路的状态将发生变化。施密特触发器是一种特殊的门电路,与普通的门电路不同,施密特触发器有两个阈值电压,分别称为正向阈值电压和负向阈值电压。在输入信号从低电平上升到高电平的过程中使电路状态发生变化的输入电压称为正向阈值电压,在输入信号从高电平下降到低电平的过程中使电路状态发生变化的输入电压称为负向阈值电压。正向阈值电压与负向阈值电压之差称为回差电压。

  它是一种阈值开关电路,具有突变输入——输出特性的门电路。这种电路被设计成阻止输入电压出现微小变化(低于某一阈值)而引起的输出电压的改变。

  利用施密特触发器状态转换过程中的正反馈作用,可以把边沿变化缓慢的周期性信号变换为边沿很陡的矩形脉冲信号。输入的信号只要幅度大于vt+,即可在施密特触发器的输出端得到同等频率的矩形脉冲信号。

  当输入电压由低向高增加,到达V+时,输出电压发生突变,而输入电压Vi由高变低,到达V-,输出电压发生突变,因而出现输出电压变化滞后的现象,可以看出对于要求一定延迟启动的电路,它是特别适用的.

  从传感器得到的矩形脉冲经传输后往往发生波形畸变。当传输线上的电容较大时,波形的上升沿将明显变坏;当传输线较长,而且接受端的阻抗与传输线的阻抗不匹配时,在波形的上升沿和下降沿将产生振荡现象;当其他脉冲信号通过导线间的分布电容或公共电源线叠加到矩形脉冲信号时,信号上将出现附加的噪声。无论出现上述的那一种情况,都可以通过用施密特反相触发器整形而得到比较理想的矩形脉冲波形。只要施密特触发器的vt+和vt-设置得合适,均能受到满意的整形效果。

  施密特触发器的应用

  1. 波形变换

  可将三角波、正弦波等变成矩形波。

  2. 脉冲波的整形

  数字系统中,矩形脉冲在传输中经常发生波形畸变,出现上升沿和下降沿不理想的情况,可用施密特触发器整形后,获得较理想的矩形脉冲。

  3. 脉冲鉴幅

  幅度不同、不规则的脉冲信号时加到施密特触发器的输入端时,能选择幅度大于欲设值的脉冲信号进行输出。

  施密特触发器常用芯片:

  74LS18双四输入与非门(施密特触发)

  74LS19六反相器(施密特触发)

  74132、74LS132、74S132、74F132、74HC132四2输入与非施密特触发器触发器

  74221、74LS221、74 HC221、74 C221双单稳态多谐振荡器(有施密特触发器)

触发器定义

施密特触发电路( 简称)是一种波形整形电路,当任何波形的信号进入电路时,输出在正、负饱和之间跳动,产生方波或脉波输出。不同于比较器,施密特触发电路有两个临界电压且形成一个滞后区,可以防止在滞后范围内之噪声干扰电路的正常工作。如遥控接收线路,传感器输入电路都会用到它整形。

施密特触发器

一般比较器只有一个作比较的临界电压,若输入端有噪声来回多次穿越临界电压时,输出端即受到干扰,其正负状态产生不正常转换,如图1所示。




                           图1  (a)反相比较器                                                                (b)输入输出波形

施密特触发器如图2 所示,其输出电压经由R1 、R2 分压后送回到运算放大器的非反相输入端形成正反馈。因为正反馈会产生滞后(Hysteresis)现象,所以只要噪声的大小在两个临界电压(上临界电压及下临界电压)形成的滞后电压范围内,即可避免噪声误触发电路,如表1 所示




   图2  (a)反相斯密特触发器                         (b)输入输出波形


表1施密特触发器的滞后特性



上临界电压VTH


下临界电压VTL


滞后宽度(电压)VH


VTL<噪声<VTH


输入端信号νI 上升到比VTH 大时,触发电路使νO 转态


输入端信号νI 下降到比VTL 小时,触发电路使νO 转态


上、下临界电压差VH =VTH -VTL


噪声在容许的滞 后宽度范围内,νO 维持稳定状态


反相施密特触发器

电路如图2 所示,运算放大器的输出电压在正、负饱和之间转换:

νO= ±Vsat 。输出电压经由R1 、R2 分压后反馈到非反相输入端:ν+= βνO,

其中反馈因数=

当νO为正饱和状态(+Vsat  )时,由正反馈得上临界电压

当νO 为负饱和状态(- Vsat  )时,由正反馈得下临界电压

VTH 与VTL 之间的电压差为滞后电压:2R1

       图3   (a)输入、输出波形                                      (b)转换特性曲线

输入、输出波形及转换特性曲线如图3(b)所示。

当输入信号上升到大于上临界电压VTH 时,输出信号由正状态转变为

负状态即: νI >VTH→νo = - Vsat

当输入信号下降到小于下临界电压VTL 时,输出信号由负状态转变为

正状态即: νI <VTL→νo = + Vsat

输出信号在正、负两状态之间转变,输出波形为方波。

非反相施密特电路



                                                       图4 非反相史密特触发器


非反相施密特电路的输入信号与反馈信号均接至非反相输入端,如图4所示。

由重迭定理可得非反相端电压

反相输入端接地: ν- = 0,当ν+ = ν- = 0 时的输入电压即为临界电压。

将ν+ = 0 代入上式得

整理后得临界电压

当νo 为负饱和状态时,可得上临界电压

当νo为正饱和状态时,可得下临界电压,

VTH与VTL之间的电压差为滞后电压:




      图5 (a)计算机仿真图                     (b)转换特性曲线

输入、输出波形与转换特性曲线如图5所示。

当输入信号下降到小于下临界电压VTL 时,输出信号由正状态转变为

负状态:νo < VTL →νo = - Vsat

当输入信号上升到大于上临界电压VTH 时,输出信号由负状态转变为

正状态: νo > VTL →νo = + Vsat

输出信号在正、负两状态之间转变,输出波形为方波。

史密特触发器电路原理实验:


如图6,当Vi 大于VR 时运算放大器的输出会得到一个正向电压输出;若VR 大于

Vi 时则会得到一个负电压。电压的大小则由两个齐紊二极管来限压。理想的运

算放大器其输出上升时间为0,而在实际的电路上是上可能得到这么理想的曲

线,一般从负压上升到正压需要一小段的上升时间。换言之,运算放大器并上能

立刻反应Vi 及VR 所形成的电压差。

如果参考电压VR 固定,那么当Vi 慢慢增加时,仅在Vi-VR≧ V1 时。运算

放大器的输出达到Vmax;而当Vi 渐渐减小时却必须于Vi-VR≦ V1 伏特时,输

出才为Vmin。也即,欲达Vmax 及Vmin 输出电压的条件上一样,两者Vi-VR

值相差V1,这种情形称为迟滞(hysteresis)现象。史密特触发器便是利用这种现象

而做成的电路。

反相的史密特触发器,输出电压经由分压电路回授至运算放大器,参考电压

则加在R1 及R2 的末端。回授β 值为R2/(R1+R2),此电路为正回授,如果输出

增加了V,则有回授βV 到运算放大器。

当Vi<V+时,

V+=VR+(R2/R1+R2)(Vmax-VR)

当Vi=V+时,输出转为Vmin。

当Vi>V+

V+=VR-(R2/R1+R2)(Vmin+VR)

若此时V+渐渐小至V2,则输出又转为Vmax。由于迟滞现象,使得触发输出电

压转相的电压有所上同,输入电压增加产生输出转相时所的电压,要比输入电压

降低时所产生的输出转相所需电压来得大(V1>V2)。



评分

参与人数 1蝴蝶豆 +3 收起 理由
zero99 + 3

查看全部评分

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版