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);
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章