(一)滴答定时器-----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》执⾏相应的操作