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 = 72000,1ms 一次
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--;
}
コミュニケーションへようこそ。ご不明な点がございましたら、メッセージを残してください。