2026年2月24日火曜日

CH32V003マイコン3 制御学習のためのプログラミング

制御対象の動作確認(LED)

 基板が完成したので、それぞれの制御対象が動作するかを確認します。プログラムはスケッチの例の「Blink」を基にしています。ポート番号の定義を変えて動作を確認します。

 setup内の4行目から7行目に記述しているところがリセットボタンを「シームレス動作」させるための追加プログラムです。

#define LED   8

void setup() {
  // RESET button シームレススイッチ
  if (FLASH->STATR & (1 << 14)) NVIC_SystemReset();
  SystemReset_StartMode(Start_Mode_BOOT);
  pinMode(PD4, OUTPUT);
  //ポート初期化
  pinMode(LED, OUTPUT);
}

void loop() {
  digitalWrite(LED, 1); 
  delay(100);
  digitalWrite(LED, 0);
  delay(100);
}
 プログラムの書き込みが完了したら、リセットボタンで、実行が始まります。
(もう一度リセットボタンを押すとブートモードになり、書き込み可能となります)

トラブル1 ポート番号「11」が動かない

 UIAPduinoのポート番号「11」は、マイコンの「PD1」に接続されています。
この端子は、CH32Vマイコンへのプログラム書き込み装置「WCH-LinkEエミュレータ」を利用して書き込むときの接続端子「SWIO」となっています。この機能が働いているために、GPIOとして利用できません。少し検索すると、CH32VマイコンのマニュアルにGPIOにするレジスタ設定がありました。
 リセットボタンのシームレス化と同様に、レジスタの設定で、GPIOとして利用する設定は必要です。
void setup() {
  // RESET button シームレススイッチ
  if (FLASH->STATR & (1 << 14)) NVIC_SystemReset();
  SystemReset_StartMode(Start_Mode_BOOT);
  pinMode(PD4, OUTPUT);

  // PD1をGPIOとして利用する設定
  // function SWIO off
  // Enable GPIOs
  RCC->APB2PCENR |= RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOC | RCC_AFIOEN;
  // Convert PD1 from SWIO to GPIO
  AFIO->PCFR1 &= ~(AFIO_PCFR1_SWJ_CFG);
  AFIO->PCFR1 |= AFIO_PCFR1_SWJ_CFG_DISABLE;

}
 7行目から13行目の「PD1をGPIOとして利用する設定」を追加すると、ポート11として利用できるようになりました。

UIAPサポート

 同じ症状で困っていた方がUIAPからサポートを受けていた記事を見ました。
もっと簡単にポート11をGPIOにする関数「pinV32_DisconnectDebug」があるようです。
void setup() {
  // RESET button シームレススイッチ
  if (FLASH->STATR & (1 << 14)) NVIC_SystemReset();
  SystemReset_StartMode(Start_Mode_BOOT);
  pinMode(PD4, OUTPUT);

  // PD1をGPIOとして利用する設定
  pinV32_DisconnectDebug(PD_1); // Disable SWIO (the argument is not "PD1")

}
 この関数を利用しても動作させることができました。


制御対象の動作確認(スイッチ・ブザー)

 スイッチとブザーの動作確認プログラムです。
#define LED   8
#define SW    12
#define BUZ   5

void setup() {
  // RESET button シームレススイッチ
  if (FLASH->STATR & (1 << 14)) NVIC_SystemReset();
  SystemReset_StartMode(Start_Mode_BOOT);
  pinMode(PD4, OUTPUT);
  //ポート初期化
  pinMode(LED, OUTPUT);
  pinMode(BUZ, OUTPUT);
  pinMode(SW, INPUT_PULLUP);
}

void loop() {
  if(digitalRead(SW)==0){
    tone(BUZ,880,100);
    digitalWrite(LED, 1); delay(100);
    digitalWrite(LED, 0); delay(100);
  }
}
 3行目のスイッチのポート番号を変えて、動作を確認します。
 これで、制御対象となるI/Oの動作が確認できました。

 同時に、7セグメントLEDに出力すると、右図のように数字を表示できるようになります。

0 件のコメント:

コメントを投稿

LEDマトリックス表示装置の設計・製作 9(画像表示)

  LEDマトリックスに画像を表示させるには、いろいろな画像形式を知る必要があります。現在、よく使われるJPG形式やPNG形式は圧縮処理されて保存されています。これに対して、BMP形式やTIFF形式は非圧縮形式で、画像データがそのまま保存されています。このため、ファイルは大きくな...