高速 Lチカ 対決  その二

# はじめに

前回、[ArudinoボードでノーウエイトのLチカの周波数を測定した](https://qiita.com/nak435/items/63873ef4e6031a880c78)。今回はその続きで、次のボードで対決する。

# ボード（chip）

対決に使用したボード（chip）は、次の2つ。

- [CH32V203](https://qiita.com/nak435/items/c018bf464d29ecea3246) HSI144MHz（PlatformIO環境）

- RP2040 (Raspberry pi pico) 133MHz（pico-sdk環境）

# Lチカプログラム

対決に使用したプログラムは、次のとおり。

## CH32V203（PlatformIO環境）

```c:GPIO_WriteBit方式
#include "debug.h"
void GPIO_Toggle_INIT(void)
{
    GPIO_InitTypeDef GPIO_InitStructure = {0};

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

int main(void)
{
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();

    GPIO_Toggle_INIT();

    while(1)
    {
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_SET);
        GPIO_WriteBit(GPIOA, GPIO_Pin_0, Bit_RESET);
    }
}
```


```c:レジスタ方式
    while(1)
    {
        GPIOA->OUTDR = GPIOA->OUTDR | GPIO_Pin_0;
        GPIOA->OUTDR = GPIOA->OUTDR & ~GPIO_Pin_0;
    }
```

## RP2040 (Raspberry pi pico)（pico-sdk環境）

```c
#include "pico/stdlib.h"

const uint LED_PIN = 6; //GP6

int main() {
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    while (true) {
        gpio_put(LED_PIN, 1);
        // sleep_us(1);
        gpio_put(LED_PIN, 0);
        // sleep_us(1);
    }
}
```

↑このコードは、実効電圧が低いためか、LEDが点かない。
しかし、1μ秒とかウエイトを入れると、極端に周波数が落ちるため、gpio_putを10繰り返すことでLEDを点灯させた。

```c
    while (true) {
        gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
          gpio_put(LED_PIN, 1);
        gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
          gpio_put(LED_PIN, 0);
    }
```


# 結果

|#|ボード|Lチカ周波数|備考|
|:-:|:-|-:|:-|
|1|CH32V203|4.36MHz |GPIO_WriteBit方式|
|1|CH32V203|10.29MHz |レジスタ方式|
|2|RP2040|31.25MHz |ただし、LED点かない|
|2|RP2040|10.42MHz |gpio_put 10回|

- ↓CH32V203（GPIO_WriteBit方式）
![data_9687_4.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/7b2329d7-fb3b-6eef-ba8c-dfd90b0631c4.png)


- ↓CH32V203（レジスタ方式）
![data_6208_10.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/57696f7b-58ce-7657-58b9-81be21927b1a.png)


- ↓RP2040（LED点かない）
![data_38200_pico-X.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/311307f5-01f7-16f6-54d8-dc95b29bb3d7.png)



- ↓RP2040（gpio_put 10回）
![data_172000_pico_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/283293/8bddb4f6-6961-1ecc-382e-48c68ba484df.png)


# まとめ

さすがCH32V203のRISC-Vプロセッサは高速ですね。

RP2040のノーウエイトは、周波数こそ30MHz超えの超高速ですが、LEDを光らせるだけの電圧が足りません。ここはLチカ対決の場であるので、LEDが光らないのでは、論外という結果。
gpio_putを10繰り返すとLEDは点き、周波数も10MHzと十分速い。
（5回では点きませんでした）

_なぜ電圧が足りていないのか、原因や対策をご存の方がいらしたら、ぜひ教えてください。_


**おしまい**