STM32利用Systick实现蜂鸣报时功能详解
题目具体要求
写一个函数,使用SysTick方法,计时0.25s ,使蜂鸣器产生n次短鸣+1长鸣,短鸣的时间为0.25s,长鸣时间为1s,每次鸣响之间间隔1s ,蜂鸣响起的同时,红色LED灯同时亮起,这里笔者n以3为例。
通常情况下我们会使用delay函数进行控制时间,如下
void Delay( uint32_t count)
{
for(;count!=0;count--);
}
但是Delay函数对时间的控制不够精确,在毫秒级别微秒级别控制精准度不如Systick函数,故这里使用Systick函数既便于控制又可以保证精确值。
具体思路实现
整体的代码实现部分主要分两部分,一部分是实现蜂鸣器进行报时,也就是需要编写使之蜂鸣的beep函数,另一部分是编写并利用systick函数进行计时来控制。
编写systick函数头文件
Systick时钟位于内核中,所以其包含的头文件需要有"core_cm3.h",其中对Systick函数的初始化(Systick_Config)以及对Systick函数的控制(Systick->CTRL),这样我们编写Systick函数就不用像上一篇对GPIO各个引脚等进行初始化配置了。如下分别是bsp_systick.c和bsp_systick.h
#include "bsp_systick.h"
#include "core_cm3.h"
#include "misc.h"
void SysTick_Delay_ms(uint32_t ms)
{
uint32_t i;
SysTick_Config(72000);//systick时钟频率达到72000000hz,所以在这里就是1ms,当然更精细可以μs
for(i=0;i<ms;i++)
{
while(!((SysTick->CTRL)&(1<<16)));
}
SysTick->CTRL &= ~ SysTick_CTRL_ENABLE_Msk;
}
#ifndef __BSP_SYSTICK_H
#define __BSP_SYSTICK_H
#include "stm32f10x.h"
#include "core_cm3.h"
void SysTick_Delay_ms(uint32_t ms);
#endif
编写beep函数头文件
beep也就是蜂鸣器是在GPIO中的,也就是说我们想要控制beep的on/off就需要通过GPIO寄存器进行控制,这里要提醒同学们一定去查找你们单片机的结构原理图,因为不同单片机的beep绑定的引脚大概率不同,笔者这里的beep引脚是GPIO A 的PIN8,那么就是熟悉的GPIO初始化和beep绑定的阶段了,同上,以下分别是beep.c和beep.h的代码
#include "beep.h"
void BEEP_Init()
{
GPIO_InitTypeDef GPIO_InitStructure; //初始化GPIO结构体
RCC_APB2PeriphClockCmd( BEEP_PORT_CLK, ENABLE);//使能beep的时钟
GPIO_InitStructure.GPIO_Pin=BEEP_GPIO_PIN; //引脚
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz; 频率不用改
GPIO_Init(BEEP_GPIO_PORT,&GPIO_InitStructure); //封装
}
#ifndef _beep_H
#define _beep_H
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#define BEEP_PORT_CLK RCC_APB2Periph_GPIOA //时钟绑定
#define BEEP_GPIO_PORT GPIOA //寄存器绑定
#define BEEP_GPIO_PIN GPIO_Pin_8 //引脚绑定
void BEEP_Init(void); //声明函数
#define BEEP_ON digitalHi(BEEP_GPIO_PORT,BEEP_GPIO_PIN)
//定义on/off(不同单片机高低电平控制响灭不同)
#define BEEP_OFF digitalLo(BEEP_GPIO_PORT,BEEP_GPIO_PIN)
#endif
编写main函数(bsp_led.h头文件前篇有过封装,需要调用不赘述了)
话不多说,记得把bsp_led.h的头文件重新加入该工程中,看看代码实现:
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "bsp_led.h"
#include "core_cm3.h"
#include "bsp_systick.h"
#include "beep.h"
int main (void)
{
LED_GPIO_Config();
BEEP_Init();
SysTick_Config(72000);
while(1)
{
for(int i =0;i<3;i++)
{
BEEP_ON
LED1_ON
SysTick_Delay_ms(250);
BEEP_OFF
LED1_OFF
SysTick_Delay_ms(1000);
}
BEEP_ON
LED1_ON
SysTick_Delay_ms(1000);
BEEP_OFF
LED1_OFF
break;
}
}
作者:Greentale1