当前位置:网站首页>I.MX6U-ALPHA开发板(定时器按键消抖)
I.MX6U-ALPHA开发板(定时器按键消抖)
2022-08-02 07:20:00 【*﹏ℳ๓无情*】
文章目录
定时器按键消抖简介
当按键按下以后,进入到中断服务函数中,开始一个定时器,定时周期位10ms,只有最后一个抖动信号开启的定时器才能完成的执行完一个周期。当定时器产生周期中断以后就在中断服务函数里面做具体的处理,比如开关蜂鸣器。
//bsp_keyfilter.c
#ifndef _BSP_KEYFILTER_H
#define _BSP_KEYFILTER_H
/* 函数声明 */
void filterkey_init(void);
void filtertimer_init(unsigned int value);
void filtertimer_stop(void);
void filtertimer_restart(unsigned int value);
void filtertimer_irqhandler(void);
void gpio1_16_31_irqhandler(void);
#endif
//bsp_keyfilter.c
#include "bsp_key.h"
#include "bsp_gpio.h"
#include "bsp_int.h"
#include "bsp_beep.h"
#include "bsp_keyfilter.h"
//按键初始化
void filterkey_init(void)
{
gpio_pin_config_t key_config;
/* 1、初始化IO复用 */
IOMUXC_SetPinMux(IOMUXC_UART1_CTS_B_GPIO1_IO18,0); /* 复用为GPIO1_IO18 */
/* 2、、配置GPIO1_IO18的IO属性 *bit 16:0 HYS关闭 *bit [15:14]: 11 默认22K上拉 *bit [13]: 1 pull功能 *bit [12]: 1 pull/keeper使能 *bit [11]: 0 关闭开路输出 *bit [7:6]: 10 速度100Mhz *bit [5:3]: 000 关闭输出 *bit [0]: 0 低转换率 */
IOMUXC_SetPinConfig(IOMUXC_UART1_CTS_B_GPIO1_IO18,0xF080);
/* 3、初始化GPIO为中断 */
key_config.direction = kGPIO_DigitalInput;
key_config.interruptMode = kGPIO_IntFallingEdge;
key_config.outputLogic = 1;
gpio_init(GPIO1, 18, &key_config);
GIC_EnableIRQ(GPIO1_Combined_16_31_IRQn); /* 使能GIC中对应的中断 */
/* 注册中断服务函数 */
system_register_irqhandler(GPIO1_Combined_16_31_IRQn,
(system_irq_handler_t)gpio1_16_31_irqhandler,
NULL);
gpio_enableint(GPIO1, 18); /* 使能GPIO1_IO18的中断功能 */
filtertimer_init(66000000/100); /* 初始化定时器,10ms */
}
//初始化用于消抖的定时器,默认关闭定时器
void filtertimer_init(unsigned int value)
{
EPIT1->CR = 0; //先清零
/* * CR寄存器: * bit25:24 01 时钟源选择Peripheral clock=66MHz * bit15:4 0 1分频 * bit3: 1 当计数器到0的话从LR重新加载数值 * bit2: 1 比较中断使能 * bit1: 1 初始计数值来源于LR寄存器值 * bit0: 0 先关闭EPIT1 */
EPIT1->CR = (1<<24 | 1<<3 | 1<<2 | 1<<1);
/* 计数值 */
EPIT1->LR = value;
/* 比较寄存器,当计数器值和此寄存器值相等的话就会产生中断 */
EPIT1->CMPR = 0;
GIC_EnableIRQ(EPIT1_IRQn); /* 使能GIC中对应的中断 */
/* 注册中断服务函数 */
system_register_irqhandler(EPIT1_IRQn, (system_irq_handler_t)filtertimer_irqhandler, NULL);
}
//关闭定时器
void filtertimer_stop(void)
{
EPIT1->CR &= ~(1<<0); /* 关闭定时器 */
}
// 重启定时器
void filtertimer_restart(unsigned int value)
{
EPIT1->CR &= ~(1<<0); /* 先关闭定时器 */
EPIT1->LR = value; /* 计数值 */
EPIT1->CR |= (1<<0); /* 打开定时器 */
}
//定时器中断处理函数
void filtertimer_irqhandler(void)
{
static unsigned char state = OFF;
if(EPIT1->SR & (1<<0)) /* 判断比较事件是否发生 */
{
filtertimer_stop(); /* 关闭定时器 */
if(gpio_pinread(GPIO1, 18) == 0) /* KEY0 */
{
state = !state;
beep_switch(state); /* 反转蜂鸣器 */
}
}
EPIT1->SR |= 1<<0; /* 清除中断标志位 */
}
// GPIO中断处理函数
void gpio1_16_31_irqhandler(void)
{
/* 开启定时器 */
filtertimer_restart(66000000/100);
/* 清除中断标志位 */
gpio_clearintflags(GPIO1, 18);
}
边栏推荐
- PanGu-Coder:函数级的代码生成模型
- MySQL-Execution Process + Cache + Storage Engine
- FormData上传二进制文件、对象、对象数组
- About the SQL concat () function problem, how to splice
- 如何保护智能家居不受黑客攻击
- HCIP 第八天
- Buried development process
- PLSQL Developer安装和配置
- (2022 Niu Ke Duo School 5) B-Watches (two points)
- Please tell me, how to write Flink SQL and JDBC sink into mysql library and want to create an auto-incrementing primary key
猜你喜欢
随机推荐
playwright 爬虫使用
(2022 Nioke Duo School 5) C-Bit Transmission (Thinking)
(2022 Niu Ke Duo School 5) B-Watches (two points)
Inverter Phase Locking Principle and DSP Implementation
pnpm install出现:ERR_PNPM_PEER_DEP_ISSUES Unmet peer dependencies
MySQL - low level settings
MySQL报错1055解决办法:[Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains
Please tell me, how to write Flink SQL and JDBC sink into mysql library and want to create an auto-incrementing primary key
OC-NSArray
HCIP 第四天
Data Middle Office: Started in Ali, Prosperous in DaaS
Link with Game Glitch
Splunk Filed Alias 字段改名
Appium 滑动问题
PLSQL Developer安装和配置
Xilinx Constraint Study Notes - Timing Constraints
flutter在导航栏处实现对两个列表的点击事件
如何保护智能家居不受黑客攻击
flutter 参数传一个范型数据
MySQL-多版本并发控制









