SysTickについて話す
要約:この章では、主にSysTickシステムタイマーの基本原理を紹介し、次にミリ秒タイマーを実装します。
1. SysTickタイマー(STK)システムタイマーはCM3コアの周辺機器であり、NVICに組み込まれています。システムタイマーは24ビットのダウンカウンターです。各カウンターがカウントする時間は1 / SYSCLKです。通常、システムクロックSYSCLKを72Mに設定します。リロードされた値レジスタの値が0にデクリメントされると、システムタイマーは割り込みを生成し、割り込みが前後に循環します。SysTickはCM3コアに属する周辺機器であるため、すべてのCM3コアベースのマイクロコントローラーにはこのシステムタイマーがあり、ソフトウェアをCM3マイクロコントローラーに簡単に移植できます。システムタイマーは通常、オペレーティングシステムでタイムベースを生成し、オペレーティングシステムのハートビートを維持するために使用されます。
2.SysTickレジスタ
SysTick-システムタイマーには4つのレジスタがあり、次のように簡単に紹介します。SysTickを使用してタイミングを生成する場合、最初の3つのレジスタのみを構成する必要があり、最後のキャリブレーションレジスタを使用する必要はありません。
SysTickレジスタの概要
登録名 | 登録の説明 |
CTRL | SysTick制御およびステータスレジスタ |
負荷 | SysTickリロード値レジスタ |
VAL | SysTick現在値レジスタ |
CALIB | SysTick校正値レジスタ |
各レジスタの詳細な説明を以下に示します。
3.SysTickタイミング実験
実験目的:SysTickを使用して1秒のタイムベースを生成し、LEDが1秒ごとに1回点滅します
プログラミングのポイント:
1.ファームウェアライブラリプログラミングを使用して、リロードレジスタの値を設定します
uint32_t TimingDelay = 0;
/**
* @brief 启动系统滴答定时器 SysTick
* @param 无
* @retval 无
*/
void SysTick_Init(void)
{
/* SystemFrequency / 1000 1ms 中断一次
* SystemFrequency / 100000 10us 中断一次
* SystemFrequency / 1000000 1us 中断一次
*/
if (SysTick_Config(SystemCoreClock / 100000)) {
/* Capture error */
while (1);
}
}
/**
* @brief us 延时程序,10us 为一个单位
* @param
* @arg nTime: Delay_us( 1 ) 则实现的延时为 1 * 10us = 10us
* @retval 无
*/
void Delay_us(__IO uint32_t nTime)
{
TimingDelay = nTime;
while (TimingDelay != 0);
}
/**
* @brief 获取节拍程序
* @param 无
* @retval 无
* @attention 在 SysTick 中断函数 SysTick_Handler()调用
*/
void TimingDelay_Decrement(void)
{
if (TimingDelay != 0x00) {
TimingDelay--;
}
}
2.割り込みサービス関数SysTick_Handlerを実装します
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
3.主な機能で、LEDのオンとオフの遅延を実現します
/* LED 端口初始化 */
LED_GPIO_Config();
/* 配置 SysTick 为 10us 中断一次,时间到后触发定时中断,
*进入 stm32fxx_it.c 文件的 SysTick_Handler 处理,通过数中断次数计时
*/
SysTick_Init();
while (1) {
LED1_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED1_OFF;
LED2_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED2_OFF;
LED3_ON;
Delay_us(100000); // 100000 * 10us = 1000ms
LED3_OFF;
}