STM8Sのclockに詳しくなる

マイコンのハードウエアを理解するためには、まずclock系統がどうなっているのかを理解するのが最初のstepだと私なんぞは思います.

なぜかというと、マイコンが行う処理には、なにかにつけて時間(タイムベース)が関わってくるからです.
●ステッピングモーターを回転させる処理では、回転数は時間の関数ですから、タイムベース抜きには語れない.
●タイマー割り込み処理には、タイマーが何Hzのクロックで動いているのかが判らないと何秒数えたのか判らない.
●通信処理では、ボーレートを決めなければいけませんが、これもタイムベースあってこそのもの.
●LEDをチカチカさせるには、タイムベースがなくてはいけない.

というわけで、clockについて詳しくなりましょう.

Revised 2011.10  HSIのdefault 分周比の誤記訂正
Released 2011.10


クロックモードは4種類ある

まず、STM8Sのクロックのブロック図はこれです.


いきなりこれを理解できればこんなサイトの情報にお世話になる必要もないわけで、以下でもっとかみ砕いて説明します、

クロックモードは4種類あるんです.

①外部Xtalを源発振にするモード   (HSE)
特殊なクロック周波数を使いたいケースには便利です.


②外部発信器を源発振にするモード   (HSE)
他の回路がclockを持っている時に便利です.


③16MHzの内部発信器を源発振にするモード (HSI)
外付け水晶が不要なので値段が安くて便利ですが、水晶ほどの周波数精度は得られませんので、長時間の時刻を測定するような用途には向かないと思います.


④128kHzの内部発信器を源発振にするモード (LSI)
電池駆動したい用途に適します.クロック周波数が低ければ消費電力を小さく抑えられますので.





各モードの詳細を説明

①外部Xtalを源発振にするモード   (HSE)

概要:
このモードでは、外付け水晶発振子の周波数がfMASTERとして、そのままタイマー/ADC/UARTなどの周辺回路に供給します.
STM8S-DISCOVERYでは、16MHzの水晶が外付けされているので、fMASTER=16MHzとなります.
CPUへのクロックは、CPU専用の分周回路があって1/2/4/8/16/32/64/128分周されます.
CPUの動作は速いに越したことはないので分周比は1で fCPU=16MHz で使うのが普通の使い方でしょう.

設定方法:
このモードにするには、次の関数をcallします.
CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
fCPUの分周比はデフォルトで1に設定されているので、普通の使い方ならclock設定はこれでおしまいです.

もしもfCPUの分周比を設定したければ、次のどれかの関数をcallします.引数の末尾の数字が分周比を表します.
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);


②外部発信器を源発振にするモード   (HSE)

概要:
このモードでは、外部発信器から入力された信号を fMASTERとして、そのままタイマー/ADC/UARTなどの周辺回路に供給します.
STM8S-DISCOVERYでは、16MHzの水晶が外付けされているので、水晶を剥がさないとこのモードは使えません.
CPUへのクロックは、CPU専用の分周回路があって1/2/4/8/16/32/64/128分周されます.
CPUの動作は速いに越したことはないので分周比は1で fCPU=外部発振器周波数 で使うのが普通の使い方でしょう.

設定方法:
このモードにするには、次の関数をcallします.
CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSE, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
fCPUの分周比はデフォルトで1に設定されているので、普通の使い方ならclock設定はこれでおしまいです.

もしもfCPUの分周比を設定したければ、次のどれかの関数をcallします.引数の末尾の数字が分周比を表します.
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);

ところで、
CLK_ClockSwitchConfig ();  の引数が①と②で同じだってことに気づかれましたか?
同じなのにどうして機能を切り替えられるのでしょうか?
それは、別の切り替え機能を追加で設定して切り替えるのです.
その機能は option byteと呼びます.option byteについての解説はこちらをご覧ください.

このモードに切り替えるためのoption byteの操作方法を詳しく書きます.
STM8S-discoveryをPCに接続します.
STVPを起動します.
次に、下の方のOPTION BYTEタブをクリックします.

次に、Read current tab or active sectorsボタンをクリックして、現状のoption bytes設定を読みます.

次に、この場所を探してください.EXTCLKという項目の設定です.
この状態は、外部水晶が接続される設定、すなわち①の設定になっています.

ここの設定を、このように変更します.
外部信号を入力する設定、すなわち②の設定にしました.

そしたら、この設定をSTM8Sに焼きます.Program current tab or active sectors ボタンをクリック.
焼き終わったらSTVPをExitします.



③16MHzの内部発信器を源発振にするモード   (HSI)

概要:
このモードでは、内蔵発振器の16MHzを源発振とし、その後に1/2/4/8分周回路があって、それをfMASTERとして、タイマー/ADC/UARTなどの周辺回路に供給します.
したがって、fMASTERを16/8/4/2MHzのどれかにできます.
STM8S-DISCOVERYでは、16MHzの水晶が外付けされていますが、このモードにすると水晶はシカトされます.
CPUへのクロックは、CPU専用の分周回路があって1/2/4/8/16/32/64/128分周されます.
CPUの動作は速いに越したことはないので分周比は1で fCPU=16MHz で使うのが普通の使い方でしょう.

設定方法:
このモードにするには、次の関数をcallします.
CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_HSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
fMASTERの分周比のデフォルトには注意が必要です.HSIモードではデフォルトでfMASTER=16MHz/8=2MHz に設定されます.
したがって、fMASTER=16MHzで使うには、
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV1 );  // 16MHz
を忘れずにcallしなければなりません.
fCPUの分周比はデフォルトで1に設定されているので、普通の使い方ならclock設定はこれでおしまいです.

もしもfMASTERの分周比を設定したければ、次のどれかの関数をcallします.
引数の末尾の数字が分周比を表します.
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV1 );  // 16MHz
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV2 );  // 8MHz
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV4 );  // 4MHz
CLK_HSIPrescalerConfig( CLK_PRESCALER_HSIDIV8 );  // 2MHz


もしもfCPUの分周比を設定したければ、次のどれかの関数をcallします.引数の末尾の数字が分周比を表します.
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64);
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);


④128kHzの内部発信器を源発振にするモード  (LSI)

概要:
このモードでは、内蔵発振器の128kHzを源発振とし、それをfMASTERとして、タイマー/ADC/UARTなどの周辺回路に供給します.
STM8S-DISCOVERYでは、16MHzの水晶が外付けされていますが、このモードにすると水晶はシカトされます.
CPUへのクロックは、CPU専用の分周回路があって1/2/4/8/16/32/64/128分周されます.
CPUの動作は速いに越したことはないので分周比は1で fCPU=128kHz で使うのが普通の使い方でしょう.

設定方法:
このモードにするには、次の関数をcallします.
CLK_ClockSwitchConfig ( CLK_SWITCHMODE_AUTO, CLK_SOURCE_LSI, DISABLE, CLK_CURRENTCLOCKSTATE_DISABLE );
fCPUの分周比はデフォルトで1に設定されているので、普通の使い方ならclock設定はこれでおしまいです.

もしもfCPUの分周比を設定したければ、次のどれかの関数をcallします.引数の末尾の数字が分周比を表します.
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV1);  // 128kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV2);  // 64kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV4);  // 32kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV8);  // 16kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV16);  // 8kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV32);  // 4kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV64);  // 2kHz
CLK_SYSCLKConfig(CLK_PRESCALER_CPUDIV128);  // 1kHz



Clockを外部ピンに出力してモニタしたいとき

そういう仕組みもSTM8Sには備わっています.
STM8S105C6でclockが出力されるピンは40番です.(40: PE0/CLK_COO)
STM8S-DISCOVERYの基板上では、CN4の4ピンにその信号が出てくる仕様になっています.
ただし、defaultでclockが出力されているわけではなく、次の関数をcallして明示的に設定しなければなりません.

設定方法:
CLK_CCOConfig(CLK_OUTPUT_HSI);
CLK_CCOCmd(ENABLE);


内部回路のどこのclockをモニタしたいのかを
CLK_CCOConfig() の引数で指定します.
CLK_CCOConfig( CLK_OUTPUT_HSI );  // 内部発振16MHz
CLK_CCOConfig( CLK_OUTPUT_LSI );  // 内部発振128kHz
CLK_CCOConfig( CLK_OUTPUT_HSE );  // 外部発振(周波数は外部回路次第)
CLK_CCOConfig( CLK_OUTPUT_CPU );  // fCPU
CLK_CCOConfig( CLK_OUTPUT_CPUDIV2 );  // fCPU/2
CLK_CCOConfig( CLK_OUTPUT_CPUDIV4 );
CLK_CCOConfig( CLK_OUTPUT_CPUDIV8 );
CLK_CCOConfig( CLK_OUTPUT_CPUDIV16 );
CLK_CCOConfig( CLK_OUTPUT_CPUDIV32 );
CLK_CCOConfig( CLK_OUTPUT_CPUDIV64 );
CLK_CCOConfig( CLK_OUTPUT_HSIRC );
CLK_CCOConfig( CLK_OUTPUT_MASTER );  // fMASTER
CLK_CCOConfig( CLK_OUTPUT_OTHERS );

動作検証:
STM8S-DISCOVERYを実際に動かしてみて、動作検証しました.
動作検証したworkspaceファイルをここに置きました.
このworkspaceには、test03/test03b/test03c/test03d/test03e の5つのprojectを含んでいます.
どのprojectをactiveにするかはこのようにして設定します.この例はtest03cをactiveにしています.
その後でビルドします.その後STVPで焼いてください.


検証結果のまとめが下表です.
源発振clockは、いじりどころ満載な③HSI(内部16MHz発振器)にしました.
●test03では、2つの分周回路の分周比を共に1に設定しました.したがってfMASTER=fCPU=16MHzになったと期待できます.
このときLED点滅周波数は250kHzでした.16MHz/250kHz=64マシンサイクルで制御できているのだと納得しておきます.
観測点設定を
CLK_OUTPUT_CPU にしたところ、CCOモニタには想定通り16MHzが出ています.
●test03bでは、観測点設定を
CLK_OUTPUT_CPUDIV8 (fCPU/8)にしました.その結果、CCOモニタには想定通り2MHzが出ています.
また、観測点を変更しても、CPU動作には影響がないことが、LED点滅周波数が250kHzのまま不変であることから推定できます.
●test03cでは、
観測点設定を CLK_OUTPUT_LSI  (内部128kHz発振器)にしました.その結果、CCOモニタには想定通り128kHzが出ています.
使われていないLSIは休んでいるのかと思いきや、動いているようです.
CPU動作速度は相変わらず不変です.
●test03dでは、
観測点設定を CLK_OUTPUT_HSE (外部水晶16MHz)にしました.その結果、CCOモニタには想定通り16MHzが出ています.
使われていないHSEは休んでいるのかと思いきや、動いているようです.
CPU動作速度は相変わらず不変です.
●test03eでは、fMASTER分周比=4 に fCPU分周比=2 に設定しました.したがって fMASTER=4MHz、fCPU=2MHz になったと期待できます.
このときLED点滅周波数は31.25kHzでした.したがってCPUの動作速度が31.25/250=1/8 になったと推測できます.期待通りです.
観測点設定を CLK_OUTPUT_MASTER (fMASTER) にしました.その結果、CCOモニタには想定通り4MHzが出ています.
project

源発振設定
fMASTER分周比設定
fCPU分周比設定
観測点設定
CLK_CCOConfig(引数)
LED
点滅
周波数
CCO
周波数
(PE0ピン)
test03
HSI(16MHz)
CLK_PRESCALER_HSIDIV1 CLK_PRESCALER_CPUDIV1 CLK_OUTPUT_CPU 250kHz
16MHz
test03b
HSI(16MHz) CLK_PRESCALER_HSIDIV1 CLK_PRESCALER_CPUDIV1 CLK_OUTPUT_CPUDIV8 250kHz
2MHz
test03c
HSI(16MHz) CLK_PRESCALER_HSIDIV1 CLK_PRESCALER_CPUDIV1 CLK_OUTPUT_LSI 250kHz
128kHz
test03d
HSI(16MHz) CLK_PRESCALER_HSIDIV1 CLK_PRESCALER_CPUDIV1 CLK_OUTPUT_HSE 250kHz
16MHz
test03e
HSI(16MHz) CLK_PRESCALER_HSIDIV4 CLK_PRESCALER_CPUDIV2 CLK_OUTPUT_MASTER 31.25kHz
4MHz


以上で、clockについて詳しくなるはおしまいです.

inserted by FC2 system