segunda-feira, novembro 27, 2023

Mini Avaliação: WeAct Studio BluePill Plus (uma Bluepill com RISC-V)

Mais uma placa da WeAct Studio chamou a minha atenção. Desta vez foi uma placa com o mesmo formato e pinagem que a (mais ou menos) conhecida Bluepill, porém com um microcontrolador RISC-V ao invés de um STM32 (ARM).

Neste post vou falar das características da placa e da minhas desventuras até o momento.

Bluepill?

Embora já façam 2 anos e meio que eu comprei essa placa (e sua irmã maior, a Blackpill), reparei agora que não fiz nenhum post a respeito dela. Vai aqui um resumo rápido.

A Bluepill é um projeto cuja origem não conheço, mas que é produzido por várias empresas chinesas. Basicamente é uma plaquinha (normalmente azul) com um formato de Arduino Nano alongado, contendo um microcontrolador STM32F103C8T6. Em muitos casos, ao invés de um STM32F original temos um clone. O chip no meu exemplar é oficialmente falso, tem um documento da ST afirmando que nunca fez um chip com estas marcações!


Problemas com chips não originais à parte, a Bluepill é uma placa bem poderosa. O STM32F103 é um ARM Cortex M3, rodando a 72MHz, possui 64K Flash, 20K de RAM, uma boa quantidade dos periféricos tracionais (2 ADCs de 12 bits, 2 I2Cs, 3 UARTs 2 SPI) e USB 2.0.

A BluePillPlus

Como dito, a BluePillPlus segue o formato e a pinagem da Bluepill original. A placa inclui um LED ligado a um GPIO e três botões (Reset, Boot e User). O conector USB é USB-C.

O microcontrolador é o CH32V203C8T6 da WCH. A WCH é mais conhecida pelo chips de interface serial USB, como o CH340, porém também fabrica uma linha de chips compatíveis com a linha STM32 (os microcontroladores CH32F). Ao partir para o RISC-V, a WCH adotou para os chips as pinagens e características dos STM / CH32F.

Do ponto de vista de hardware, não tem muito o que falar. Além do núcleo ser RISC-V, o clock é o dobro: 144 MHz (já veremos que isso não implica no dobro do desempenho). As memórias e os periféricos são equivalentes. A placa em si é bem feita e junto com ela vieram os pinos (inclusive para conexão do programador).

O preço é excelente. No momento está em torno de R$8,50 na AliExpress (não contando o frete e a parte do Haddad).


Programando a BluePillPlus - Testes

Aqui as coisas complicam um pouco. A referência básica é o github da WeActStudio. O ambiente oficial de desenvolvimento da WCH é o MounRiverStudio (MRS). Nas brincadeiras com o CH32V003 eu evitei ele, usando o CH32V003fun. Aqui não teve jeito, eu instalei o MRS em um Linux num máquina virtualizada.

A carga de software nos CH32V usada pelo MRS se baseia no programador WCHLink. Após diversas tentativas, acabei "bricando" o WCHLink (parece que não sou o único a conseguir esta façanha)*. Felizmente o CH32V203 tem também um bootloader via USB. Inicialmente eu usei um software "aberto" de programação no Linux (wch-isp), mas deu algo errado quando fui gravar um programa maior. O jeito foi usar a ferramenta oficial da WCH no Windows.

A ferramenta oficial é meio chatinha de usar para gravar. Primeiro você entra no modo bootloader (aperta o botão boot e mantém apertado enquanto aperta e solta o reset), aí você aciona o "deprotect" para permitir a gravação. Aí você entra de novo no bootloader e faz o "download".


O primeiro teste foi rodar o exemplo "01-template" que rodou ok (inclusive com o wch-isp). A propósito, o wch-isp quer um arquivo .bin e a saída do MRS é um .hex. A conversão pode ser feita com o objcopy:

objcopy -I ihex -O binary  xxx.hex xxx.bin

O segundo teste foi o meu programa de cálculo do Pi. Aqui alguns pontos curiosos:

  • O wch-isp dá erro ao verificar a gravação*
  • Com o "STM32", os tempos para calcular 500 dígitos foram 41 ms (otimizando por tamanho) e 36 ms (otimizando para velocidade). Aqui eu usei a IDE do Arduino e o pacote stm32duino.
  • Com o CH32V, a primeira medida de tempo foi 72ms. Aí eu descobri (meio que acidentalmente) que a escrita (printf) dos dígitos à medida que são calculados estava gastando bastante tempo. Tirando esta escrita, o tempo caiu para 23ms.
  • Você deve estar pensando: "e se tirar o print no STM32?". Bem eu testei e o resultado foi surpeendente: o tempo aumentou para 39 ms.
  • No código do exemplo no CH32V, o print envia os dados pela UART sem usar interrupção, portanto fica aguardando cada caracter ser enviado. Não ajuda também que a rotina é o printf, com todos os recursos e overheads de formatação. Já no stm32duino eu uso o Serial.Print que é bem mais "leve", usa interrupção e envia os dados pela USB nativa.
Um detalhe: o printf do exemplo usa a UART1 que é mapeada nos pinos PA9 (Tx) e PA10 (Rx). Eu liguei estes pinos a um conversor serial USB para ver a saída do programa no micro.

O terceiro teste foi a minha adaptação do benchmark Wetstone. Aqui tive logo de cara um percalço: por padrão a biblioteca de funções matemáticas não é linkada. É preciso colocar a opção "-lm" no comando de link, o que é feito em uma das várias telas de configuração do projeto.


O programa ficou com 63K, ocupando quase toda a Flash. Pior, não funcionou. Ele chega a executar a primeira volta no loop (em terríveis 20 segundos) e depois parece que trava em algum ponto.

* Atualização: o WCH-Link voltou a funcionar misteriosamente, consegui gravar firmwares na BluePillPlus tanto sob Windows como de dentro do MRS rodando no Linux. Vamos ver como se comporta.

Veredito

Do ponto de vista de hardware, A BluePill Plus é uma opção barata para quem quer brincar ou estudar o CH32V203. O problema é que ainda falta muita trabalho na parte de ferramentas e software.

Se você tem espírito de pioneiro é quer ajudar a desbravar este novo terreno, esta placa é para você. Se você que é usar a placa em um projeto, será muito mais suave usar um Bluepill normal.

* Atualização 09/12/23: O problema é a falta da operação "deprotect". Depois de fazer o "deprotect" com o aplicativo da WCH dá para usar o wch-isp sem problema (até que você grave um programa com um dos aplicativos da WCH que liga de novo a proteção). Preciso achar uma explicação desta proteção e ver se tem como desligá-la através do wch-isp.


Nenhum comentário: