備忘録的な記事になります。
CH32V003の8ピンパッケージのJ4M6品をいろいろなところで使っています。
ピン数に限りがあるのでいろいろ苦労する部分は多いのですが、最近3番ピンのPA2/OSCO/A0…ピンで起きた問題に対処しましたので、情報共有的に備忘録に残しておきます。
![](http://www.takishita.jp/toy_hospital/wp-content/uploads/2024/07/pinout.jpg)
事の次第は、ADCの0chであるA0でAD変換をしたかったのですが、0chで変換できないという事態でした。他の汎用ピンと共用もされているA7/A5/A2などは、無事変換確認できたのですが、A0が何故か変換できません。
というか、Analog input設定しているにもかかわらず、パルス波形が該当ピンから出力されます。もちろんですが、以下の設定は繰り返し確認しています。
- GPIO設定
- GPIOクロック設定
- PLL設定
- ADCチャンネル設定
同じ設定でもA0で変換できません。
ADC関係の記事ではありませんが、同じような不具合に遭遇した記事をインターネットで見つけました。※助かりました。
当該記事は、汎用IOとして使えないという記事でしたが、同じような問題そうだったので読んでみると、原因は同じでした。
リンクの記事は、内部発振モードで使用しているにも外部発振の設定がなされてしまいPA1/PA2が汎用ピンとして使えないということです。
強制的に外部発振の設定にされているという事態でした。
![](http://www.takishita.jp/toy_hospital/wp-content/uploads/2024/07/afio.jpg)
問題設定は、AFIO_PCFR1レジスタにあります。
各ペリフェラルモジュールのピンと汎用ピンの共用ピンの機能の切替設定になっています。
15ビット目にPA12_RMの設定ビットがあります。
![](http://www.takishita.jp/toy_hospital/wp-content/uploads/2024/07/afio_pa12.jpg)
デフォルト設定では、汎用IOと共有機能側の0になっています。
因みに、1は、外部発振モード用のピンなので、OSCO設定になります。
確認のため、PA12_RMを読みだしてみると、見事に1になっています。
内部発振しか設定しているにもかかわらず、なぜこの設定が1になっているかです。
設定していないのになぜか1になっています。
前述の記事を参照すると、system_ch32v00x.c内での設定に問題があるそうです。
前述のリンク記事と同じ内容になってしまうのですが、、、。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
//#define SYSCLK_FREQ_8MHz_HSI 8000000 //#define SYSCLK_FREQ_24MHZ_HSI HSI_VALUE //#define SYSCLK_FREQ_48MHZ_HSI 48000000 //#define SYSCLK_FREQ_8MHz_HSE 8000000 //#define SYSCLK_FREQ_24MHz_HSE HSE_VALUE #define SYSCLK_FREQ_48MHz_HSE 48000000 ... #elif defined SYSCLK_FREQ_48MHz_HSE /********************************************************************* * @fn SetSysClockTo_48MHz_HSE * * @brief Sets System clock frequency to 72MHz and configure HCLK, PCLK2 and PCLK1 prescalers. * * @return none */ static void SetSysClockTo_48MHz_HSE(void) { __IO uint32_t StartUpCounter = 0, HSEStatus = 0; /* Close PA0-PA1 GPIO function */ RCC->APB2PCENR |= RCC_AFIOEN; AFIO->PCFR1 |= (1<<15); <---ここ! RCC->CTLR |= ((uint32_t)RCC_HSEON); ... |
詳しくは、前述のリンク記事にありますが、system_ch32v00x.c内では外部クロックモード設定になっていますが、外部発振回路を実装していないので、発振ロックせず処理がタイムアウトし外部クロックの設定が残ったまま設定が進行してしまうという顛末でした。
おやおや(´・_・`)
自分は、Arduino IDE環境で開発をしており、前述の記事は問題にならないと記述されておりますが、ツールはArduino IDEを使用はしておりますが、コードは非Arduinoで実装していますのでこの問題が生じました。WCHのMounRiver Studioの自動生成された初期化コードと同じ問題が生じると思います。
“#define SYSCLK_FREQ_48MHZ_HSI 48000000”を有効にしてあげれば解決できます。