RISC-V/32 Longan-nanoボードのTOPPERS BASE PLATFORM対応


#Longan-nanoボードについて

Longan-nanoボードはSipeed社が販売するRISC-Vボードである。SoCコアはGigaDevice社のGD32VF103(RISC-V RV32IMAC)を使用しています。割込みはRISC-Vに拡張して、独自のベクター割込みが可能な割込み機構を追加している。価格は非常に安価で秋月電子から830円で購入できるにもかかわらず。160x80のカラーLCDとSPI対応のSDカードソケットを持ちます。
対応のデバイスは以下の通り。
・Chip built in 128KB Flash, 32KB SRAM
・4 x general purpose 16 bit timer, 2 x basic 16 bit timer, 1 x advanced 16 bit timer
・Watchdog, RTC, Systick
・3 x USART, 2 x I2C, 3 x SPI, 2 x I2S, 2 x CAN, 1 x USBFS (OTG)
・2 x ADC (10 channel), 2 x DAC
但し、USBFS-OTGは、デバイスピンのみ対応しHOSTとしては使用できません。
![IMG_20201021_153411.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961086/9968e642-dde7-ec19-ef99-5beb05c9f4a4.jpeg)
写りが悪くて申し訳ありません。

#Longan-nanoボードのASPカーネル対応

リリース日は11月2日となってますが、11月21日にLongan-nanoボードの対応を行ったASPカーネルの個別パッケージを、一般公開しました。（以下のURL）

https://www.toppers.jp/asp-d-download.html

この個別パッケージには、Longan-nanoボード対応以外、以下の修正を行っています。
　・idataからdataへの不要なコピーをやめる(K210のみ)
　・logtaskのスタックサイズを2048に指定(K210のみ)
　・割込み優先度を-15から-1に変更
　・HI-FIVE1 REV-Bの対応(HI-FIVE1のみ)
　・.dataセクションに.sdataセクションを追加
HI-FIVE1のREV-Bの対応では、make時、BOARDNO=0と設定するとRev.Aのコードを生成し、BOARDNO=1と設定すると、Rev.Bのコードを生成します。HI-FIVE1はSRAMのサイズが16KBしかないので、configureでsample1のビルド環境を設定する場合はSTACK_SIZEの設定を1.5KB位に設定しなおしてください。
Longan-nanoのプログラムの書き込みは、GigaDevice社のGD32 MCU Dfu Toolを使用しました。このツールは、HEXファイルの書き込みになりますので、configureでsample1環境を作る場合、elfファイルからhexファイルを生成してください。
Longan-nanoのシステムクロックは108MHzとしていますが、USBFS-OTGのクロックが48MHzなので、このクロックをシステムクロックから分周して生成する必要があります。USBクロックの分周比が0.5の倍数しか設定できないため、USBFS-OTGを動かすためにシステムクロックを24MHzの倍数に設定する必要があります。そのためLongan-nanoのシステムクロックをコンパイル設定で可変にできるようにしました。
コンパイルスイッチCKPLLMULを以下の設定に定義するとシステムクロックを変更できます。

/*
 *  PLL clock multiplication factor
 */
RCU_PLL_MUL2            PLL source clock multiply by 2
RCU_PLL_MUL3            PLL source clock multiply by 3
RCU_PLL_MUL4            PLL source clock multiply by 4
RCU_PLL_MUL5            PLL source clock multiply by 5
RCU_PLL_MUL6            PLL source clock multiply by 6
RCU_PLL_MUL7            PLL source clock multiply by 7
RCU_PLL_MUL8            PLL source clock multiply by 8
RCU_PLL_MUL9            PLL source clock multiply by 9
RCU_PLL_MUL10           PLL source clock multiply by 10
RCU_PLL_MUL11           PLL source clock multiply by 11
RCU_PLL_MUL12           PLL source clock multiply by 12
RCU_PLL_MUL13           PLL source clock multiply by 13
RCU_PLL_MUL14           PLL source clock multiply by 14
RCU_PLL_MUL6_5          PLL source clock multiply by 6.5
RCU_PLL_MUL16           PLL source clock multiply by 16
RCU_PLL_MUL17           PLL source clock multiply by 17
RCU_PLL_MUL18           PLL source clock multiply by 18
RCU_PLL_MUL19           PLL source clock multiply by 19
RCU_PLL_MUL20           PLL source clock multiply by 20
RCU_PLL_MUL21           PLL source clock multiply by 21
RCU_PLL_MUL22           PLL source clock multiply by 22
RCU_PLL_MUL23           PLL source clock multiply by 23
RCU_PLL_MUL24           PLL source clock multiply by 24
RCU_PLL_MUL25           PLL source clock multiply by 25
RCU_PLL_MUL26           PLL source clock multiply by 26
RCU_PLL_MUL27           PLL source clock multiply by 27
RCU_PLL_MUL28           PLL source clock multiply by 28
RCU_PLL_MUL29           PLL source clock multiply by 29
RCU_PLL_MUL30           PLL source clock multiply by 30
RCU_PLL_MUL31           PLL source clock multiply by 31
RCU_PLL_MUL32           PLL source clock multiply by 32

デフォルトはCKPLLMUL=RCU_PLL_MUL27で108MHzです。USBFS-OTGを使用する場合はCKPLLMUL=RCU_PLL_MUL24を設定しシステムクロックを96MHzにして分周比を2.0としてUSBクロック：48MHzを生成します。
UARTは写真のように、RX,TXピンからUSBシリアルのTX,RXピンとGNDを引き出しTeraTermで通信します。

#TOPPERS BASE PLATFORM対応

Longan-nanoに対応したTOPPERS BASE PLATFORM本体とリファレンス・マニュアルですが、会員向け早期リリースで2012年1月末を予定していましたが、順調に開発が進み今年のクリスマス前にV0.1.4としてリリースしました。

https://www.toppers.jp/members.html#early

サンプル・プログラムとして以下の４つを用意しました。
・DEMO:LCDの文字、グラフィック表示、SDカードのFATファイルシステム対応、RTCの時刻表示
　添付のTeraTermの表示の通り、volumeコマンドのディレクトリ表示や
　DeviceコマンドのRTC設定、LEDの点灯等ができます
　flash-romが128KBしかなく、FAT long name用UNICODEテーブルを設定できす
　ディレクトリ表示がshort nameとなっています
・I2C:秋月AQM0802、ADT7410、EEPROMをI2C(SCL:PB6,SDA:PB7)に接続してLCD表示、温度取得、EEPROMの読み書きができるプログラム
・ADC:秋月のアナログジョイスティックをADC-CH0:PA0とADC-CH4:PA4に接続してジョイスティックの位置を表示するプログラム
・MON:sample1をタスクモニタ上で実行するプログラム
　deviceコマンドでLEDの点灯やRTCの設定ができます
　USER-SWをPA3に接続して、SWの割込み確認ができます。
　　　　　　　===(SW)
　PA3(IN) ---+-+  　+---- GND
　　　　　　|
　　　　　10KΩ
　　　　　　|
　　　　　3.3V

![IMG_20201218_095348.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961086/c5879ee8-fb24-48f6-02b7-d514816f19db.jpeg)
DEMOを実行中

![demo.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/961086/d65016d0-036d-f805-a898-10e395b20715.png)
DEMO実行中のタスクモニタの表示、volumeコマンドでSDカードのディレクトリを表示する

SPIの参考プログラムについて、３つのSPIはSPI0がLCD、SPI1がSDカードソケットにボード上で結線されています。DEMOのソースを見れば使い方がわかります。
USB-DEVICEについて、サンプル・プログラムとしては用意しませんでした。
USBFS-OTGはSTマイクロエレクトロニクス社のUSB-OTGデバイスとほぼ同じです。STM32F446NUCLEO_GCC/USBOをデバイス用に改造すればテストができます。
MakefileのUSB OTGのモードをDEVICEに(USB_OTG_MODE = USB_OTG_MODE_DEVICE)変更、システムクロックを96MHzに(CDEFS := $(CDEFS) -DCKPLLMUL=RCU_PLL_MUL24)変更。

なお、通常TIMER、I2S、CAN、DACのドライバは作成していません。
また、詳細な仕様は「TOPPERS BASE PLATFORM V0.1.4 Reference Manual(RV) 201218」を参照してください。