EDITORIAL: 個人的な要約であるとして間違っては、私を修正してください場合は、この記事の目的は、将来の問い合わせを容易にするため、バックアップを要約する;加えて、インターネット、書籍、各種マニュアルの内容のほとんどは、侵害を通知し、すぐに削除投稿を喜ばなければなりません謝罪します。
ディレクトリ
A、SysTickの紹介
そこARMのCortex-M3コアのSysTick 24ビットタイマティックは、システムで使用することができるタイマ、システムタイマーティックのCortex-M3は、急速マイグレーションプロセッサチップのために使用することができる(PS:ポジティブこの特性を、ほとんどはRTOSのSysTickを実行しているに基づいているため)移植するために、クロックを倒すために使用されます
知ってのCortex-M3コア上の2つのリンクを添付し、2つのCortex-M3簡素化ビューを添付し、そして:
"マニュアルプログラミングSTM32F10xxxのCortex-M3"
"のCortex™-M3テクニカルリファレンスマニュアル。"
二、SysTickのクロック解析
クロックツリーによると、我々はそれがシステムクロックは、実際に、タイマー1/8ない刻々と過ぎている、時計を刻むタイマーはどちらかHCLK / 8できることを考えることがありますSYSCLK後、またHCLKすることができ、これはCTRLである見ることができます以下のように(「マニュアルプログラミングSTM32F10xxxのCortex-M3」を見ることで見つけることができる)のセットを登録します。
当該レジスタの説明をのSysTick:
アイデアの実現:ダウンカウンタのSysTickタイマの使用、そしてそれは、それは0、のSysTickカウンタは自動的に初期値をリロードしてカウントを続けます、カウントまで減少下システムのクロックサイクル毎にカウンタになりますができた後の初期値を設定します割り込みをトリガします。
最初の数:一回によって72MHzクロック、カウンタのデクリメントとして使用するシステム構成に基づいてクロックを1 / 72MHz、我々はカウンタの初期値が72000であると仮定され、カウンタが到達がゼロ各時刻、経過時間(1 / 72M)* 72000 = 0.001、すなわち、1ミリ秒。(として理解することができます:72MHzのクロック周波数、彼は数1S 72000000のビュー(サイクル数)を表し、そして1ミリ秒に72000回を数え、カウント値は72,000です)
以下のための3つの、のSysTickクロックビートコード
bsp.c 源文件
#include "bsp.h"
static __IO u32 TimingDelay = 0;
/* Setup SysTick Timer for 1 msec interrupts.
------------------------------------------
1. The SysTick_Config() function is a CMSIS function which configure:
- The SysTick Reload register with value passed as function parameter.
- Configure the SysTick IRQ priority to the lowest value (0x0F).
- Reset the SysTick Counter register.
- Configure the SysTick Counter clock source to be Core Clock Source (HCLK).
- Enable the SysTick Interrupt.
- Start the SysTick Counter.
2. You can change the SysTick Clock source to be HCLK_Div8 by calling the
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8) just after the
SysTick_Config() function call. The SysTick_CLKSourceConfig() is defined
inside the misc.c file.
3. You can change the SysTick IRQ priority by calling the
NVIC_SetPriority(SysTick_IRQn,...) just after the SysTick_Config() function
call. The NVIC_SetPriority() is defined inside the core_cm3.h file.
4. To adjust the SysTick time base, use the following formula:
Reload Value = SysTick Counter Clock (Hz) x Desired Time base (s)
- Reload Value is the parameter to be passed for SysTick_Config() function
- Reload Value should not exceed 0xFFFFFF
*/
/************************************************
函数名称 : SysTick_Init
功 能 : 启动系统滴答定时器 SysTick
参 数 : 无
返 回 值 : 无
*************************************************/
void SysTick_Init(void)
{
/* SystemCoreClock / 1000 1ms中断一次
* SystemCoreClock / 100000 10us中断一次
* SystemCoreClock / 1000000 1us中断一次
*/
/* 嘀嗒定时器每计数一次为 1/72M,此处计数 72个数,即1uS中断一次 */
if(SysTick_Config(SystemCoreClock / 1000000)) // ST V3.5.0库版本
{
/* Capture error */
while(1);
}
// 关闭滴答定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
/************************************************
函数名称 : Delay_us
功 能 : us延时程序,1us为一个单位
参 数 : nTime ---- 时间次数
返 回 值 : 无
*************************************************/
void Delay_us( __IO u32 nTime )
{
TimingDelay = nTime;
// 使能滴答定时器
SysTick->CTRL |= SysTick_CTRL_ENABLE_Msk;
while( TimingDelay != 0 );
// 关闭滴答定时器
SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
}
/************************************************
函数名称 : TimingDelay_Decrement
功 能 : 获取节拍程序
参 数 : 无
返 回 值 : 无
注 意 : 在 SysTick 中断函数 SysTick_Handler()调用
*************************************************/
void TimingDelay_Decrement(void)
{
if(TimingDelay != 0x00)
{
TimingDelay--;
}
}
/*---------------------------- END OF FILE ----------------------------*/
根据上面的注释,选择对应参数传参进行 SysTick_Config() 配置,本篇是制作以微秒为单位的延时定时器,所以传入的参数为 SystemCoreClock / 1000000次,SystemCoreClock的数值,在上一篇 STM32笔记之系统时钟上有讲到
bsp.h 头文件
#ifndef __BSP_H
#define __BSP_H
#include "stm32f10x.h"
void SysTick_Init(void);
void Delay_us( __IO u32 nTime );
void TimingDelay_Decrement(void);
void SystemSoftReset(void);
#endif /* __BSP_H */
/*---------------------------- END OF FILE ----------------------------*/
接着我们再在 stm32f10x_it.c 文件中的 SysTick_Handler()函数里调用 TimingDelay_Decrement()函数进行计数递减
/**
* @brief This function handles SysTick Handler.
* @param None
* @retval None
*/
void SysTick_Handler(void)
{
TimingDelay_Decrement();
}
最后,我们在主函数中调用函数 SysTick_Init() 完成初始化,就可以使用利用 Systick获取节拍的时钟延时 Delay_us()函数了