STM32F429--系统滴答定时器

系统滴答定时器:属于内核的定时器,用于控制整个系统的运行节拍,STM32F429是180MHZ的,STM32F103最高是72MHZ。此处主要是编写控制时钟进行延时的程序。
工作流程:利用systick定时器为递减计数器,设定初值并使能它后,它会每1个系统时钟周期计数器减,计数到 0时,SysTick计数器自动重装初值并继续计数,同时触发中断。只要不把它在SysTick控制及状态寄存器中的使能位清除,就永不停息。

  • SystemInit() 这个函数可以让主频运行到180M,可以把它作为systick的时钟源。

  • 计数方式:24bit向下递减的计数器

  • 系统频率:180MHZ

  • 实现功能:延时

  • 主要寄存器:
    SysTick->CTRL, --控制和状态寄存器

    SysTick->LOAD, --重装载寄存器

    SysTick->VAL, --当前值寄存器

    SysTick->CALIB, --校准值寄存器

bsp_systick.c

#include "stm32f4xx.h"

void SysTick_Init(void);
void Delay_us(__IO u32 nTime);
static __IO u32 TimingDelay;

/*系统滴答定时器初始化 */
void SysTick_Init(void)
{
	/* SystemFrequency / 1000    1ms中断一次
	 * SystemFrequency / 100000	 10us中断一次
	 * SystemFrequency / 1000000 1us中断一次
	 */
	if (SysTick_Config(SystemCoreClock / 100000))
	{ 
		/* Capture error */ 
		while (1);
	}
}
//层级调用
// 180 000000 / 10 0000 =1800
//1800* 1/180 = 10us  
//10us*10 0000 =  1000ms = 1s,即传入10 0000就是延时1S时间。
/**
  * @brief   us延时程序,10us为一个单位
  * @param  
  *		@arg nTime: Delay_us( 10 ) 则实现的延时为 10 * 10us = 100us
  * @retval  无
  */
void Delay_us(__IO u32 nTime)
{ 
	TimingDelay = nTime;	

	while(TimingDelay != 0);
}



/**
* @brief  获取节拍程序 * 
*函数名称:TimingDelay_Decrement
 
*功能描述:中断里调用此函数,即没发生一次中断,此函数被调用,此函数里的变量
TimingDelay 相当于减法计数器
  * @attention  在 SysTick 中断函数 SysTick_Handler()调用
  */
void TimingDelay_Decrement(void)
{
	if (TimingDelay != 0x00)
	{ 
		TimingDelay--;
	}
}


在stm32f4xx_it.c系统中断函数调用TimingDelay_Decrement();

/* @brief  This function handles SysTick Handler.*/
void SysTick_Handler(void)
{
	TimingDelay_Decrement();
}

main.c,其他灯的初始化函数课参考之前的文章:
在实验设计部分的bsp_led.h

#include "stm32f4xx.h"
#include "bsp_led.h"
#include "bsp_systick.h"

/* @brief  主函数*/
int main(void)
{
	/* LED 端口初始化 */
	LED_GPIO_Config();	
	/*系统滴答定时器初始化*/
	SysTick_Init();
	
	/* 控制LED灯 */
	while (1)
	{
		LED_RED;
		Delay_us(100000);//1s延时
		
		LED_GREEN;
		Delay_us(100000);
		
		LED_BLUE;
		Delay_us(100000);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章