前回うかつにUART使ったらFlash再書き込みが出来なくなったと書きました。すると「のる@KHloCSIavYLAiKZ」様からご指摘あり、「Ryo Mukai@uCOM80」様の記事の中に復活方法が書いてあると。ありがとうございます。やってみました復活しました。今回は復活したチップ使ってMCO信号を外部出力とな。
「のる@KHloCSIavYLAiKZ」様からお教えいただきました「Ryo Mukai@uCOM80」様のブログ記事が以下であります。
上記記事の中にWCH-LinkUtility の以下のコマンドを使えばUARTのTXに割り当ててしまったSWIOでもFlashの消去が出来る件が説明されとります。
Clear All Code Flash-By Power off
1個「Lチカ+HelloWorld」専用チップになってしまったかと、内心忸怩たるものがあったので、感謝感激であります。何分CH32V003の単価は大変お求めやすいので結構個数を買ってあります。専用チップ化は予定路線ではあるのですが。上記のコマンドを起動するところが以下に。
実行後、クリアされた結果の表示が以下に。そっけない表示ですが、Flashはクリアされたみたいっす。
クリア後、デバイスに接続してデバイスのIDなど読み取ってみました。通信できているみたいね。
まずはクロックから
CH32V003の使い始めということで、まずはクロックを確認すべし、と考えました。データシートを読めば
内蔵のRCオシレータで発振した 24MHz がSYSCLK
であることは書かれているのです。
今回はCH32V003への「慣熟飛行」をかねてこのSYSCLKを外部に出力し、観察してみることにいたしました。
使用したソースコード(Arduino IDE用の .ino ファイル)は、前回もベースにした「Lチカ」プログラムのチョイ変です。
void setup() { pinMode(PD6, OUTPUT); pinMode(PC4, OUTPUT); GPIO_InitTypeDef mcopin; mcopin.GPIO_Pin = GPIO_Pin_4; mcopin.GPIO_Speed = GPIO_Speed_50MHz; mcopin.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_Init(GPIOC, &mcopin); RCC_MCOConfig(RCC_MCO_SYSCLK); } void loop() { digitalWrite(PD6, HIGH); delay(500); digitalWrite(PD6, LOW); delay(500); }
標準のArduinoには不在のAPIなどを呼び出して使ってますが、調べたところCH32V003用のArduinoパッケージはなかなか充実してます。以下のフォルダに上記で使っているような内蔵ペリフェラル制御用の関数や定義多数が確保されています。自分で低レベルの関数を作る必要はない感じ?
~Arduinoパッケージのインストールパス~\Arduino15\packages\WCH\hardware\ch32v\1.0.2\system\CH32V00x\SRC\Peripheral\src
さて今回使ってみたのは、MCO(Microcontroller Clock Output)とよばれる機能です。内部のクロック源をGPIOに出力する機能です。CH32V003では、GPIOのPC4端子(8ピンパッケージの7番に割り当て)にMCO機能がAlternate機能の一つとして割り当てられています。そこで今回は
PC4端子を、Alternate信号をプッシュプル出力、その際高速(50MHz!)出力対応とする
という設定にしてます。端子の駆動能力は何段階か設定あるのですが、今回想定しているのは24MHzのクロック出力なので、50MHzとしています。なお、これは最速設定デス。
ビルドして実行
フラッシュ初期化できたおかげで、何のトラブルもなく上記のオブジェクトを書き込み完了。ついでのLチカも動作OK。7番端子の波形を観察したものが以下です。
上記は、Analog Discovery2のオシロでの観察結果です。Analog Discovery2は100Mサンプル毎秒なので、正直いってこのくらいの周波数になると「波形」観察するのはかなり辛いです。それでもなんとか周波数くらいは計算できるでしょう。
上記の波形は 500nsec期間に12周期がほぼ入っていることから
1周期= 500nsec / 12 ≒ 41.67 nsec
ということで周波数に換算すると 24.0MHzとな。やったね、予定通り。24MHzで動作しておるみたいです。