当前位置:网站首页>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);
}
边栏推荐
- 爬虫 视频爬取工具you-get
- mysql操作入门(四)-----数据排序(升序、降序、多字段排序)
- typescript学习
- MySQL-数据库设计规范
- MySQL error 1055 solution: [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause and contains
- CollectionUtil:一个函数式风格的集合工具
- MySQL database design specification
- HCIP 第十一天
- Hack The Box - File Transfers Module详细讲解中文教程
- Splunk Field Caculated 计算字段
猜你喜欢
随机推荐
Transimpedance amplifier
如何保护智能家居不受黑客攻击
[Unity3D] Beginner Encryption Skills (Anti-Cracking)
MySQL - Index Optimization and Query Optimization
2022年防止网络攻击的15个网络安全实践,你学会了吗?
View port number occupancy
[mixed] PIP in domestic source tutorial and domestic source address
关于DDoS的几个误区
OC-NSDictionary
OC-NSDictionary
spark 读取本地文件
Comprehensive experiment of MPLS and BGP
spark架构
Find the largest n files
Visual Analysis of DeadLock
Buried development process
Splunk Filed extraction field interception
Install Metasploitable2 on VMware
DeadLock的可视化分析
(2022 Nioke Duo School 5) C-Bit Transmission (Thinking)