圏9研究所 工作室

圏9研究所の開発情報資料など

STM32F103 clone & BluePill  その7:SWD IDCODEコンバーター STM32F103版 ソフト編

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)と同等レベル

 変更前

HAL_GPIO_WritePin(SWDIO_GPIO_Port, SWDIO_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(SWDSW_GPIO_Port, SWDSW_Pin, GPIO_PIN_RESET);
GPIO_InitStruct_DIO.Mode = GPIO_MODE_OUTPUT_PP; 		// set SWDIO output
HAL_GPIO_Init(SWDIO_GPIO_Port, &GPIO_InitStruct_DIO);
GPIO_InitStruct_CLK.Mode = GPIO_MODE_IT_RISING; 		// set SWCLK EXTI Riging
HAL_GPIO_Init(SWCLK_GPIO_Port, &GPIO_InitStruct_CLK);

 

変更後

#define EXTI_RTSR 0x40010408	// EXTI Rising address
#define EXTI_FTSR 0x4001040C	// EXTI Falling address
#define SWCLK_BIT 0x2000			// bit number of SWCLK

#define set_io_bit(a,b) *(__IO uint32_t *)a |= b
#define reset_io_bit(a,b) *(__IO uint32_t *)a &= (~b)

set_io_bit(EXTI_FTSR,SWCLK_BIT);		// set SWCLK Falling
reset_io_bit(EXTI_RTSR,SWCLK_BIT);

-----------

set_io_bit(EXTI_RTSR,SWCLK_BIT);		// set SWCLK Rising
reset_io_bit(EXTI_FTSR,SWCLK_BIT);

2) EUART送信をUSB・VPCに変更
・STM32CubeMXでUSBクロックを48MHzに設定しライブラリを導入する
 Middleware USB_DEVICEで Communication Device Class (Virtual Port Com)を選ぶ
・printf を USB・VPC にリダイレクトする
 どこかに下記関数を追記すると printf の結果が USB・VCP に出力される

int _write(int file, char *ptr, int len) {
    static uint8_t rc = USBD_OK;

    do {
        rc = CDC_Transmit_FS(ptr, len);
    } while (USBD_BUSY == rc);

    if (USBD_FAIL == rc) {
        /// NOTE: Should never reach here.
        /// TODO: Handle this error.
        return 0;
    }
    return len;
}

こちらのコードを使わせていただきました

github.com

こちらのページやネットでは VCP:Virtual COM Port となっていますが STマイクロは VPC:Virtual Port Com を使っています
機能は同じですがVCPに対してVPCは広義ではないかと思います

 

動作例

IDCODE:  2BA01477
E0042000:000FA410
1FFFF7E0:FFFF0040
E00FFFD0:00000004
E00FFFE0:000000C3
E00FFFE4:000000B4
E00FFFE8:0000000B

DBGMCU_IDCODE:            000FA410
Flash memory size:        0040
4KB count:                00
JEP 106 continuation code:04
Part Number:              4C3
JEP 106 ID code:          3B

 

4.MINI ST-LINK V2への書込み
・リードプロテクトされているのでopenOCDでunlockする
・クローンチップが実装されていたので以前書いたCPUTAPIDを変更したcfgファイル stm32f11.cfg を使う

openocd -f interface/stlink-v2.cfg -f target/stm32f11.cfg -c 'init; reset halt; stm32f1x unlock 0; reset run; shutdown’

5.動作状況と参考資料等
1)openOCDによる書き込み
 PIC16F版とクロック周波数も含め同じ 

2)コード変換時のSWCLK クロック周波数:240kHz
 インストラクションサイクル PIC16F 8MHz -> STM32F103 72MHz(3段パイプライン)でPIC16FのSWCLKが25kHzのため妥当なパフォーマンス

 HALライブラリがあまりに遅くLLライブラリは試していないので参考として

y2kblog.seesaa.net

 

qiita.com

3)USB・VCPによるコンバータ処理への影響
・それぞれ単独で動作させていればコンバーターの処理速度に影響はない
・ USB・VPC処理終了後リセットなしでコンバーター処理をしても影響なし

4)リードプロテクト
 MINI ST-LINK V2はunlockできるモードに設定されていてunlockすると書き込まれているコードは消えてしまうようです

stackoverflow.com

qiita.com

おしまい