Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob

PSoC 4 でシステムティック(SysTick) タイマを使用する - Community Translated (JA)

PSoC 4 でシステムティック(SysTick) タイマを使用する - Community Translated (JA)

ChaitanyaV_61
Employee
Employee
50 questions asked 25 likes received 25 sign-ins

Community Translated by  MoTa_728816          Version : **

質問:
システムティック(SysTick) タイマとは何ですか? PSoC 4 で汎用タイマとして使用する場合にはどのように設定して使用すれば良いのでしょうか?


回答:
SysTick タイマは PSoC 4 ファミリのエンジンである ARM Cortex-M0 プロセッサの内蔵機能の一つです。これはティック値リロード機能付きの24ビットのダウンカウンタで、PSoC 4 のクロッキングシステムからCortex-M0 に提供されるシステムクロック (SysClk) をクロックとして動作します。このタイマは設定されたティック数が経過してリロードが行われる時に割込みを発生する機能があります。この割込みはCPUによるネスティッドベクターインタラプトコントローラ(NVIC)サービスの一部として提供され、ユーザーのプログラムからは汎用タイミングコントロールに使用可能です。このタイマは CPU から (クロック以外は) 独立していますので、正確なタイミングを必要とするアプリケーションにとって専用のタイマやカウンタが無い場合でも使用できるという利点があります。

タイマの設定:

SysTickのレジスタは Cortex-M0 CPUベースのデバイスに共通のシステムコントロールスペース (SCS) レジスタの一部です。詳細は Cortex-M0 Devices Generic User Guide 4.4 章、“Optional system timer, SysTick”をご参照ください。表1はレジスタの一覧表です。

1.  SysTick タイマ レジスタ

アドレス

名称

タイプ

リセット値

説明

    0xE000E010

    SYST_CSR

    RW

    -[a]

    SysTick コントロール&ステータスレジスタ

    0xE000E014

    SYST_RVR

    RW

    不定

    SysTick リロード値レジスタ

    0xE000E018

    SYST_CVR

    RW

  不定

    SysTick 現在値レジスタ

    0xE000E01C

    SYST_CALIB

    RO

    -[a]

    SysTick キャリブレーション値レジスタ

    [a] 詳細は レジスタの説明を参照してください

PSoC 4 ファミリでは、これらのレジスタは core_cm0.h ファイルで定義されている構造体へのポインタを使用してアクセスすることが出来ます。また、このファイルは SysTick タイマで汎用の周期的割込みを発生するように設定して機能させるための API も提供しています。表2と表3は構造体とAPI の詳細となります。

2. SysTick 構造体詳細

構造体名

メンバー

関数/対応レジスタ

    SysTick

   

   

   

    SysTick->CTRL

    SYST_CSR (コントロール&ステータスレジスタ)

   

    SysTick->LOAD

    SYST_RVR (リロード値レジスタ)

   

    SysTick->VAL

    SYST_CVR (現在値レジスタ)

   

    SysTick->CALIB

    SYST_CALIB (キャリブレーション値レジスタ)

3. SysTick API 詳細

関数

引数

戻り値

説明

    uint32 SysTick_Config(uint32)

    uint32 ticksリロード値レジスタに書込む値。

これがタイマの周期を規定します。

周期 = ticks/システムクロックの周波数

    uint32 status更新が正常行われたかを示す。もし引数‘tick’24ビット以上の場合、すなわち、値が リロード値レジスタに書込むことができなかった場合に更新は失敗します。

  この関数はシステムタイマとその割込みを初期化して、SysTickタイマを起動します。カウンタは周期的割込みを発生するためにフリーランニングモードになります。

タイマを希望の周期に設定して初期化する前に、周期的に発生される当該割込みを処理する適切な割込み処理ルーチン(ISR) にマップしておく必要があります。その為には下記のコード例で説明されているように CyIntSetSysVector() API を使用することが可能です。コード例は100システムクロックティック毎に SysTick 割込みを発生するファームウェアのサンプルです。ISR USER_ISR ルーチンにマップされています、これはご希望の有効な関数名に変更が可能です。

#include #define NUMBER_OF_TICKS  100/* ISR prototype declaration */CY_ISR_PROTO(USER_ISR); /* User ISR function definition */CY_ISR(USER_ISR) {  /* User ISR Code*/}  int main(void) { /* Map systick ISR to the user defined ISR. SysTick_IRQn is already defined in core_cm0.h file */ CyIntSetSysVector((SysTick_IRQn + 16), USER_ISR);  /* Enable Systick timer with desired period/number of ticks */ SysTick_Config(NUMBER_OF_TICKS);  /* Enable global interrupts */ CyGlobalIntEnable;  /* infinite loop */ for(;;)  {  } }

1650 件の閲覧回数
寄稿者