本文主要是介绍2-2 Systick系统定时器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
按键的按下和放开存在抖动(可以使用两种方式对按键存在的抖动现象进行处理),一种是使用硬件的方式并联一个滤波电容(通过这种方式对按键进行抖动消除),一种是通过软件的方式(时间窗消抖)。
硬件消抖
软件消抖(通过时间窗的方式实现)
超过时间窗,在时间窗的位置进行判断,如果为高电平,或者低电平,判断响应的高低电平。
实现时间窗的方式
一种是通过延时死等的方式,但是会导致程序停留在这个位置,导致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
这篇关于2-2 Systick系统定时器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!