小さな RISC-VマイコンCH32V003シリーズの中でもCH32V003F4P6は20Pinが出ています。デジタルデータをパラレルに出力できれば便利かなと思い,試しています。
まずは8bitデータをパラレルに出したいのでPORTCからの出力をみてみました。
どうも分からない点も多いのですが,とにかく出力はできたので,途中経過のメモです。
[機材]
・MPU:CH32V003F4P6
・Boards;CH32 MCU EVT Boards by WCH Ver. 1.0.3
簡単なソフトを書き込んで,出力をロジアナでみてみました。
![](https://stat.ameba.jp/user_images/20230807/22/pta55/79/99/j/o1200092915322392102.jpg?caw=800)
[Pin配置]
・出力に使いたいPin。
アンダーラインのPinでデータは主にPortCで出力する予定です。
![](https://stat.ameba.jp/user_images/20230807/22/pta55/6f/17/j/o2000073815322386742.jpg?caw=800)
・他の機能に使うPin
SWIO:プログラムの書き込み用
URX:デフォルトのUART通信の受信用
NRST:リセットPinとして使える
☆ たくさん機能が書かれていますが,デフォルトで設定されている機能はだいたいピン名の次に書かれていますね(^^)。
[テストプログラムと出力波形]
なんとか動いた,あまり信用はできない(^^;;;;プログラム例です。
・ポートCの出力レジスタは0x4001100Cにあります。
・全ビットを使ってみました。コンフィグ・レジスタがうまく使えないので,pinMode()で出力に設定しています。
・レジスタを触る時は必要なビットだけ"&"でクリアして,"OR"で書き込むのが安全と思ってやってみています。いわゆるマスクですかね?
![](https://stat.ameba.jp/user_images/20230807/22/pta55/c7/85/j/o0652086715322393870.jpg?caw=800)
・出力波形です
だいたい1サイクル220usで8bitの0から255をパラレルに出力していました。
![](https://stat.ameba.jp/user_images/20230807/23/pta55/16/70/j/o1423043915322401170.jpg?caw=800)
変な値は出ていないようです(^^;;;;;
![](https://stat.ameba.jp/user_images/20230807/23/pta55/69/c6/j/o1430043615322401166.jpg?caw=800)
[疑問点]
上記のプログラムではレジスタ入力部をわざわざ別関数にしてloopから呼んでいます。というのもデータ出力レジスタの値を変化させるには,何らかの他の動作が必要なようなのです。
それがタイミングなのか,私のプログラムに何かが足りないのかは分かりません,,。レジスタに入力後にdelayMicroseconds()を置いたり,他のポートを触ったり,digitalWrite()を使ったりしても動いたのですが,結構遅くなります(^^;;;;;。
ま,動いてはいるのでこのセンでやって行こうとは思っていますが,何かヒントがあればご教示願いたいですねぇ。
後,コンフィグ・レジスタをいろいろと触っていると時として暴走して,エミュレーターからのプログラム全消去機能の出番がありますので,要注意です(^^;;;;;;;。
まずは8bitデータをパラレルに出したいのでPORTCからの出力をみてみました。
どうも分からない点も多いのですが,とにかく出力はできたので,途中経過のメモです。
[機材]
・MPU:CH32V003F4P6
・Boards;CH32 MCU EVT Boards by WCH Ver. 1.0.3
簡単なソフトを書き込んで,出力をロジアナでみてみました。
![](https://stat.ameba.jp/user_images/20230807/22/pta55/79/99/j/o1200092915322392102.jpg?caw=800)
[Pin配置]
・出力に使いたいPin。
アンダーラインのPinでデータは主にPortCで出力する予定です。
![](https://stat.ameba.jp/user_images/20230807/22/pta55/6f/17/j/o2000073815322386742.jpg?caw=800)
・他の機能に使うPin
SWIO:プログラムの書き込み用
URX:デフォルトのUART通信の受信用
NRST:リセットPinとして使える
☆ たくさん機能が書かれていますが,デフォルトで設定されている機能はだいたいピン名の次に書かれていますね(^^)。
[テストプログラムと出力波形]
なんとか動いた,あまり信用はできない(^^;;;;プログラム例です。
・ポートCの出力レジスタは0x4001100Cにあります。
・全ビットを使ってみました。コンフィグ・レジスタがうまく使えないので,pinMode()で出力に設定しています。
・レジスタを触る時は必要なビットだけ"&"でクリアして,"OR"で書き込むのが安全と思ってやってみています。いわゆるマスクですかね?
![](https://stat.ameba.jp/user_images/20230807/22/pta55/c7/85/j/o0652086715322393870.jpg?caw=800)
・出力波形です
だいたい1サイクル220usで8bitの0から255をパラレルに出力していました。
![](https://stat.ameba.jp/user_images/20230807/23/pta55/16/70/j/o1423043915322401170.jpg?caw=800)
変な値は出ていないようです(^^;;;;;
![](https://stat.ameba.jp/user_images/20230807/23/pta55/69/c6/j/o1430043615322401166.jpg?caw=800)
[疑問点]
上記のプログラムではレジスタ入力部をわざわざ別関数にしてloopから呼んでいます。というのもデータ出力レジスタの値を変化させるには,何らかの他の動作が必要なようなのです。
それがタイミングなのか,私のプログラムに何かが足りないのかは分かりません,,。レジスタに入力後にdelayMicroseconds()を置いたり,他のポートを触ったり,digitalWrite()を使ったりしても動いたのですが,結構遅くなります(^^;;;;;。
ま,動いてはいるのでこのセンでやって行こうとは思っていますが,何かヒントがあればご教示願いたいですねぇ。
後,コンフィグ・レジスタをいろいろと触っていると時として暴走して,エミュレーターからのプログラム全消去機能の出番がありますので,要注意です(^^;;;;;;;。