こんにちは、shuji4649です。
STM32のクロック用のピンをGPIOとして使用しようとしたときに少し詰まったので簡単な記事ですが書き残しておこうと思います。
この記事は Tuton Advent Calender 2025 の4日目の記事です。
問題
STM32F103C8T6で検証したのでSTM32F103C8T6をここでは例に挙げますが、他のSTM32F1マイコンでも共通することだと思います。
STM32F103C8T6のPD0、PD1ピンは本来以下のように外部クロック用のピンですが、外部クロックを使用しない場合はGPIOとして使用することができます。
| pin | function |
|---|---|
| PD0 | OSC_IN |
| PD1 | OSC_OUT |
参考:https://www.st.com/resource/en/datasheet/stm32f103c8.pdf
PlatformIOを使ってArduinoフレームワークでプログラムを書いていたのですが、そのままだとGPIOとして使用できず困りました。
解決策
以下のような1行を書くとPD0とPD1をリマップできます。
AFIO->MAPR |= AFIO_MAPR_PD01_REMAP;
AFIO->MAPRのレジスタにPD01のリマップビットをセットしているイメージです。
OR演算なのはAFIO-MAPRに他リマップ設定も含まれているためです。
おわりに
ピンが余っているのであれば特殊なピンは避けて一般的なものを使うのがよさそうですね。