Arduino UNO R4、GPTのレジスタ定義にミス発見
汎用PWMタイマのプリスケーラ設定、これが言うことを
聞かないので、追いかけてみました。
・きっかけは先日の1MHz方形波出力。
・それを100Hzにしたかった。
・ハードウェアマニュアルにはこんな表。
・タイマプリスケーラをPCLKD/16にすると、
48MHz/16で3MHzクロックに。
これを1/15000して200Hzにして、さらに
トグル出力で100Hzに。
こんな目論見。
・しかし出てきたのは400Hz。
なぜ???
そこで、レジスタ定義ファイルを調べてみたら
__IOM uint32_t GTCR; /*!< General PWM Timer Control Register */
struct
{
__IOM uint32_t CST : 1; /*!< [0..0] Count Start */
uint32_t : 15;
__IOM uint32_t MD : 3; /*!< [18..16] Mode Select */
uint32_t : 4;
★ __IOM uint32_t TPCS : 4; /*!< [26..23] Timer Prescaler Select */
uint32_t : 5;
} GTCR_b;
「TPCS」が4bitになってました。
ほんとは3bit。
ということは、
0b0000 1/1 これはok
0b0010 1/4
0b0100 1/16
0b0110 1/64
0b1010 1/256
0b1010 1/1024
こんな具合にLSBに1bitの0を足して4bitにしなく
ちゃなりません。
GPTを触るときはちょいと注意ということで。
最近のコメント