Arduinoで小さな32ビットマイコン,STM32C011が動きました

速いといわれているSTM32なのでこの小さなシリーズではどうだろうかと思い,パラレル出力も含めてデジタル出力をみてみました。


20pinのSTM32C011F4P6をプログラムして,ロジアナで出力をチェックします。





出力方法は以下を試してみました。

1. digitalWrite()
2. digitalWriteFast()
3. PORT出力レジスタでのビット操作
4. PORT出力ビットのセットリセットレジスタでのビット操作
5. PORT出力レジスタからのパラレル出力

☆ なお,ポート操作はスピードは出ますが間違うとMPUを壊す事があります。特に今回触ったPORTAにはPA13,PA14というプログラム書き込みに必須のピンがあるので,くれぐれも注意して,,自己責任で(^^;;;,



1.digitalWrite()
 Arduinoでは標準のデジタル出力ですので,安定して動いてくれます。
出力ピンはPA8,Lチカのdelay無し版です。




出力波形です。概ね1.8usのパルスでCH32V003と比べると圧倒的に速いですね。






2.digitalWriteFast()
 標準で無い機種もあると思いますが,ポート操作の出力と同等のスピードが出ることが多いですね。
ピンの指定はピン名のPA8ではなく,ピン番号のPA_8とアンダーライン付きなのが忘れやすいですね(^^;;;;;;;




出力波形から,20ns程度のパルスは出るようです。



この結果からdigitalWriteFast()を使ってNeoPixelの波形を作ろうとしたのですが,,べたで並べると何とかなりますが,forループで回しての調整がうまくいきません。どうも私のプログラムではループが8回を越すとおかしな挙動をとり,原因がよく分かりません(^^;;;;;;;;




3.PORT出力レジスタでのビット操作
 ピンPA8に相当する,PORTAのODRレジスタの第8ビットを操作しています。
他のビットに迷惑をかけないように,ORで書き込んで,ANDでクリアするのが常套手段ですね,




ORとかANDとかにも時間が割かれるからでしょうか,60ns程度のパルスになっています。ただこの方法ならパラレルのデータ出力が可能ですね。






4.PORT出力ビットのセットリセットレジスタでのビット操作
 ピンPA8に相当する,PORTAのBSRRレジスタの第8ビットを操作しています。このレジスタは32bit長と長いので1データは16進表記にしています。

 BSRRレジスタは32bitの上位16bitがクリアレジスタ,下位16bitがセットレジスタという変わった構成になっていて,少し使いずらいですね。





動作は速く,さすがに計算過程が入らないので25nsぐらいのパルスが出るようです。






5.PORT出力レジスタからのパラレル出力
 PORTAのODRに1byteデータをパラレルに書き込んで出力しています。
ODRレジスタは16bit長なので,今回は下位8bitだけ使用し,ANDでクリアしてからORでデータを入れています。





0から255まで順番に書き込んでいます。1回り約44us周期なので,各値はループ込みで約170ns間隔で出力されています。






以上のようにデジタル出力はなかなか速く,大まにかは把握できました。
メモリの問題とか色々ありますが,ぼとぼちと使って行きたいですね。