1.概要
PIC16FからSTM32F103に移植する
2.ソフト構成
1)構成
・コンバーターについてはPIC16F仕様をそのままSTM32F103に移植するため構成は同じ
・おまけのIDCODE等送信機能はEUART送信をUSB・VPCに変更
・リソース、ポート及びUSB・VPCコードはSTM32CubeMXで設定
2)リソース
3)ポート設定
3.移植での問題点と対応
1)HALライブラリによるポート設定処理が遅い
ポート入出力切替、エッジ検出方向切替が恐ろしく遅い
何もしなければ 10μsecもかかっていてSWCLK周波数上限はPIC16Fと同じレベルになってしまう
(1)ポート入出力切替対策
SWDOUTポートは、オープンドレイン出力+プルアップに設定して入出力切替しない
入力は 出力=OD(L) に設定した状態で読込む
(2)エッジ検出方向切替
HALの代わりにメモリーエリアに直接書き込むコードを使ってポート設定レジスタを書換える
これでもポート設定切替処理速度はPIC16F 32MHz(8MHZ)と同等レベル
変更前
変更後
2) EUART送信をUSB・VPCに変更
・STM32CubeMXでUSBクロックを48MHzに設定しライブラリを導入する
Middleware USB_DEVICEで Communication Device Class (Virtual Port Com)を選ぶ
・printf を USB・VPC にリダイレクトする
どこかに下記関数を追記すると printf の結果が USB・VCP に出力される
こちらのコードを使わせていただきました
こちらのページやネットでは VCP:Virtual COM Port となっていますが STマイクロは VPC:Virtual Port Com を使っています
機能は同じですがVCPに対してVPCは広義ではないかと思います
動作例
4.MINI ST-LINK V2への書込み
・リードプロテクトされているのでopenOCDでunlockする
・クローンチップが実装されていたので以前書いたCPUTAPIDを変更したcfgファイル stm32f11.cfg を使う
5.動作状況と参考資料等
1)openOCDによる書き込み
PIC16F版とクロック周波数も含め同じ
2)コード変換時のSWCLK クロック周波数:240kHz
インストラクションサイクル PIC16F 8MHz -> STM32F103 72MHz(3段パイプライン)でPIC16FのSWCLKが25kHzのため妥当なパフォーマンス
HALライブラリがあまりに遅くLLライブラリは試していないので参考として
3)USB・VCPによるコンバータ処理への影響
・それぞれ単独で動作させていればコンバーターの処理速度に影響はない
・ USB・VPC処理終了後リセットなしでコンバーター処理をしても影響なし
4)リードプロテクト
MINI ST-LINK V2はunlockできるモードに設定されていてunlockすると書き込まれているコードは消えてしまうようです
おしまい