STM32学习笔记之滴答定时器-----systick 与 GPIO输出----按键检测按键读取

本文介绍了STM32中的滴答定时器Systick的使用方法,包括其工作原理、配置步骤和实现精准延时的功能。同时,详细阐述了通过GPIO进行按键检测的流程,包括消除抖动的30ms延时策略。内容涵盖了裸机编程和RTOS时基的应用。
摘要由CSDN通过智能技术生成

(一)滴答定时器-----systick
1、定时器本质----计数
2、为什么在中文参考手册和固件库手册中没有滴答定时器的相关描述?
因为systick是一个核内外设,而中文参考手册和固件库手册是ST公司发布的,所以它只对自家外设进行了描述,所以查看内核手册来学习systick《STM32F10xxx20xxx21xxxL1xxxx Cortex-M3 programming manual.pdf》
3、systick是一个24bit(最大计数值就是2^24-1)的系统定时器,它是向下计数的,从导入值计数到0,当计数到0时,在下一个时钟边沿会重复计数,也是用完,你需要关闭定时器
4、systick的作用:
1》产生一段精准延时-----裸机开发
2》在Rtos中,systick可以作为Rtos的时基
在这里插入图片描述

	5、利用systick定时器Nms,
	      编程步骤:
	      1》,配置时钟源----8分频,并且关闭定时器
	      2》,设置计数值----配置导入值寄存器----N*9000
	      3》,将当前值寄存清除
	      4》,打开定时器
	      5》,等待定时器结束----读计数标志位是否为16,定时结束关闭定时

程序如下:

#include"drv_systick.h"
	      uint32_t Fu_us;
	      //1us需要记的次数
	      uint32_t Fu_ms;
	      //1ms需要记的次数
	      void Systicks_Config(uint32_tSysclk)
	      {
			      //1,配置时钟源----8分频,并且关闭定时器
			      SysTick->CTRL&=~0x05;
			      Fu_us=Sysclk/8;
			      Fu_ms=Fu_us*1000;
	      }
		void Systicks_DelayNms(uint32_tNms)
		{
				uint32_ttemp;
				uint32_toverflag=0;
				while(0==overflag)
				{
						if(Nms>1864)
						{
								SysTick->LOAD=1864*Fu_ms;
								Nms-=1864;
						}else
						{
								//设置计数值
								SysTick->LOAD=Nms*Fu_ms;
								overflag=1;
						}
				//3,将当前值寄存清除
				SysTick->VAL=0;
				
				//4,打开定时器
				SysTick->CTRL|=0x01;
				
				//5,等待定时器结束----读计数标志位是否为1
				do{
					temp=SysTick->CTRL;
					}while(!(temp&(1<<16)));
					
				//6,定时结束关闭定时
				SysTick->CTRL&=~0x01;
		}
		void Systicks_DelayNus(uint32_tNus)
		{
				uint32_ttemp;
				uint32_toverflag=0;
				while(0==overflag)
				{
						if(Nus>1864000)
						{
								SysTick->LOAD=1864000*Fu_us;
								Nus-=1864000;
						}
						else
						{
								//设置计数值SysTick->LOAD=Nus*Fu_us;
								overflag=1;
						}
				}
			//3,将当前值寄存清除
			SysTick->VAL=0;
			
			//4,打开定时器
			SysTick->CTRL|=0x01;
			
			//5,等待定时器结束----读计数标志位是否为1
			do{
						temp=SysTick->CTRL;
						}while(!(temp&(1<<16)));
						
			//6,定时结束关闭定时
			SysTick->CTRL&=~0x01;
		}

(二)GPIO输出----按键检测按键读取的步骤:

```c
void KEY_Config(void)
{
		GPIO_Init TypeDefGPIO_InitStruct;
		
		//1》打开GPIOA的时钟
		RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
		
		//2》初始化GPIOA0----上拉输入
		GPIO_Init Struct.GPIO_Pin=GPIO_Pin_0;
		GPIO_Init Struct.GPIO_Mode=GPIO_Mode_IPU;
		GPIO_Init(GPIOA,&GPIO_InitStruct);
}

1》打开GPIOA的时钟
2》初始化GPIOA0----上拉输入
uint8_t KEY_isPress(void){uint8_tret=0;

//3》判断PA0是否为低电平
if(0==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
{
		//4》延时30ms消除抖动
		Systicks_DelayNms(30);
		
		//5》再次判断PA0是否为低电平
		if(0==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0))
		{
				//6》等待按键抬起
				while(0==GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0));
				
				// 7》执⾏相应的操作 
				ret=1; 
		} 
	}
return ret; 
}
 3》判断PA0是否为低电平
 4》延时30ms消除抖动 
 5》再次判断PA0是否为低电平 
 6》等待按键抬起 
 7》执⾏相应的操作

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

懒虫☜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值