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;

}

}

}

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

  1. stm32按键矩阵代码_STM32 学习笔记---1

    既然打算学,基础的东西元件的得知道是什么,这样写代码的时候才能知道自己在干什么! ROM 和Flash 断电后都能储存数据,RAM则不能 其实闪存(flash)是ROM的一种它的全名---FLASH ...

  2. stm32按键矩阵代码_STM32学习日志——电容触摸按键实验(20-06-27)

    昨天在公司值班学习的,敲完代码笔记本没电了,没更新日志,今天补更新.学习应持之以恒,谁都会有惰性,应尽力克服. 这次的代码很有意思,可以学到很多编程的思想. 首先,电容触摸按键是基于模电的RC充放电电 ...

  3. 【STM32学习笔记】(13)——外部中断详解

    EXTI 简介         EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...

  4. can总线配置读入是什么意思_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

  5. (转)嵌入式按键驱动,支持短按、长按、双击(中断方式)

    轮训方式连接:https://blog.csdn.net/Golf_research/article/details/52760320  目录: 1:概述 2:stm32外部中断配置 3:code 概 ...

  6. STM32智能门锁学习一,按键解锁,蓝牙解锁、oled显示,步进电机

    经历了电脑重装系统之后的第一篇博客== 这一章主要介绍薄膜按键,蓝牙模块,oled显示屏,还有步进电机的学习.(板子型号是stm32f103c8t6,基于HAL库) 目录 一.oled显示屏 二.步进 ...

  7. dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析

    CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...

  8. STM32学习笔记:按键实验

    STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...

  9. 将STM32设置睡眠模式(使用中断唤醒)之小白学习笔记

    #include "bsp_exti.h" #include "Led_Key.h" #include "bsp_SysTick.h" in ...

最新文章

  1. 【怎样写代码】工厂三兄弟之工厂方法模式(二):解决方案 I
  2. 乘风破浪的PTM:两年来预训练模型的技术进展
  3. 联想G480类似没有小键盘开关的机器
  4. JavaScript学习之一:采用哪种方式定义类或对象?
  5. 401 - 未授权: 由于凭据无效,访问被拒绝。
  6. 如何攻破容器持久化存储挑战?
  7. Laravel Model 利用 Macroable 为数据模型添加宏能力
  8. 再谈typedef(重点为函数指针)
  9. Spark之Task原理分析
  10. 定义一个扁平的按钮样式
  11. QML Logical value dose not depend on actual values(M325)
  12. STM32F091 can通信配置,can波特率计算方法
  13. HTTP幂等性概念和应用
  14. 百度地图API基本使用(二)
  15. 度分秒在线计算机,科学计算器在线计算
  16. shell脚本实现逻辑关系与、或、非
  17. “本是青灯不归客,却因浊酒留风尘,星光不问赶路人,岁月不负有心人”,你是怎么理解的?
  18. CSS3效果 光斑动画(渐变)
  19. [C/C++11]_[初级]_[如何转换带井号的#十六进制颜色字符串到数值]
  20. iOS 磁场传感器的应用 Swift CoreMotion使用

热门文章

  1. t分布 u分布 卡方分布_中心极限定理|z分布|t分布|卡方分布
  2. python区域找图命令_python读取图片任意范围区域
  3. 【渝粤题库】陕西师范大学200641高等数学作业(高起专、专升本)
  4. 【渝粤教育】广东开放大学 社会工作行政 形成性考核 (52)
  5. 【渝粤题库】国家开放大学2021春2585城市轨道交通概论答案
  6. Semtech的LoRa技术实现智能化工业应用管理
  7. python怎么改变字体大小_Python-docx 整体修改或者部分修改文字的大小和字体类型...
  8. 初学JavaWeb需要的前端js,JavaScript是什么样的?
  9. mysql把一行保存到另一个表_MYSQL:如何复制整个行从一个表到另一个在MySQL与第二个表有一个额外的列?...
  10. android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程