調べるのに時間がかかったので忘れないうちに書いておく。
Power On Reset と Brown Out Detection
EEPROM を使うのでデータ壊れを防ぐ手立てはどうなっているかを知るために調べた。PSoC 5LP では特に設定の必要はなく POR と Low Level Detection は動作するようだ。ただし regulated mode の電源設定で使う必要がある。PSoC5 データシートの 11.8 節に記述されている。Regulated mode が何かについてもデータシートに詳しく書かれている。EEPROM の電源オフ時の考慮は AVR と同様 brown-out 状況でリセットをかけることのようだが上述の通り PSoC 5LP ではユーザから特に何かする必要はない。(んだと思う)
ハードウェアタイマを使わずに時間計測
CyDelay() 関数でミリ秒単位のスリープがかけられる。ただしブロッキング
ノンブロッキングで時間計測したければ CySysTick を使う。PSoC Creator PSoC 3/PSoC 5LP System Reference Guide, 001-96074 14章参照
デジタルポットのコマンドがデバイス指定の速さを超えないように制御するため必要(これにハードウェアタイマを使うのは煩雑で非効率。時間は正確でなくてよいので)
追記 2025/4/25
sys tick を使った LED 点滅、少してこずったのでコード例を追記
static volatile uint8_t blink_count = 0;
static void RedBlink() {
RED_ENCODER_LED_TOGGLE();
if (--blink_count == 0) {
CySysTickStop();
}
}
static void StartRedBlinking() {
CySysTickInit();
CySysTickSetClockSource(CY_SYS_SYST_CSR_CLK_SRC_LFCLK);
CySysTickSetReload(100000 / 1000 * 100); // 100ms
CySysTickSetCallback(0, RedBlink);
CySysTickEnableInterrupt();
CySysTickClear();
blink_count = 10;
RED_ENCODER_LED_ON();
GREEN_ENCODER_LED_OFF();
CySysTickEnable();
}
Cこれで StartRedBlinking() を呼べば 5 回 LED が点滅して止まります。割り込みを使わない方法はちょっとうまいやり方が見つからず。クロックもシステムクロック (CY_SYS_SYST_CSR_CLK_SRC_SYSCLK) を使うとなぜかうまくいきませんでした。LF クロックとは、使っている PSoC 5 LP では 100 kHz の ILO です(ドキュメントに書いてあります)。