CH32の開発環境についてのおすすめ

投稿者: | 9月 15, 2024

はじめに

CH32V003J4M6やCH32X035F7P6を使ったりしているのですが、おすすめの開発環境があるので、それの紹介です。

一般的に使用される開発環境

MounRiver Studio

公式の出してるIDEです。問題点としては、Windowsにしかインストールできないうえに、容量が大きいです。

Arduino

公式がCoreを出してます。しかし、完成度が非常に低くて、ADCすら使用できないといった体たらくです。

ch32v003fan

有志が開発した開発環境ですが、直接レジスタを操作化する感じで、データシートを熟読しないといけなく、面倒です。

おすすめ
wagiminator氏の開発ボード付属のソフトウェア

wagiminator/Development-Board

wagiminator氏が作成している開発ボードのレポジトリに付属してくるコードたちです。大体必要なペリフェラルは使えます。ch32v003fanと似た感じで、マクロベースのコードですが、より抽象化されているので使い勝手がいいです。サンプルコードが豊富なのもいいです。
更に、ch32v003fanをベースにしているようで、開発環境を整えるのもch32v003fanと同じくらい簡単です。

実際に、
USB PD PPSを使用した小型可変電源「mini PD-PPS VariablePowerSupply」
に、これを使いました。

CH32X035ではUSB PDが使える

ちゃんとCH32X035用のボードのサンプルプログラムにはUSB PD用のコードもあって、PPSも使用できます。

CH32V003でUSBが使える!!!

謎の技術でCH32V003J4M6のUSBデバイスとして使えます。

wagiminator/CH32V003-Mouse-Wiggler
wagiminator/CH32V003-USB-Knob
wagiminator/CH32V003-USB-Joystick

とかで実際に使ってます。40円のマイコンでUSBがつけるのはすごい!

cnlohr/rv003usb

を移植したものだと思われます。

比較

blink(Lチカ)で比較してみます。

wagiminator氏

#include <config.h>         // user configurations
#include <system.h>         // system functions
#include <gpio.h>           // GPIO functions

#define PIN_LED   PC0       // define LED pin

int main(void) {
  // Setup
  PIN_output(PIN_LED);      // set LED pin as output
  
  // Loop
  while(1) {
    PIN_toggle(PIN_LED);    // toggle LED on/off
    DLY_ms(100);            // wait 100ms
  }
}

MounRiver Studio

#include "debug.h"

void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOC, &GPIO_InitStructure);
}
int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    GPIO_Toggle_INIT();

    while(1)
    {
        Delay_Ms(100);
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_SET);
        Delay_Ms(100);
        GPIO_WriteBit(GPIOC, GPIO_Pin_1, Bit_RESET);
    }
}

Arduino

#define PIN_LED PC0

void setup() {
  // initialize digital pin LED_BUILTIN as an output.
  pinMode(PIN_LED, OUTPUT);
}

void loop() {
  digitalWrite(PIN_LED, HIGH);  // turn the LED on (HIGH is the voltage level)
  delay(1000);                      // wait for a second
  digitalWrite(PIN_LED, LOW);   // turn the LED off by making the voltage LOW
  delay(1000);                      // wait for a second
}

ch32v003fun

#include "ch32v003fun.h"
#include <stdio.h>

int main()
{
	SystemInit();

	// Enable GPIOs
	funGpioInitAll();
	
	funPinMode( PC0, GPIO_Speed_10MHz | GPIO_CNF_OUT_PP );

	while(1)
	{
		funDigitalWrite( PC0, FUN_HIGH );
		Delay_Ms( 250 );
		funDigitalWrite( PC0, FUN_LOW );
		Delay_Ms( 250 );
	}
}

おわりに

SDKとしてまとめてくれてるとありがたいなぁ
便利なのでぜひ使ってみましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)