Stm32F407——SysTick定时器_蜂鸣器发声控制(4)

SysTick定时器应用过程:
1、设置时钟源,一般选参考时钟HCLK/8
2、设置定时器初值
3、将计数器清0(写任意数到VAL,VAL都会清0)
4、启动定时器
5、等待计数结束
6、关闭定时器

main.c

nt main(void)
{
    
    
	Stm32_Clock_Init(336,8,2,7);//系统时钟初始化
	LED_Init();//LED灯初始化
	BEEP_Init();
	while(1)
	{
    
    
		LED0 = 0; BEEP = 1;  //led0亮beep响
		Delay_ms(1000);   //延时1s
		LED0 = 1; BEEP = 0;  //led0灭led1亮
		Delay_ms(1000);
	}
}

封装结构体:

	typedef struct
	{
    
    
		volatile u32 CTRL;
		volatile u32 LOAD;
		volatile u32 VAL;
		volatile u32 CALIB;
	}SysTick_TypeDef;
	#define SysTick ((SysTick_TypeDef*)0xe000e010)

sys.c

//delay_xms()只能进行<798ms的延时
void Delay_xms(u16 xms)
{
    
    
	u32 num=21000;
	if(xms>798)
		return;
	SysTick->CTRL&=~(1<<2);//1.设置时钟源,一般选参考时钟HCLK/8=21MHZ
	SysTick->LOAD=xms*num;//2.设置定时器初值
	SysTick->VAL=0;	//3.将计数器清0(写任意数到VAL,VAL都会清0)
	SysTick->CTRL|=(1<<0);//4.启动定时器->bit0=1
	while((SysTick->CTRL&(1<<16))==0);//5.等待计数结束->bit16=1
	SysTick->CTRL&=~(1<<0);//6.关闭定时器->bit0=0
}
//delay_ms()可以进行>798ms的延时
void Delay_ms(u16 ms)
{
    
    
	u16 repeat=0,remain=0;
	repeat=ms/500;//调用Delay_xms(500)合计repeat次
	remain=ms%500;//将剩余的数最后调用Delay_xms(remain)
	while(repeat)
	{
    
    
		Delay_xms(500);
		repeat--;
	}
	if(remain>0)
		Delay_xms(remain);
}

猜你喜欢

转载自blog.csdn.net/weixin_53391957/article/details/117424249