PSoC 4 でシステムティック(SysTick) タイマを使用する - Community Translated (JA)
- RSS フィードを購読する
- 新着としてマーク
- 既読としてマーク
- ブックマーク
- 購読
- 印刷用ページ
- 不適切なコンテンツを報告
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] | |
0xE000E014 | SYST_RVR | RW | 不定 | |
0xE000E018 | SYST_CVR | RW | 不定 | |
0xE000E01C | SYST_CALIB | RO | -[a] | |
[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 –リロード値レジスタに書込む値。 これがタイマの周期を規定します。 | 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(;;) { } }