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;

	}
}

​

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值