步骤
- 编写SysTick驱动程序(STM32F1系列通用)
- 将固件库文件misc.c添加至工程,misc.c中包含SysTick寄存器的操作函数
- 编写头文件:函数声明
- 编写驱动文件:初始化函数、延时us函数、延时ms函数
- 对GPIO的IDR和ODR寄存器位操作进行封装(STM32F1系列通用)
- 编写按键驱动程序
- 编写头文件:宏定义连接按键的端口、端口引脚、端口时钟、引脚位带、按键值,函数声明
- 编写驱动文件:
- 按键初始化函数:开启端口时钟,定义GPIO_InitTypeDef结构体变量并初始化
- 按键检测函数:检测到按键被按下,延时10ms消抖,再次确认按键被按下
- 编写LED驱动程序
- 编写头文件:宏定义连接LED的端口、端口引脚、端口时钟、引脚位带,函数声明
- 编写驱动文件:
- LED初始化函数:开启端口时钟,定义GPIO_InitTypeDef结构体变量并初始化,拉高引脚电平
- 主函数接收按键扫描结果并处理
代码
//SysTick.h
#ifndef _SYSTICK_H
#define _SYSTICK_H
#include "system.h"
void SysTick_Init(u8 SYSCLK);
void delay_ms(u16 nms);
void delay_us(u32 nus);
#endif
//SysTick.c
#include "SysTick.h"
static u8 fac_us = 0; //保存倍乘数
static u16 fac_ms = 0;
void SysTick_Init(u8 SYSCLK)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //将CTRL寄存器的第二位置0,即用外部时钟源
fac_us = SYSCLK/8; //72/8
fac_ms = (u16)fac_us*1000;
}
void delay_us(u32 nus)
{
u32 temp;
SysTick->LOAD = nus*fac_us;//重装载值
SysTick->VAL = 0x00;//当前数值清0
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;//使能SysTick
do
{
temp = SysTick->CTRL;
}while((temp&0x01)&&!(temp&(1<<16)));//定时器开启且未倒数到0