クロックは一般に外部水晶発振器クロックと内部クロックに分けられ、相対的に外部水晶発振器クロックの方が内部システムクロックよりも精度が高く、時刻計算も正確です。良いものは高価で高価であるため、製品が必要としない限り、外部水晶発振器クロックは一般的に使用されません。
この記事では主に、クロックを使用してTimer0/1(RTC、PWM割り込み、ADC)を設定する方法と、割り込み時間の設定方法を紹介します。
基礎知識 1 MHz=1000 kHz=1000 000 Hz 1s = 1 000ms
タイマ機能を選択する前に、クロックを選択し、次に分周を選択して割り込み時間を決定する必要があります。
目次
1. クロック構造
以下に示すように:
RC32KHz(RC128KHz4分周)は低速クロック(低電力モード)であり、
RC1MHzはシステムクロック(各モジュールに接続可能)、
XOSC は外部水晶発振器クロックです。
2. Timer0/1のクロックを設定します
チップのマニュアルに従ってクロックを選択してください
2.1、RC32K (低電力クロック)
128kHz を 4 分周した低電力クロック、RC_128K、RC_32K
2.2、RC1M (システムクロック)
2.2.1 PLL分周構成
RC1M 入力から PLL1MHz、出力32MHz
図のように RC 1MHz→PLL 32MHz が選択されています。チェックされていない場合は、レジスタを設定する必要があります。
PLL レジスタには外部クロックの分周がないことがわかります。これは、チップに外部水晶発振器クロックがないことを証明しています。
2.2.2 TIMER0/1 分周選択の取得
PLL は 32MHz を G に出力し、TIMER0/1 に 2 で分周することを選択します。
初期化チェックまたはレジスタ選択
3. 中断時間を計算する
3.1 RC_32KHz計算割り込み時間
32KHz = 32 000 Hz、1 S は 32 000 Hz (0x7D00)、1ms は 32 Hz (0x20)
3.2 RC_1MHz計算割り込み時間
RC_1MHZ→1MHZ→PLL(32MHz)→G(2分周)→16MHz
1S は 16MHz 16MHz = 16 000 000Hz 1ms は 16 000Hz (0X3E80)
/*!
\brief timer0/1 initialize
\param[in] timerx: TIMERx(0,1)
\param[in] timer_cfg: timer0/1 config
\param[in] timer_mod: timer0/1 mod count
\param[out] none
\retval none
*/
void timer_init(uint32_t timerx,uint8_t timer_cfg,uint16_t timer_mod)
{
TIMER_CFG(timerx) = timer_cfg;
TIMER_MOD(timerx) = timer_mod;
if(timerx == (uint32_t)TIMER0){
if((timer_cfg & TIMER_CFG_IE) != 0U){
NVIC_EnableIRQ(TIMER0_IRQn);
}else{
NVIC_DisableIRQ(TIMER0_IRQn);
}
}else{
if((timer_cfg & TIMER_CFG_IE) != 0U){
NVIC_EnableIRQ(TIMER1_IRQn);
}else{
NVIC_DisableIRQ(TIMER1_IRQn);
}
}
}
timer_init(TIMER0,0x2B,0x3E80); 0X2B は各レジスタに設定され、0x3E80 は 1ms の割り込みを生成します。
他の割り込みイベントも基本的には同じで、真似するだけです。