[STM32-Sysyick]詳細な説明とアプリケーション、詳細な登録追加コード

1.SysTickの紹介

SysTick:システムタイマーはCM3コアの周辺機器であり、NVICに組み込まれています。システムタイマーは24ビットのダウンカウンターです。各カウンターがカウントする時間は1 / SYSCLKです。通常、システムクロックSYSCLKは72Mに設定されています。リロード値レジスタの値が0にデクリメントされると、システムタイマーは割り込みを生成し、割り込みが前後に循環します。SysTickはCM3コアに属する周辺機器であるため、CM3コアをベースにしたすべてのシングルチップコンピュータにこのシステムタイマーがあり、ソフトウェアをCM3シングルチップに簡単に移植できます。システムタイマーは通常、オペレーティングシステムでタイムベースを生成し、オペレーティングシステムのハートビートを維持するために使用されます。

SysTickレジスタの概要

ここに画像の説明を挿入
SysTick制御およびステータスレジスタ

ここに画像の説明を挿入
SysTickは値レジスタをリロードします
ここに画像の説明を挿入
SysTick現在の値レジスタ

ここに画像の説明を挿入

総括する:

1、Systick 实现定时或者延时,可以采取“查询方式”或者“中断方式”,
2、使能Systick  由SysTick->CTRL 控制。
3、开启 Systick :SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;   
     关闭 Systick :SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;   

注意 无论是哪种  都需要提前配置SysTick_Config()
//   core_cm3.c 
	static __INLINE uint32_t SysTick_Config(uint32_t ticks)
	{
    
     
	  if (ticks > SysTick_LOAD_RELOAD_Msk)  return (1);            /* Reload value impossible */
																   
	  SysTick->LOAD  = (ticks & SysTick_LOAD_RELOAD_Msk) - 1;      /* set reload register */
	  NVIC_SetPriority (SysTick_IRQn, (1<<__NVIC_PRIO_BITS) - 1);  /* set Priority for Cortex-M0 System Interrupts */
	  SysTick->VAL   = 0;                                          /* Load the SysTick Counter Value */
	  SysTick->CTRL  = SysTick_CTRL_CLKSOURCE_Msk | 
					   SysTick_CTRL_TICKINT_Msk   | 
					   SysTick_CTRL_ENABLE_Msk;                    /* Enable SysTick IRQ and SysTick Timer */
	  return (0);                                                  /* Function successful */
	}

//  * SystemFrequency / 1000    1ms中断一次
//	 * SystemFrequency / 100000	 10us中断一次
//	 * SystemFrequency / 1000000 1us中断一次

//  默认SystemFrequency = 72MHz,因此 ticks = 72,1us 一次
									 ticks = 720001ms 一次

2つの簡単なアプリケーション

1.遅延を達成するためのクエリ方法

//查询方式

void Dealy_us(uint32_t us)
{
    
    
	uint32_t i;
	SysTick_Config(72);  //1us
	for(i=0; i<us; i++)
	{
    
    
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk; //关闭Systick
}

void Dealy_ms(uint32_t ms)
{
    
    
	uint32_t i;
	SysTick_Config(72000);  //1us
	for(i=0; i<ms; i++)
	{
    
    
		while( !((SysTick->CTRL)&(1<<16)) );
	}
	
	SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;//关闭Systick
}

第二に、遅延を達成するための割り込みモード

void Dealy_IT_us(uint32_t us)
{
    
    
	
	SysTick_Config(72);  //1us
	nTime = us;
	
	//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;  //关闭
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    //打开
	while(nTime);
	
}

void Dealy_IT_ms(uint32_t ms)
{
    
    
	
	SysTick_Config(72000);  //1us
	nTime = ms;
	
	//SysTick->CTRL &=~SysTick_CTRL_ENABLE_Msk;  //关闭
	SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;    //打开
	
	while(nTime);
	
}

割り込みサービス関数の書き込み

void SysTick_Handler(void)
{
    
    
	TimeDecrease();
}

その中で


static uint32_t nTime = 0;
void TimeDecrease(void)
{
    
    
	nTime--; 
}

コミュニケーションへようこそ。ご不明な点がございましたら、メッセージを残してください。

おすすめ

転載: blog.csdn.net/qq_45689790/article/details/113841898