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;
}
}
}
stm32l4 外部中断按键会卡死_STM32学习之路-按键中断测试(外部中断)相关推荐
- stm32按键矩阵代码_STM32 学习笔记---1
既然打算学,基础的东西元件的得知道是什么,这样写代码的时候才能知道自己在干什么! ROM 和Flash 断电后都能储存数据,RAM则不能 其实闪存(flash)是ROM的一种它的全名---FLASH ...
- stm32按键矩阵代码_STM32学习日志——电容触摸按键实验(20-06-27)
昨天在公司值班学习的,敲完代码笔记本没电了,没更新日志,今天补更新.学习应持之以恒,谁都会有惰性,应尽力克服. 这次的代码很有意思,可以学到很多编程的思想. 首先,电容触摸按键是基于模电的RC充放电电 ...
- 【STM32学习笔记】(13)——外部中断详解
EXTI 简介 EXTI(External interrupt/event controller)-外部中断/事件控制器,管理了控制器的 20 个中断/事件线.每个输入线可以独立地配置 ...
- can总线配置读入是什么意思_STM32学习笔记—CAN总线收发数据常见问题分析
CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...
- (转)嵌入式按键驱动,支持短按、长按、双击(中断方式)
轮训方式连接:https://blog.csdn.net/Golf_research/article/details/52760320 目录: 1:概述 2:stm32外部中断配置 3:code 概 ...
- STM32智能门锁学习一,按键解锁,蓝牙解锁、oled显示,步进电机
经历了电脑重装系统之后的第一篇博客== 这一章主要介绍薄膜按键,蓝牙模块,oled显示屏,还有步进电机的学习.(板子型号是stm32f103c8t6,基于HAL库) 目录 一.oled显示屏 二.步进 ...
- dsp28335 sci中用fifo完成485收发通信_STM32学习笔记—CAN总线收发数据常见问题分析
CAN,Controller Area Network(控制器局域网络),在汽车电子.工业控制领域的应用比较多,通常用于局域组网. 这是第9篇学习分享文章,<STM32学习笔记>之CAN总 ...
- STM32学习笔记:按键实验
STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...
- 将STM32设置睡眠模式(使用中断唤醒)之小白学习笔记
#include "bsp_exti.h" #include "Led_Key.h" #include "bsp_SysTick.h" in ...
最新文章
- 【怎样写代码】工厂三兄弟之工厂方法模式(二):解决方案 I
- 乘风破浪的PTM:两年来预训练模型的技术进展
- 联想G480类似没有小键盘开关的机器
- JavaScript学习之一:采用哪种方式定义类或对象?
- 401 - 未授权: 由于凭据无效,访问被拒绝。
- 如何攻破容器持久化存储挑战?
- Laravel Model 利用 Macroable 为数据模型添加宏能力
- 再谈typedef(重点为函数指针)
- Spark之Task原理分析
- 定义一个扁平的按钮样式
- QML Logical value dose not depend on actual values(M325)
- STM32F091 can通信配置,can波特率计算方法
- HTTP幂等性概念和应用
- 百度地图API基本使用(二)
- 度分秒在线计算机,科学计算器在线计算
- shell脚本实现逻辑关系与、或、非
- “本是青灯不归客,却因浊酒留风尘,星光不问赶路人,岁月不负有心人”,你是怎么理解的?
- CSS3效果 光斑动画(渐变)
- [C/C++11]_[初级]_[如何转换带井号的#十六进制颜色字符串到数值]
- iOS 磁场传感器的应用 Swift CoreMotion使用
热门文章
- t分布 u分布 卡方分布_中心极限定理|z分布|t分布|卡方分布
- python区域找图命令_python读取图片任意范围区域
- 【渝粤题库】陕西师范大学200641高等数学作业(高起专、专升本)
- 【渝粤教育】广东开放大学 社会工作行政 形成性考核 (52)
- 【渝粤题库】国家开放大学2021春2585城市轨道交通概论答案
- Semtech的LoRa技术实现智能化工业应用管理
- python怎么改变字体大小_Python-docx 整体修改或者部分修改文字的大小和字体类型...
- 初学JavaWeb需要的前端js,JavaScript是什么样的?
- mysql把一行保存到另一个表_MYSQL:如何复制整个行从一个表到另一个在MySQL与第二个表有一个额外的列?...
- android 音量键 广播,【Android 7.0 Audio】: 按键调节音量的调用过程