stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)

void RCC_Config(void)

{

SystemInit(); //系统时钟初始化

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB

| RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD

| RCC_APB2Periph_GPIOE | RCC_APB2Periph_GPIOF

| RCC_APB2Periph_GPIOG, ENABLE);

}

当然, 我们可以不用加SystemInit();这个函数也没事.原因是startup_stm32f10x_hd.s这个文件已经在帮我们干了这些事情了.. 它具体是怎么弄的,还有一些其它东西,目前还没

去研究过,下次再研究看看.

(3)LED配置

void LED_Config(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

/*led config*/

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOD, &GPIO_InitStructure);

}

LED的配置前面应该已经记录了,所以这里就不弄了

(4)配置中断优先级和(5)配置外部中断线,这两个我选择放在一个模块,因为都是和中断有关系的嘛

void EXTI_PC2_Config(void)

{

NVIC_InitTypeDef NVIC_InitStructure;

EXTI_InitTypeDef EXTI_InitStructure;

GPIO_InitTypeDef GPIO_InitStructure;

NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);

NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;

NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;

NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

NVIC_Init(&NVIC_InitStructure);

/* key for exti */

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;

GPIO_Init(GPIOC, &GPIO_InitStructure);

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC, GPIO_PinSource2);

EXTI_InitStructure.EXTI_Line = EXTI_Line2;

EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;

EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;

EXTI_InitStructure.EXTI_LineCmd = ENABLE;

EXTI_Init(&EXTI_InitStructure);

}

这也没什么好解释的了,前面的文章已经解释了

(6)中断处理函数

这家伙推荐在stm32f10x_it.c里面写,因为那里有命名的模版,跟着官方走,错不了

void EXTI2_IRQHandler(void)

{

if (EXTI_GetITStatus(EXTI_Line2) != RESET) //判断按键是否按下

{

//LED取反

GPIO_WriteBit(GPIOD, GPIO_Pin_6,

(BitAction)((1-GPIO_ReadOutputDataBit(GPIOD, GPIO_Pin_6))));

EXTI_ClearITPendingBit(EXTI_Line2); //清除中断标志位

}

}

这里要注意的就是前面EXTIx这里的数字问题了,1-4没什么问题,5-9就要稍微注意下.如果是应该是这样,它应该是EXTI9_5_IRQHandler

这儿我有个问题,为什么没看到外部中断6呢,也就是EXTI6或7,8这些单独的呢.. 原因可能是5-9他们都使用了同一个中断向量表,这个话我印象中好像在哪儿看过

好,到这里基本功能就完成了.. 现象是可以出了.但是会有个问题就是有时候按一些按键,LED等会没反应或者亮灭几下.. 这就是按键抖动的问题了;

好,接下来说说怎么削抖:

这里说软件消抖,硬件就不说了.. 传说中的抖动出现的原因就是你的手速不够快,使中断触发了一次以上.. 我想如果你以20年到30年的专业单身手速(右手哦)来按的话

肯定没这个问题..哈哈..好,直接上代码..借鉴人家的:

用下面这个方法,就要调整前面的代码了.

void KEY_DEL(void)

{

num = 0;

if (_keyon == 1) //按键是否按下,在中断处理函数中

{

if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0)

{

Delay(0x3ffff);//延迟,为的是让你的手速能跟上

if (GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0) //按键是否抖动

{

while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_2) == 0); //是否松开

num = 1;

goto n_exit;

}

}

}

n_exit:;

_keyon = 0;

}

void EXTI2_IRQHandler(void)

{

if (EXTI_GetITStatus(EXTI_Line2) != RESET)

{

_keyon = 1;//按键按下标志

EXTI_ClearITPendingBit(EXTI_Line2);

}

}

#include "misc.h"

#include "stm32f10x_gpio.h"

#include "stm32f10x_exti.h"

#include "stm32f10x_rcc.h"

#include "system_stm32f10x.h"

#define LED_ON GPIO_SetBits(GPIOD, GPIO_Pin_6);

void LED_Config(void);

void EXTI_PC2_Config(void);

void RCC_Config(void);

void KEY_DEL(void);

void Delay(u32 times);

unsigned char _keyon = 0, num = 0;

int main(void)

{

unsigned char a = 0;

RCC_Config();

LED_Config();

EXTI_PC2_Config();

LED_ON;

while(1)

{

KEY_DEL();

if (num == 1 && a == 0)

{

GPIO_ResetBits(GPIOD, GPIO_Pin_6);

a = 1;

}

else if(num == 1 && a == 1)

{

GPIO_SetBits(GPIOD, GPIO_Pin_6);

a = 0;

}

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353157.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

NetBeans Java EE技巧9:从数据库创建JSF应用程序

您需要非常快速地创建数据库前端吗? NetBeans IDE允许人们以极少的编码就非常快速地为一组数据库表开发JSF应用程序前端。 现在,本教程既是老歌,又是老歌……对于那些不了解它的人来说,值得再次提及。 首先,创建您的应…

[模板]树链剖分

用途 我想把一个本来是线性的东西放到树上做,维护路径或者是子树的各种性质,那就用树剖呗 它可以套线段树、树状数组、ST表(以及其他我不知道的) 做法 我们考虑把树分成一条条链,然后对每条链维护我们的数据结构&#…

sql server 2005单独添加mdf文件

我把原来的数据库分离后,直接把日志文件给干掉了。原来在SQL 2000里经常这么干,只用一个mdf就附加了。没想到sql2005居然不行。我试验了一圈 终于找到一个成功的方法。转载,供后来者参考。SQL2005 如何在没有日志文件的情况下如何恢复MDF数据…

低压抽屉柜常见故障处理方法_低压配电设备常见故障分析,处理办法介绍

低压配电线路作为配电网络中主要的一部分,在其运行的过程中直接影响着人民的生命财产安全。配电线路是电力输送的终端,对于提高电力质量有着至关重要的作用。但由于配电线路走径的复杂性,人为因素和设备因素,都会给低压配电设备造…

关于C语言中的'\?'和%%

关于C语言中的\?和%% 一、引语 我们知道C/C中有四个非字母的字符需要用转义字符来表示:单引号 , 双引号 " , 反斜杆 \ 和问号 ? 显然这是因为它们本身有特殊的含义,所以要用转义字符来表示他们自己,单引号用来表示单个字符&#xff0…

mockito 使用_用Mockito回答

mockito 使用在编写单元测试时 ,必须记住不要依赖于外部组件。 为了避免这种情况,我们使用了模拟框架,对我而言,最容易使用的是Mockito 。 在本文中,我们将看到在Mockito中使用的一种“高级”技术,可以使用…

jQuery常用操作

jQuery jQuery是一个轻量级的JS库&#xff0c;是一个被封装好的JS文件&#xff0c;提供了更为简便的元素操作方式&#xff0c;jQuery封装了DOM。 使用jQuery 引入jQuery文件 <scrtipt srcjquery-1.11.3.js> </script> 注意&#xff1a;引入必须放在其他jQuery操作之…

python tab和空格混用_我的 Python 编码规范

python 文件的组成为了便于描述&#xff0c;先上一个 demo#!/usr/bin/env python# -*- coding: utf-8 -*-"""通常这里是关于本文档的说明(docstring)&#xff0c;须以半角的句号、 问号或惊叹号结尾!本行之前应当空一行&#xff0c;继续完成关于本文档的说明如果…

Twitter创始人Jack Dorsey的每日必做和不做清单

Twitter创始人Jack Dorsey显然是这段时间以来技术界的中心人物&#xff0c;不仅发表了一系列的文章&#xff0c;而且一本反映Twitter早期岁月的书也即将出版。今天&#xff0c;他又在Y Combinator的Startup School上发表了讲话&#xff0c;不过在谈话中Dorsey回避了一切不必要及…

JSR-308和Checker框架为jOOQ 3.9添加了更多类型安全性

Java 8引入了JSR-308&#xff0c;它为Java语言添加了新的注释功能。 最重要的是&#xff1a;键入注释。 现在可以像下面这样设计怪物了&#xff1a; 比注解更疯狂的是类型注解。 在数组上。 谁认为这是有效的Java代码&#xff1f; pic.twitter.com/M9fSRRerAD — Lukas Eder&…

Linux NTP服务配置 for Oracle RAC

安装Oracle 11g RAC时&#xff0c;我们需要配置ntp服务。在使用虚拟机的情况下对于时钟同步方式的配置有很多种方式&#xff0c;可以使用vmware自带的时钟同步功能&#xff0c;也可以直接将本地的一个节点用作时间服务器。本文介绍直接配置ntp方式的时钟服务器。1、查看两节点的…

java字符编码方式总结

java字符编码方式总结一、概要在JAVA应用程序特别是基于WEB的程序中&#xff0c;经常遇到字符的编码问题。为了防止出现乱码&#xff0c;首先需要了解JAVA是如何处理字符的&#xff0c;这样就可以有目的地在输入/输出环节中增加必要的转码。其次&#xff0c;由于各种服务器有不…

按键扫描

unsigned char Trg,cont,num;void key_sm(void) { uchar Read;ReadP0^0xff;TrgRead&(Read^cont);contRead; } void key_hs(){  switch(Trg)   {     case 0x01:       num;     break;     case 0x02:       num--;     break;     d…

Mathematica函数大全

一、运算符及特殊符号 Line1; 执行Line&#xff0c;不显示结果 Line1,line2 顺次执行Line1&#xff0c;2&#xff0c;并显示结果 ?name 关于系统变量name 的信息 ??name 关于系统变量name 的全部信息 !command 执行Dos 命令 n! N 的阶乘 !!filename 显示文件内容 <<fi…

oem是代工还是贴牌_食用油OEM贴牌代工业务要注意哪些问题?

近年来食用油OEM业务逐渐增加&#xff0c;OEM是英文 Original Equipment Manufacturer的缩写&#xff0c;被译为代工生产或贴牌生产&#xff0c;通常是指品牌商委托有生产能力且品质有保证的油脂加工厂来生产食用油产品&#xff0c;对自己及对方的品牌不会有冲突&#xff0c;且…

java 简化判断_简化Java内存分析

java 简化判断作为一名典型的Java开发人员&#xff0c;除了遵循关闭连接&#xff0c;流等典型的最佳实践外&#xff0c;我从未监视过应用程序的内存使用情况。最近&#xff0c;我们在JBoss服务器中遇到了一些问题&#xff0c;不得不深入研究内存管理Java中最好的事情之一是&…

DRF的序列化组件

rest rest下的url url唯一代表资源&#xff0c;http请求方式来区分用户行为 url的设计规范 GET&#xff1a; 127.0.0.1:9001/books/       # 获取所有数据 GET: 127.0.0.1:9001/books/{id}      # 获取单条数据 POST&#xff1a; 127.0.0.1:9001/books/      # 增…

15crmo焊接后多长时间探伤_承压设备渗透探伤检测方法简单操作思路

啥是渗透检测渗透检测俗称渗透探伤&#xff0c;是一种以毛细管作用原理为基础用于检查表面开口缺陷的无损检测方法。它与射线检测、超声检测、磁粉检测和涡流检测一起&#xff0c;并称为5种常规的无损检测方法&#xff0c;渗透检测始于本世纪初&#xff0c;是目视检查以外最早应…

SpringBoot实战(五)之Thymeleaf

Thymeleaf同jsp、volocity、freemarker等共同的职能是MVC模式中的视图展示层&#xff0c;即View。 当然了&#xff0c;SpringBoot中也可以用jsp,不过不推荐这种用法&#xff0c;比较推崇的就是使用Thymeleaf。 关于Thymeleaf学习&#xff0c;建议参考官方文档:https://www.thym…