按键的按下和放开存在抖动(可以使用两种方式对按键存在的抖动现象进行处理),一种是使用硬件的方式并联一个滤波电容(通过这种方式对按键进行抖动消除),一种是通过软件的方式(时间窗消抖)。
硬件消抖
软件消抖(通过时间窗的方式实现)
超过时间窗,在时间窗的位置进行判断,如果为高电平,或者低电平,判断响应的高低电平。
实现时间窗的方式
一种是通过延时死等的方式,但是会导致程序停留在这个位置,导致CPU无法执行其他的功能模块
通过定时器的方式可以解决这个问题(此次主要是使用systick系统定时器的方式来实现)
systick系统定时器
systick系统定时器
接口函数实现
__STATIC_INLINE uint32_t SysTick_Config(uint32_t ticks)
{
if ((ticks - 1) > SysTick_LOAD_RELOAD_Msk) return (1); /* Reload value impossible */
SysTick->LOAD = ticks - 1; /* set reload register */
NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1); /* set Priority for Systick Interrupt */
SysTick->VAL = 0; /* Load the SysTick Counter Value */
SysTick->CTRL = SysTick_CTRL_CLKSOURCE_Msk |
SysTick_CTRL_TICKINT_Msk |
SysTick_CTRL_ENABLE_Msk; /* Enable SysTick IRQ and SysTick Timer */
return (0); /* Function successful */
}
Systick获取系统运行时间(systick.c)
#include "gd32f30x.h" // Device header
#include <stdint.h>
// 保存系统的运行时间
static uint64_t g_sysRunTime = 0;
// 系统定时器初始化
void Systic_Init(void){
// 实现1毫秒的定时中断,1毫秒产生一次中断
// 120M / 1000
if(SysTick_Config(rcu_clock_freq_get(CK_AHB) / 1000)){
while(1);
};
}
// 定时中断服务函数,1ms产生一次中断
void SysTick_Handle(void){
g_sysRunTime ++;
}
// 获取系统运行时间,返回值以1ms为单位
uint64_t GetSysRunTime(){
return g_sysRunTime;
}
Systick.h
#ifndef _SYSTICK_H_
#define _SYSTICK_H_
#include <stdint.h>
// 系统定时器初始化
void Systic_Init(void);
// 定时中断服务函数,1ms产生一次中断
void SysTick_Handle(void);
// 获取系统运行时间,返回值以1ms为单位
uint64_t GetSysRunTime();
#endif