在HAL庫中,SysTick滴答定時器分析

/*SysTick是24位,倒數定時器

    */
 

在HAL庫中,SysTick滴答定時器分析

/*SysTick是24位,倒數定時器

	*/

/*在HAL庫中SysTick結構

	*/
typedef struct
{
  __IOM uint32_t CTRL;     /*!< Offset: 0x000 (R/W)  SysTick Control and Status Register */
  __IOM uint32_t LOAD;     /*!< Offset: 0x004 (R/W)  SysTick Reload Value Register */
  __IOM uint32_t VAL;      /*!< Offset: 0x008 (R/W)  SysTick Current Value Register */
  __IM  uint32_t CALIB;    /*!< Offset: 0x00C (R/ )  SysTick Calibration Register */
} SysTick_Type;


//在HAL庫中使用它精準計時兩種方式

/*****************************************
1.外部時鐘

	*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);//配置爲外部時鐘
#define Clock_Source 216 //216是經倍頻(PLL)後的時鐘大小,單位爲M
#define unsigned int u32
void delay_us(u32 nus)
{		
	u32 ticks;            /**VAL每次減1需要 1/Clock_Source 微秒
	
							*/
	u32 told,tnow;
	u32 tcnt=0;								//記錄VAL次數
	u32 reload=SysTick->LOAD;				//重裝載值2^23  	 
	ticks=nus*Clock_Source; 				//
	told=SysTick->VAL;        				//定時器VAL初始值
	while(1)
	{
		tnow=SysTick->VAL;	                 //獲取當前值
		if(tnow!=told)
		{	    
			if(tnow<told)tcnt+=told-tnow;	/**		|reload
													|
													|told
												|
													|tnow
													|
													∨	
														**/
			else tcnt+=reload-tnow+told;	    
			told=tnow;
			if(tcnt>=ticks)break;			/**		|reload
													|
													|tnow
													|
													|told
													|
													∨	
														**/
		}  
	}
}
 
//延時ms
void delay_ms(u16 nms)
{
	u32 i;
	for(i=0;i<nms;i++) delay_us(1000);
}

/****************************************
2.內部時鐘

	*/
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK_DIV8);//配置爲內部時鐘
tcnt=told-tnow+tcnt;

tcnt=reload-tnow+told+tcnt;

在while循環中,程序每次循環時間,累次相加,從而達到精準延時

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章