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

Version 3

    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(;;)  {  } }