STM32-SysTickの紹介

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;
	}

 

おすすめ

転載: blog.csdn.net/hzhshu_csdn/article/details/113041994