Sipeed Longan NanoでFONTX2形式のフォントを利用する
12月半ばに腕を骨折してしまい、更新が滞っておりました。ようやくリハビリも進み、キーボードを打つのに支障がなくなってきたので、またぼちぼち書いていきたいと思います。本日は、先日に引き続き、Longan Nanoのネタです。
Longan NanoのLCD制御ライブラリを眺めていて、比較的簡単にオリジナルフォントの表示を行うことができそうに思えましたので、さっそく改造してみました。フォントデータとして、扱いやすく入手の容易なFONTX2形式に対応し、半角文字だけでなく漢字を含む全角文字の表示にも対応してみました。FONTX2のデータはサイズが大きいので、マイコンのフラッシュメモリではなくmicroSDカードに置きたいところですが、そのためにはFATファイルシステムへの対応が必要となります。幸いにもSipeed社のサンプルにはmicroSDカードから画像データを読み込んで表示するためにChaN様作のFatFsが組み込まれており、今回はこれを流用しました。ただ、Sipeed社の開発した低レベルI/Oのコード(tf_card.c 内の rcvr_spi_multi 関数)にバグがあり、そのままだとバッファオーバーランを起こして漢字フォントの表示に失敗するため、修正を行っています。最初はこの不具合に気づかず、自分の書いたコードを何度も見直して何日も無駄にしてしまいました…。今回は、日本語の文字列に対応するためUTF-8を利用できるようにしましましたが、みいちゃん様によるUTF8→UTF16の変換アルゴリズムと、FatFsに含まれるUTF16→JISへの変換関数(ffunicode.c)を改変して利用させていただきました。また、FONTX2データのアドレス計算を行う部分も、ChaN様のサイトで公開されているものを利用させていただきました。PlatformIO(GigaDevice GD32V SDK)用のライブラリとサンプルプログラムのソースコードはGitHubにて公開しています。
以下に、利用方法を書いておきます。
1. microSDカードにFONTX2のフォントデータを保存します。
2. include/lcd/lcd.h を編集し設定を行います。FONTX2関連(+α)の設定は以下の部分で行います。
USE_FONTX2 でFONTX2を使用するかどうかを指定します。設定値は以下のとおりです。
0:FONTX2を使用せず、oledfont.h で定義されたフォントのみを使用します
1:2バイト文字のみFONTX2を使用し、1バイト文字はoledfont.h で定義されたフォントを使用します
2:1バイト文字、2バイト文字ともFONTX2を使用します
FONTX2を使用する場合には、1バイト文字フォントのファイル名を LCD_AFONT で、2バイト文字フォントのファイル名を LCD_KFONT で指定します。
LCD_ASPACE, LCD_KSPACE で、FONTX2フォントで文字列表示を行う場合の水平方向の文字間隔(右側のスペーシング)をドット数で指定できます。また、FONT_HEIGHT で、文字列表示の際の自動改行時の1行の高さを指定できます。
USE_UTF8STR を定義すると文字列表示を行う際に日本語の文字列(UTF-8)を使用できますが、その場合にはUnicodeからShift JISへの変換テーブルが組み込まれるためコードサイズが大きくなります。
FONTX2_USELED を定義するとオンボードLEDでステータス表示を行います。フォントデータの読み込みエラー時に赤、SDカードへのアクセス中は緑に点灯します(主にデバッグ用です)。
LCD_COMPAT は、Sipeed社提供のオリジナルライブラリと互換性のある関数名を使用する場合に定義します。というのも、オリジナルのライブラリのほとんどの関数は“LCD_”から始まるのですが、LCD初期化関数 Lcd_Init と、円を描画する Draw_Circle だけが例外となっており統一感がなかったため、今回作成したものではそれぞれ LCD_Init, LCD_DrawCircle に改名しました。ただ、そのままだとこれまで開発したプログラムが動作しなくなるため、この定数を定義することによって旧関数名でも利用できるようにしています。
3. include/lcd/fontx2.h で扱うフォントの1文字当たりのデータサイズを指定します。
4. サンプルの main.c と同様に、lcd.h をインクルードします。
以上の手順でOKです。以下に簡単に関数のリファレンスを記しておきます。
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
unsigned char ankfont_width; :半角文字の横方向ドット数
lcd.c 関数 (低レベルI/O関数は除く):
void LCD_Init(void); ( = Lcd_Init )
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawCircle(u16 x0,u16 y0,u8 r,u16 color); ( = Draw_Circle )
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u16 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII/SJIS) mode = モード color = 描画色
※2バイト文字の場合はShift-JISコードを指定してください
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII/UTF8文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
void LCD_ShowHex(u16 x,u16 y,u16 num,u8 len,u16 color)
16進数を表示する
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
fontx2.c グローバル変数:
FH font[FONTX2_FONTNUM];
FONTX2ヘッダ読み込みバッファ
(FH は、FONTX2ヘッダ構造体)
uint8_t fontdata[FONTX2_FONTSIZE];
フォントパターン格納バッファ
fontx2.c 関数:
void fontx2_init( void );
FONTX2ライブラリを初期化する。
uint8_t fontx2_open( uint8_t fontnum, char* filename );
フォントファイルを開き、ヘッダを読み込む。
(指定したファイル名のフォントを、指定したフォント番号に割り当てる)
fontnum = フォント番号 filename = ファイル名へのポインタ
戻り値:正常終了で0, エラーのときエラーコード
void fontx2_close( uint8_t fontnum );
フォントファイルを閉じる。
(指定したフォント番号のフォントファイルを閉じ、使用を終了する)
fontnum = フォント番号
uint8_t fontx2_read( uint8_t* buffer, uint8_t fontnum, uint16_t charcode );
フォントデータを取得する。
buffer = 読み込むバッファへのポインタ fontnum = フォント番号 charcode = 文字コード
戻り値:正常終了で0, エラーのときエラーコード
fontx2.c 関数戻り値(エラーコード)一覧:
FONTX2_OK : 正常終了(0)
FONTX2_ERR_OPEN : フォントファイルオープンエラー(1)
FONTX2_ERR_RHD : フォントヘッダリードエラー(2)
FONTX2_ERR_RCB : コードブロックリードエラー(3)
FONTX2_ERR_FNO : フォント番号不正(4)
FONTX2_ERR_UNDEF : 未定義の文字コード(5)
FONTX2_ERR_FSIZE : 未対応フォント(1文字当たりのデータサイズがFONTX2_FONTSIZEより大きい)(6)
FONTX2_ERR_FSEEK : フォントデータシークエラー(32 + f_lseek 関数の終了コード)
FONTX2_ERR_FREAD : フォントデータリードエラー(64 + f_read 関数の終了コード)
FONTX2_ERR_TRUNC : フォントデータリードエラー(128 + 読み込めたバイト数)
最後に実行例の写真を載せておきます。

Longan Nanoで日本語の表示が可能になると、かなり実用的ですね。好みのフォントも使えますので、表現の幅も広がります。急ごしらえで作成したライブラリなので処理速度などの点で最適化することはまだまだできると思いますが、興味のある方は使用してみていただければと思います。
Longan NanoのLCD制御ライブラリを眺めていて、比較的簡単にオリジナルフォントの表示を行うことができそうに思えましたので、さっそく改造してみました。フォントデータとして、扱いやすく入手の容易なFONTX2形式に対応し、半角文字だけでなく漢字を含む全角文字の表示にも対応してみました。FONTX2のデータはサイズが大きいので、マイコンのフラッシュメモリではなくmicroSDカードに置きたいところですが、そのためにはFATファイルシステムへの対応が必要となります。幸いにもSipeed社のサンプルにはmicroSDカードから画像データを読み込んで表示するためにChaN様作のFatFsが組み込まれており、今回はこれを流用しました。ただ、Sipeed社の開発した低レベルI/Oのコード(tf_card.c 内の rcvr_spi_multi 関数)にバグがあり、そのままだとバッファオーバーランを起こして漢字フォントの表示に失敗するため、修正を行っています。最初はこの不具合に気づかず、自分の書いたコードを何度も見直して何日も無駄にしてしまいました…。今回は、日本語の文字列に対応するためUTF-8を利用できるようにしましましたが、みいちゃん様によるUTF8→UTF16の変換アルゴリズムと、FatFsに含まれるUTF16→JISへの変換関数(ffunicode.c)を改変して利用させていただきました。また、FONTX2データのアドレス計算を行う部分も、ChaN様のサイトで公開されているものを利用させていただきました。PlatformIO(GigaDevice GD32V SDK)用のライブラリとサンプルプログラムのソースコードはGitHubにて公開しています。
以下に、利用方法を書いておきます。
1. microSDカードにFONTX2のフォントデータを保存します。
2. include/lcd/lcd.h を編集し設定を行います。FONTX2関連(+α)の設定は以下の部分で行います。
#define USE_FONTX2 2 // FONTX2の設定(0:不使用 1:2バイト文字のみ 2:1バイト文字も)
#define LCD_AFONT "PAW16A.FNT" // 1バイトフォントファイル名(ぱうフォント半角)
#define LCD_KFONT "PAW16K.FNT" // 2バイトフォントファイル名(ぱうフォント全角)
#define LCD_ASPACE 0 // FONTX2 1バイトフォントの横方向スペーシング
#define LCD_KSPACE 0 // FONTX2 2バイトフォントの横方向スペーシング
#define FONT_HEIGHT 17 // 自動改行時の1行の高さ
#define USE_UTF8STR // UTF-8の文字列を扱う場合に定義
#define FONTX2_USELED // LEDをステータス表示に使用する場合に定義
#define LCD_COMPAT // 関数名の互換性指定
USE_FONTX2 でFONTX2を使用するかどうかを指定します。設定値は以下のとおりです。
0:FONTX2を使用せず、oledfont.h で定義されたフォントのみを使用します
1:2バイト文字のみFONTX2を使用し、1バイト文字はoledfont.h で定義されたフォントを使用します
2:1バイト文字、2バイト文字ともFONTX2を使用します
FONTX2を使用する場合には、1バイト文字フォントのファイル名を LCD_AFONT で、2バイト文字フォントのファイル名を LCD_KFONT で指定します。
LCD_ASPACE, LCD_KSPACE で、FONTX2フォントで文字列表示を行う場合の水平方向の文字間隔(右側のスペーシング)をドット数で指定できます。また、FONT_HEIGHT で、文字列表示の際の自動改行時の1行の高さを指定できます。
USE_UTF8STR を定義すると文字列表示を行う際に日本語の文字列(UTF-8)を使用できますが、その場合にはUnicodeからShift JISへの変換テーブルが組み込まれるためコードサイズが大きくなります。
FONTX2_USELED を定義するとオンボードLEDでステータス表示を行います。フォントデータの読み込みエラー時に赤、SDカードへのアクセス中は緑に点灯します(主にデバッグ用です)。
LCD_COMPAT は、Sipeed社提供のオリジナルライブラリと互換性のある関数名を使用する場合に定義します。というのも、オリジナルのライブラリのほとんどの関数は“LCD_”から始まるのですが、LCD初期化関数 Lcd_Init と、円を描画する Draw_Circle だけが例外となっており統一感がなかったため、今回作成したものではそれぞれ LCD_Init, LCD_DrawCircle に改名しました。ただ、そのままだとこれまで開発したプログラムが動作しなくなるため、この定数を定義することによって旧関数名でも利用できるようにしています。
3. include/lcd/fontx2.h で扱うフォントの1文字当たりのデータサイズを指定します。
#define FONTX2_FONTSIZE 72 // フォントデータの最大サイズ(24x24→72バイト)
4. サンプルの main.c と同様に、lcd.h をインクルードします。
以上の手順でOKです。以下に簡単に関数のリファレンスを記しておきます。
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
unsigned char ankfont_width; :半角文字の横方向ドット数
lcd.c 関数 (低レベルI/O関数は除く):
void LCD_Init(void); ( = Lcd_Init )
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawCircle(u16 x0,u16 y0,u8 r,u16 color); ( = Draw_Circle )
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u16 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII/SJIS) mode = モード color = 描画色
※2バイト文字の場合はShift-JISコードを指定してください
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII/UTF8文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
void LCD_ShowHex(u16 x,u16 y,u16 num,u8 len,u16 color)
16進数を表示する
x, y = 座標 num = 数値 len = 表示文字数 color = 描画色
fontx2.c グローバル変数:
FH font[FONTX2_FONTNUM];
FONTX2ヘッダ読み込みバッファ
(FH は、FONTX2ヘッダ構造体)
uint8_t fontdata[FONTX2_FONTSIZE];
フォントパターン格納バッファ
fontx2.c 関数:
void fontx2_init( void );
FONTX2ライブラリを初期化する。
uint8_t fontx2_open( uint8_t fontnum, char* filename );
フォントファイルを開き、ヘッダを読み込む。
(指定したファイル名のフォントを、指定したフォント番号に割り当てる)
fontnum = フォント番号 filename = ファイル名へのポインタ
戻り値:正常終了で0, エラーのときエラーコード
void fontx2_close( uint8_t fontnum );
フォントファイルを閉じる。
(指定したフォント番号のフォントファイルを閉じ、使用を終了する)
fontnum = フォント番号
uint8_t fontx2_read( uint8_t* buffer, uint8_t fontnum, uint16_t charcode );
フォントデータを取得する。
buffer = 読み込むバッファへのポインタ fontnum = フォント番号 charcode = 文字コード
戻り値:正常終了で0, エラーのときエラーコード
fontx2.c 関数戻り値(エラーコード)一覧:
FONTX2_OK : 正常終了(0)
FONTX2_ERR_OPEN : フォントファイルオープンエラー(1)
FONTX2_ERR_RHD : フォントヘッダリードエラー(2)
FONTX2_ERR_RCB : コードブロックリードエラー(3)
FONTX2_ERR_FNO : フォント番号不正(4)
FONTX2_ERR_UNDEF : 未定義の文字コード(5)
FONTX2_ERR_FSIZE : 未対応フォント(1文字当たりのデータサイズがFONTX2_FONTSIZEより大きい)(6)
FONTX2_ERR_FSEEK : フォントデータシークエラー(32 + f_lseek 関数の終了コード)
FONTX2_ERR_FREAD : フォントデータリードエラー(64 + f_read 関数の終了コード)
FONTX2_ERR_TRUNC : フォントデータリードエラー(128 + 読み込めたバイト数)
最後に実行例の写真を載せておきます。

Longan Nanoで日本語の表示が可能になると、かなり実用的ですね。好みのフォントも使えますので、表現の幅も広がります。急ごしらえで作成したライブラリなので処理速度などの点で最適化することはまだまだできると思いますが、興味のある方は使用してみていただければと思います。
スポンサーサイト
USB Blaster互換機でLongan Nanoのデバッグ環境構築
最近はATmegaはちょっとお休みしてLongan Nanoでいろいろ遊んでいますが、どうしても原因のわからないバグに遭遇し、デバッガを使いたいと思うことがありました。PlatformIOのページを見ると、USB Blasterが使えるとの記載がありますが、Intelの正規品はけっこういいお値段なので、Amazonなどで安価に売られている互換品をポチってみました。今回は“HuaChongChong”というセラーの物(Amazon発送)を購入しましたが、すでに扱いがなくなっているのか商品ページのリストからは消えていました。同じ商品に見えて、セラーごとに中身が微妙に違ったりする可能性があるのでわかりにくいですね。

この手の製品は、一見同じように見えても中身は様々なようで、今回購入したものはPIC18F14K50を搭載していました。これはおそらくOJIKA様のサイトで公開されているものと同様なもの(パクった?)だと思われますが、OJIKA様の開発されたものはCQ社のMAX10のキットに含まれているMAX10-JBのベースにもなっており、信頼性が高いものであると考えられます。いっぽう、他のマイコンが搭載されているものあるようで、その中にはうまく動作しなかったという報告が見られるものもありました。(写真は今回購入したものの内部。の左の石がPIC, 右の石はレベルコンバータと思われる74LVC244Aです。)

とりあえずきちんと認識されるかどうかのテスト、ということで、IntelのサイトからQuartus Primeをダウンロード、インストールしてみました。接続してみると自動的にデバイスドライバが組み込まれ、プログラマからも認識されているので、特に問題はなさそうです。

PlatformIOのデバッガはOpenOCDと呼ばれるものを使用していますが、Intelの標準ドライバではこちらから認識されないので、Zadigを使用してドライバをlibUSBに差し替える必要があります。ただ、これを行うと当然のことながらIntelのプログラマからは認識されなくなるため、CPLDやFPGAの書き込みに使いたい場合には後述の方法でドライバを元に戻す必要があります。

PlatformIOでプロジェクトを開き、platoformio.ini で次のように設定を行います。
これで準備は完了です。デバッガを開いて(左端のツールバーから虫のアイコンをクリック)、メニューの「デバッグの開始」でデバッグが開始されます。

他のデバッガと同様、ステップ実行、ブレークポイントの設定、式のウォッチ、レジスタ・IOの状態表示、メモリダンプなどが可能です。ただ、ステップ実行は1ステップ進むのにかなり時間がかかります。本物のUSB Blasterを持っていないので、この製品の処理速度が遅いせいなのか、もともとこんなものなのかはわかりませんが…。

最後に、Intelのドライバへの戻し方を書いておきます。デバイスマネージャからドライバの更新→コンピュータを参照してドライバを検索→コンピュータ上の利用可能なドライバ一覧から選択、と進むと、このように互換性のあるドライバがいくつか表示されるので、Altera USB Blasterを選べばOKです。

通常の開発作業を行う場合、画面表示やシリアルポートのモニタで何とかなる場合が多いと思いますし、そのほうが効率的な場合も多いかとも思います。ただ、他人の開発したプログラムの動作でわからないところがあるときなどにはこのようなJTAGデバッガも重宝する場合もあるかと思います。低コストでデバッグができるようになるので、必要な方は検討してみてはいかがでしょうか。
左が私が購入した商品ページ。ある意味ガチャですね。MAX10-JBという互換基板が右側の書籍にふくまれていますが、こちらは別途部品購入と組み立てが必要です。

この手の製品は、一見同じように見えても中身は様々なようで、今回購入したものはPIC18F14K50を搭載していました。これはおそらくOJIKA様のサイトで公開されているものと同様なもの(パクった?)だと思われますが、OJIKA様の開発されたものはCQ社のMAX10のキットに含まれているMAX10-JBのベースにもなっており、信頼性が高いものであると考えられます。いっぽう、他のマイコンが搭載されているものあるようで、その中にはうまく動作しなかったという報告が見られるものもありました。(写真は今回購入したものの内部。の左の石がPIC, 右の石はレベルコンバータと思われる74LVC244Aです。)

とりあえずきちんと認識されるかどうかのテスト、ということで、IntelのサイトからQuartus Primeをダウンロード、インストールしてみました。接続してみると自動的にデバイスドライバが組み込まれ、プログラマからも認識されているので、特に問題はなさそうです。

PlatformIOのデバッガはOpenOCDと呼ばれるものを使用していますが、Intelの標準ドライバではこちらから認識されないので、Zadigを使用してドライバをlibUSBに差し替える必要があります。ただ、これを行うと当然のことながらIntelのプログラマからは認識されなくなるため、CPLDやFPGAの書き込みに使いたい場合には後述の方法でドライバを元に戻す必要があります。

PlatformIOでプロジェクトを開き、platoformio.ini で次のように設定を行います。
upload_protocol = altera-usb-blaster
debug_tool = altera-usb-blaster
これで準備は完了です。デバッガを開いて(左端のツールバーから虫のアイコンをクリック)、メニューの「デバッグの開始」でデバッグが開始されます。

他のデバッガと同様、ステップ実行、ブレークポイントの設定、式のウォッチ、レジスタ・IOの状態表示、メモリダンプなどが可能です。ただ、ステップ実行は1ステップ進むのにかなり時間がかかります。本物のUSB Blasterを持っていないので、この製品の処理速度が遅いせいなのか、もともとこんなものなのかはわかりませんが…。

最後に、Intelのドライバへの戻し方を書いておきます。デバイスマネージャからドライバの更新→コンピュータを参照してドライバを検索→コンピュータ上の利用可能なドライバ一覧から選択、と進むと、このように互換性のあるドライバがいくつか表示されるので、Altera USB Blasterを選べばOKです。

通常の開発作業を行う場合、画面表示やシリアルポートのモニタで何とかなる場合が多いと思いますし、そのほうが効率的な場合も多いかとも思います。ただ、他人の開発したプログラムの動作でわからないところがあるときなどにはこのようなJTAGデバッガも重宝する場合もあるかと思います。低コストでデバッグができるようになるので、必要な方は検討してみてはいかがでしょうか。
左が私が購入した商品ページ。ある意味ガチャですね。MAX10-JBという互換基板が右側の書籍にふくまれていますが、こちらは別途部品購入と組み立てが必要です。
tag : マイコンSipeedLonganNanoUSBBlasterPlatformIOGD32RISC-Vデバッガ
Sipeed Longan Nanoで文字を表示してみる
前回の記事で、Sipeed Longan Nanoの開発環境のセットアップについて書きました。本日は、Longan NanoのLCDへの表示方法について書こうと思います。Longan NanoのLCDは、データシートを見てもコントローラの種類やMCUのどのポートに接続されているのかなど、何も記載がありません。Webを検索してもあまりLCDに実際に表示を行っている例もなく途方に暮れていたのですが、Sipeedのオフィシャルサイトの製品ページにLCD表示サンプルプログラムへのリンクがあったので試してみることにしました。製品情報のDocumentsタブにあるLCD Demoをクリックすると参照することができます(あるいは、こちらからもダウンロードが可能です)。
今回は、Arduinoではなくメーカー提供のSDKを用いてC言語で開発を行いますので、まずはPlatformIOのほうの準備を行います。PIO Homeを開き、“New Project”をクリックし、“Board”は“Sipeed Longan Nano”、“Framework”は“GigaDevice GD32V SDK”を選択し、“Finish”でプロジェクトが作成されます。

“platformio.ini”に追記を行います。

先ほどダウンロードしたサンプルプログラムの“include”フォルダの“lcd”フォルダと“systick.h”を、プロジェクトフォルダの“include”フォルダへコピー、“src”フォルダの“lcd”フォルダと“systick.c”も同様にコピーします。最後に、プロジェクトフォルダの“src”フォルダに“main.c”を作成します。これで準備は完了です。
ちなみに、lcd.c/lcd.h がLCD制御ライブラリの本体、bmp.h がライブラリ内で使用するロゴデータのサンプル、oledfont.h が文字フォントデータ、systick.c/systick.h が1ms単位でのウェイトを行う関数となっているようです。
エディタで main.c を開き、以下のように入力します。

ファイルを保存、コンパイルを行い、マイコンに書き込みます。今回はドライバのインストールが済んでいるので簡単です。BOOTボタンを押しながらUSB接続を行うか、BOOTボタンを押しながらリセットすると書き込みモードになります。書き込みツールを使用して書き込んでからRESETボタンを押すと、無事に表示されました(写真が汚くて申し訳ありません)。

以下に、ライブラリの簡単な説明を載せておきます。すべてを試したわけではないので誤っている部分もあるかもしれませんが、その際は指摘してしていただければありがたいです。また、フォントやロゴの定義方法などはまた今後調べてみたいと思います。
lcd.h 色指定用記号定数:
WHITE :白
BLACK :黒
BLUE :青
GBLUE :青緑
RED :赤
MAGENTA :マゼンタ
GREEN :緑
CYAN :シアン
YELLOW :黄色
BROWN :茶色
BRRED :赤茶色
GRAY :灰色
(その他中間色が数種類定義されています)
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
lcd.c 関数 (低レベルI/O関数は除く):
void Lcd_Init(void);
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII) mode = モード color = 描画色
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
最低限の機能ではありますが、ごれぐらいあれば困ることはほとんどないのではないでしょうか。参考としていただければ幸いです。最後に、Longan Nanoの開発に参考となりそうなサイトへのリンクをいくつか載せておきます。
公式Wiki(英語)
公式GitHub
GD32V MCUのマニュアル類
その他ツール、ドキュメント、サンプルなどの公式ダウンロードサイト
今回は、Arduinoではなくメーカー提供のSDKを用いてC言語で開発を行いますので、まずはPlatformIOのほうの準備を行います。PIO Homeを開き、“New Project”をクリックし、“Board”は“Sipeed Longan Nano”、“Framework”は“GigaDevice GD32V SDK”を選択し、“Finish”でプロジェクトが作成されます。

“platformio.ini”に追記を行います。
upload_protocol = dfu

先ほどダウンロードしたサンプルプログラムの“include”フォルダの“lcd”フォルダと“systick.h”を、プロジェクトフォルダの“include”フォルダへコピー、“src”フォルダの“lcd”フォルダと“systick.c”も同様にコピーします。最後に、プロジェクトフォルダの“src”フォルダに“main.c”を作成します。これで準備は完了です。
ちなみに、lcd.c/lcd.h がLCD制御ライブラリの本体、bmp.h がライブラリ内で使用するロゴデータのサンプル、oledfont.h が文字フォントデータ、systick.c/systick.h が1ms単位でのウェイトを行う関数となっているようです。
エディタで main.c を開き、以下のように入力します。
#include "lcd/lcd.h"
int main( void ) {
// LCD制御サンプルプログラム
Lcd_Init(); // lcdを初期化する
LCD_Clear( WHITE ); // lcdをクリアする
BACK_COLOR = CYAN; // 文字の背景色を指定
LCD_ShowString( 10, 4, "Longan Nano", MAGENTA );
LCD_ShowString( 10,24, "LCD Test", MAGENTA );
while( 1 );
}

ファイルを保存、コンパイルを行い、マイコンに書き込みます。今回はドライバのインストールが済んでいるので簡単です。BOOTボタンを押しながらUSB接続を行うか、BOOTボタンを押しながらリセットすると書き込みモードになります。書き込みツールを使用して書き込んでからRESETボタンを押すと、無事に表示されました(写真が汚くて申し訳ありません)。

以下に、ライブラリの簡単な説明を載せておきます。すべてを試したわけではないので誤っている部分もあるかもしれませんが、その際は指摘してしていただければありがたいです。また、フォントやロゴの定義方法などはまた今後調べてみたいと思います。
lcd.h 色指定用記号定数:
WHITE :白
BLACK :黒
BLUE :青
GBLUE :青緑
RED :赤
MAGENTA :マゼンタ
GREEN :緑
CYAN :シアン
YELLOW :黄色
BROWN :茶色
BRRED :赤茶色
GRAY :灰色
(その他中間色が数種類定義されています)
lcd.c グローバル変数:
unsinged int BACK_COLOR; :文字表示の際の背景色
unsigned char image[12800]; :LCD_ShowPicture() で表示するイメージを格納する配列
lcd.c 関数 (低レベルI/O関数は除く):
void Lcd_Init(void);
LCDを初期化する。
void LCD_Clear(u16 Color);
LCDをクリアする(=Colorで指定した色で全面を塗りつぶす)。
Color = 背景色
void LCD_ShowChinese(u16 x,u16 y,u8 index,u8 size,u16 color);
漢字を表示する(別途 oeldfont.h の中でパターン定義されているもののみ)。
x, y = 座標 index = 漢字のインデックス番号(定義されている順に0~)
size = フォントサイズ(16/32) color = 描画色
void LCD_DrawPoint(u16 x,u16 y,u16 color);
点を打つ。
x, y = 座標 color = 描画色
void LCD_DrawPoint_big(u16 x,u16 y,u16 color);
大きな点を打つ(実際には3x3ピクセルの正方形を描く)。
x, y = 座標 color = 描画色
void LCD_Fill(u16 xsta,u16 ysta,u16 xend,u16 yend,u16 color);
矩形領域を塗りつぶす。
xsta, ysta = 左上座標 xend, yend = 右下座標 color = 描画色
void LCD_DrawLine(u16 x1,u16 y1,u16 x2,u16 y2,u16 color);
直線を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2,u16 color);
矩形を描画する。
x1, y1 = 起点座標 x2, y2 = 終点座標 color = 描画色
void Draw_Circle(u16 x0,u16 y0,u8 r,u16 color);
円を描画する。
x0, y0 = 中心 r = 半径 color = 描画色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 mode,u16 color);
文字を表示する
x, y = 座標 num = 文字コード(ASCII) mode = モード color = 描画色
※mode = 1 のとき OR、 mode = 0 のとき 上書き(文字背景を BACK_COLOR で塗りつぶした上に描画)
void LCD_ShowString(u16 x,u16 y,const u8 *p,u16 color);
文字列を表示する(必ず上書きモードとなる)。
x, y = 座標 p = ASCII文字列へのポインタ color = 描画色
void LCD_ShowNum(u16 x,u16 y,u16 num,u8 len,u16 color);
整数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowNum1(u16 x,u16 y,float num,u8 len,u16 color);
小数値を表示する。
x, y = 座標 num = 数値 len = 表示桁数 color = 描画色
void LCD_ShowPicture(u16 x1,u16 y1,u16 x2,u16 y2);
イメージを表示する( image[] に格納されたデータを表示する)。
x1, y1 = 左上座標 x2, y2 = 右下座標
void LCD_ShowLogo(void);
ロゴマークを表示する( bmp.h で定義されたデータを表示する)。
最低限の機能ではありますが、ごれぐらいあれば困ることはほとんどないのではないでしょうか。参考としていただければ幸いです。最後に、Longan Nanoの開発に参考となりそうなサイトへのリンクをいくつか載せておきます。
公式Wiki(英語)
公式GitHub
GD32V MCUのマニュアル類
その他ツール、ドキュメント、サンプルなどの公式ダウンロードサイト
Sipeed Longan Nanoを使ってみました
本日はXperia 1の記事の続きを書くつもりだったのですが、先日購入した安価なマイコンボード、Sipeed Longan Nanoが面白そうなので触ってみました。このボードはRISC-Vアーキテクチャの32bit MCUであるGigaDevice GD32VF103CBT6を搭載しており、32KBのSRAMと128KBのフラッシュメモリを内蔵、microSDカードスロット、160×80ドット、0.96インチのフルカラーIPS液晶も搭載しています。今回は秋月で購入しましたが、ボード本体とピンヘッダ、アクリルケースがセットになっていましたので、ピンヘッダをはんだ付けしてアクリルケースに収めてみました。加工精度が今一つなのか、コネクタ類が干渉してキレイに収めるのにはちょっと苦労しました。また、このままだとボード上のボタン類(BOOT, RESET)が押せなくて不便なので、3Dプリンタで簡単なパーツを作って対処しました(赤いボタンのように見えるもの)。
※後になって、秋月のセットにはボタン用パーツが付属していることに気づきました。

本日は、開発環境のセットアップとLチカを行うところまで手順を書いてみることにします。Longan Nanoには専用のIDEというものはなく、PlatoformIO IDEというものを開発に利用します。これは、Visual Studio Code (VS Code)の拡張機能として組み込むことでIDEとして使用できるようになるもので、Arduinoをはじめとする様々なマイコンボードに対応しているものです。
(1) まずはVS Codeを起動し、拡張機能“PlatformIO IDE”をインストールします。

(2) PlatformIOのアイコンが左端のツールバーに追加されるので、そこをクリックすると“PIO Home”が開きます。左下の“QUICK ACCESS”から“New Terminal”をクリックしてターミナルを開きます。

(3) ターミナルのコマンドラインで次のように入力し、Longan Nanoに対応しているSDKをインストールします。

(4) インストールが終了したら、PIO Homeの“Project Examples”をクリックして開き、“Arduino Blink”を選択して読み込みます。

(5) “platformio.ini”ファイルを開き、[env:gd32vf103v-eval]セクションを削除し[env:sipeed-longan-nano]セクションのみを残すようにします。このArduino用のLチカは様々なプラットフォームに対応しているわけですが、このファイルを編集することによってLongan Nano対応のプロジェクトであることを指定していることになるのだと思います。

(6) Longan NanoはUSBを利用してプログラムを転送します。それに備えて次の内容を追記します。

(7) ステータスバー左のほうにあるチェック☑のマークをクリックするとコンパイルされます(あるいは、[CTRL]+[SHIFT]+[B]を押して、表示されるメニューから“PlatformIO: Build”を選択)。コンパイル済みのバイナリはプロジェクトフォルダ内の“.pio\build\sipeed-longan-nano”に、“firmware.bin”というファイル名で保存されます。

(8) 書き込み用のUSBドライバをインストールするため、Longan Nanoを書き込みモードで起動します。PCのUSBポートにLongan Nanoを接続し、BOOTボタンを押してからRESETボタンを押します。その後RESETボタンを離し、BOOTボタンを離すと書き込みモードで起動します(この時点ではデバイスマネージャではUnknown Deviceとして認識されます)。

(9) PlatformIOから直接書き込むためには、書き込みに必要なWinUSBドライバをインストールします。これを行うにはZadigを用いるのが便利です。こちらからインストーラをダウンロードして実行します。“Unknown Device”が選択されているのを確認し“Install Driver”をクリックすればOKです。書き込むには、VS Codeのステータスバー左のほうにある右向き矢印→のマークをクリックします。この方法を用いる場合には以下の(10)-(12)の手順は不要です。

(10) 専用の書き込みツールを用いる場合には、こちらからダウンロードします。
(11) 書き込み用USBドライバをインストールします。上記ファイルを解凍してできた“GD32 MCU Dfu Drivers_v1.0.1.2316”フォルダ内から(末尾の数字などはバージョンによって異なります)、OSに合わせて(32bit→x86, 64bit→x64)選んでドライバのインストーラを「管理者として実行」します。

(12) 書き込みツールを実行します。“GD32 MCU Dfu Tool_v3.8.1.5784”フォルダ内の“GD32 MCU Dfu Tool”を起動します。書き込むbinファイルを選択してOKボタンをクリックすれば書き込まれます。

(13) Longan NanoのRESETボタンを押すと実行されます。
結構面倒くさく感じるかもしれませんが、上記の操作は最初の1回のみでOKです。その後はArduino言語での開発の場合には(4)~(7)でコンパイルを行ってから、BOOTボタンを押しながらLongan NanoをPCに接続、BOOTボタンを離して(12)→(13)でできると思うので、結構簡単だと思います。なかなかドキュメント類も少なくて苦労することもありますが、1個830円と安価なので、興味のある方は試してみてはいかがでしょうか。

RISC-Vに興味のある方はこちら。
※後になって、秋月のセットにはボタン用パーツが付属していることに気づきました。

本日は、開発環境のセットアップとLチカを行うところまで手順を書いてみることにします。Longan Nanoには専用のIDEというものはなく、PlatoformIO IDEというものを開発に利用します。これは、Visual Studio Code (VS Code)の拡張機能として組み込むことでIDEとして使用できるようになるもので、Arduinoをはじめとする様々なマイコンボードに対応しているものです。
(1) まずはVS Codeを起動し、拡張機能“PlatformIO IDE”をインストールします。

(2) PlatformIOのアイコンが左端のツールバーに追加されるので、そこをクリックすると“PIO Home”が開きます。左下の“QUICK ACCESS”から“New Terminal”をクリックしてターミナルを開きます。

(3) ターミナルのコマンドラインで次のように入力し、Longan Nanoに対応しているSDKをインストールします。
platformio platform install gd32v
platformio platform install https://github.com/sipeed/platform-gd32v

(4) インストールが終了したら、PIO Homeの“Project Examples”をクリックして開き、“Arduino Blink”を選択して読み込みます。

(5) “platformio.ini”ファイルを開き、[env:gd32vf103v-eval]セクションを削除し[env:sipeed-longan-nano]セクションのみを残すようにします。このArduino用のLチカは様々なプラットフォームに対応しているわけですが、このファイルを編集することによってLongan Nano対応のプロジェクトであることを指定していることになるのだと思います。

(6) Longan NanoはUSBを利用してプログラムを転送します。それに備えて次の内容を追記します。
upload_protocol = dfu

(7) ステータスバー左のほうにあるチェック☑のマークをクリックするとコンパイルされます(あるいは、[CTRL]+[SHIFT]+[B]を押して、表示されるメニューから“PlatformIO: Build”を選択)。コンパイル済みのバイナリはプロジェクトフォルダ内の“.pio\build\sipeed-longan-nano”に、“firmware.bin”というファイル名で保存されます。

(8) 書き込み用のUSBドライバをインストールするため、Longan Nanoを書き込みモードで起動します。PCのUSBポートにLongan Nanoを接続し、BOOTボタンを押してからRESETボタンを押します。その後RESETボタンを離し、BOOTボタンを離すと書き込みモードで起動します(この時点ではデバイスマネージャではUnknown Deviceとして認識されます)。

(9) PlatformIOから直接書き込むためには、書き込みに必要なWinUSBドライバをインストールします。これを行うにはZadigを用いるのが便利です。こちらからインストーラをダウンロードして実行します。“Unknown Device”が選択されているのを確認し“Install Driver”をクリックすればOKです。書き込むには、VS Codeのステータスバー左のほうにある右向き矢印→のマークをクリックします。この方法を用いる場合には以下の(10)-(12)の手順は不要です。

(10) 専用の書き込みツールを用いる場合には、こちらからダウンロードします。
(11) 書き込み用USBドライバをインストールします。上記ファイルを解凍してできた“GD32 MCU Dfu Drivers_v1.0.1.2316”フォルダ内から(末尾の数字などはバージョンによって異なります)、OSに合わせて(32bit→x86, 64bit→x64)選んでドライバのインストーラを「管理者として実行」します。

(12) 書き込みツールを実行します。“GD32 MCU Dfu Tool_v3.8.1.5784”フォルダ内の“GD32 MCU Dfu Tool”を起動します。書き込むbinファイルを選択してOKボタンをクリックすれば書き込まれます。

(13) Longan NanoのRESETボタンを押すと実行されます。
結構面倒くさく感じるかもしれませんが、上記の操作は最初の1回のみでOKです。その後はArduino言語での開発の場合には(4)~(7)でコンパイルを行ってから、BOOTボタンを押しながらLongan NanoをPCに接続、BOOTボタンを離して(12)→(13)でできると思うので、結構簡単だと思います。なかなかドキュメント類も少なくて苦労することもありますが、1個830円と安価なので、興味のある方は試してみてはいかがでしょうか。

RISC-Vに興味のある方はこちら。
CH552Gの開発環境構築ととLチカ
前回紹介したCH552Gの開発環境を整備したので、その方法を覚書として残しておきます。CH551/552について書かれた日本語の記事というと、前に紹介したはくら様のブログ以外にはCerevo TechBlog様ぐらいしか見当たりません。いずれもメーカー推奨のKeil C51を前提として書かれていますが、Keilの無料試用版はコードサイズが2KBに制限されている(正式版は20万円超です…)とのことで、CH552Gのプログラムメモリ(ブートローダを除いて14KB)をいっぱいに使うようなものは作れません。メーカーのサンプルプログラムがこちらで公開されており、こちらはKeil用に書かれているのでまずはKeilで試すのがお手軽だとは思いますが、今回はあえてフリーのCコンパイラSDCC(Small Device C Compiler)を用いることにしました。
まず、SDCCの公式サイトから最新版をダウンロード、インストールします。インストールの終盤でコンパイラのパスを環境変数PATHに追加するかどうか尋ねられすので、追加(チェックを入れる)しておきます。
SDCCは統合開発環境(IDE)ではなく、コマンドラインコンパイラなので、別途エディタを用意します。フリーのものだとおススメはやはりVisual Studio Code(VS Code)でしょうか。ダウンロード後、インストールしてください。その後、C/C++の拡張機能をインストールしておきます。

8051アセンブラやIntel Hexの拡張機能も入れておいてもよいかもしれません。


基本的にはVS Codeで書いて保存→コマンドラインから sdcc ソースファイル名 でよいのですが、使い勝手を良くするためにいくつか追加の設定を行っておきます。もっとスマートな方法もあるかもしれませんが、初心者ということでご容赦ください。まず、コンパイル用のバッチファイルを作ります。ファイル名は_sdcc.batとし、パスの通ったフォルダ(C:\Program Files\SDCC\bin など)にコピーしておきます。このバッチはSDCCが吐き出した.ihx形式のHexファイルを.hex形式に自動的に変換するために作成しました。
(3, 4行目は、それぞれCH552, 551のメモリサイズを指定して使用量をチェックする場合の記述方法です。)
次に、プロジェクトファイルを保存するフォルダを新規作成します。

VS Codeの「フォルダーを開く」で、作成したフォルダを選択します。

次に、Cコンパイラの起動指定を行います。「ターミナル」-「タスクの構成」-「テンプレートからtasks.jsonを生成」-「Others」を選択します。



すると設定ファイルの編集画面が開くので、下記のように変更、保存してください。これで、[CTRL]+[SHIFT]+[B]でmain.c をメインプログラムとしたビルドタスクが走るようになります。main.c をほかのファイル名に変更したい場合には、"args" のところの "main" をほかの名前に変えてください。

下記のコードをコピペしてもOKです。
次に、エディタの使い勝手を向上させるため、インクルードファイルのパスの指定を行います。左下の設定アイコンから「コマンドパレット」-「C/C++:Edit Configurations (UI)」を選択して設定画面を開き、以下のように設定を行います。
・Compiler Path をsdcc.exeのパスに変更
・IntelliSense Mode をデフォルトに変更
・Include Path にSDCCのインクルードファイルが保存されているパスを追加


.vscodeフォルダ内にこのような c_cpp_properties.json ファイルが生成されておればOKです。以上の設定により、#include マクロで<>でかこったファイル名を指定しても警告表示が出なくなります。
以上の操作で.vscodeフォルダ内に2つのファイルが生成されましたが、これらのファイルはPC内のコンパイラのパスが変わらなければ使いまわしができますので、新たにプロジェクトを作成した際には.vscodeフォルダごとコピーしておけばこれまでの設定を省略できて便利です。
では試しにLチカのプログラムを入力してみましょう。以下のプログラムを入力し、main.c として保存してください。CH552特有のレジスタを使用しない限りは、8052用の定義ファイル(8052.h)が使用できます。また、stdint.h をインクルードしておくと、AVRGCCなどでもおなじみの uint8_t などの表現が使用できるようになるのでAVRからの移植にも便利かと思います。
入力後、[CTRL]+[SHIFT]+[B]でコンパイラが走り、main.hex が生成されているはずです。

生成されたバイナリファイルの書き込みにはWCH社提供のWCHISPToolを使用します。ダウンロードページからダウンロード、インストールしてください。
準備ができたら、前回の記事で紹介したマイコンボードのPGM(プログラム)ボタンを押しながらPCのUSBポートに接続します。PGMボタンは1-2秒で離してください。これでブートローダが起動して、書き込めるようになります。起動に成功すればデバイスマネージャに"USB Module"というデバイスが現れているはずですが、うまくいかなければいったん接続を外してやり直してみてください。

この状態でWCHISPToolを起動し、「8 Bit CH55X series」タブを選択、「Chip model」で「CH552」を選択すると、画面下方のデバイスリストに接続したマイコンが認識されているはずです。ここで「User File」でコンパイラの出力したhexファイルを選択し、「Download」ボタンをクリックすれば書き込みが完了します。

この状態でリセットボタンを押せばP1.1に接続したLEDが点滅するはずです。
SDCCでの開発はあまり資料がないので難しいかと思いましたが、一度環境構築してしまうとさほど大変ではありませんでした。今後の予定としては、メーカー提供のCH552用のライブラリやインクルードファイルなどをSDCCで利用できるように移植作業などを進めていきたいと思います。
最後に、参考資料へのリンクを載せておきます。
技術者見習いのメモ書き-USB機能付き格安マイコンCH552Tの入手方法と回路について
Cerevo TechBlog-[21日目]激安中華USBマイコンは使えるのか
GitHub CH554 software development kit for SDCC:SDCC用のサンプル
ElectroDragon-WCH Wiki
Bitbucket-Electrodragon WCH:Keil C51用のサンプル
新世代8051系マイコン入門ハンドブック【PDF版】
まず、SDCCの公式サイトから最新版をダウンロード、インストールします。インストールの終盤でコンパイラのパスを環境変数PATHに追加するかどうか尋ねられすので、追加(チェックを入れる)しておきます。
SDCCは統合開発環境(IDE)ではなく、コマンドラインコンパイラなので、別途エディタを用意します。フリーのものだとおススメはやはりVisual Studio Code(VS Code)でしょうか。ダウンロード後、インストールしてください。その後、C/C++の拡張機能をインストールしておきます。

8051アセンブラやIntel Hexの拡張機能も入れておいてもよいかもしれません。


基本的にはVS Codeで書いて保存→コマンドラインから sdcc ソースファイル名 でよいのですが、使い勝手を良くするためにいくつか追加の設定を行っておきます。もっとスマートな方法もあるかもしれませんが、初心者ということでご容赦ください。まず、コンパイル用のバッチファイルを作ります。ファイル名は_sdcc.batとし、パスの通ったフォルダ(C:\Program Files\SDCC\bin など)にコピーしておきます。このバッチはSDCCが吐き出した.ihx形式のHexファイルを.hex形式に自動的に変換するために作成しました。
(3, 4行目は、それぞれCH552, 551のメモリサイズを指定して使用量をチェックする場合の記述方法です。)
次に、プロジェクトファイルを保存するフォルダを新規作成します。

VS Codeの「フォルダーを開く」で、作成したフォルダを選択します。

次に、Cコンパイラの起動指定を行います。「ターミナル」-「タスクの構成」-「テンプレートからtasks.jsonを生成」-「Others」を選択します。



すると設定ファイルの編集画面が開くので、下記のように変更、保存してください。これで、[CTRL]+[SHIFT]+[B]でmain.c をメインプログラムとしたビルドタスクが走るようになります。main.c をほかのファイル名に変更したい場合には、"args" のところの "main" をほかの名前に変えてください。

下記のコードをコピペしてもOKです。
次に、エディタの使い勝手を向上させるため、インクルードファイルのパスの指定を行います。左下の設定アイコンから「コマンドパレット」-「C/C++:Edit Configurations (UI)」を選択して設定画面を開き、以下のように設定を行います。
・Compiler Path をsdcc.exeのパスに変更
・IntelliSense Mode をデフォルトに変更
・Include Path にSDCCのインクルードファイルが保存されているパスを追加


.vscodeフォルダ内にこのような c_cpp_properties.json ファイルが生成されておればOKです。以上の設定により、#include マクロで<>でかこったファイル名を指定しても警告表示が出なくなります。
以上の操作で.vscodeフォルダ内に2つのファイルが生成されましたが、これらのファイルはPC内のコンパイラのパスが変わらなければ使いまわしができますので、新たにプロジェクトを作成した際には.vscodeフォルダごとコピーしておけばこれまでの設定を省略できて便利です。
では試しにLチカのプログラムを入力してみましょう。以下のプログラムを入力し、main.c として保存してください。CH552特有のレジスタを使用しない限りは、8052用の定義ファイル(8052.h)が使用できます。また、stdint.h をインクルードしておくと、AVRGCCなどでもおなじみの uint8_t などの表現が使用できるようになるのでAVRからの移植にも便利かと思います。
入力後、[CTRL]+[SHIFT]+[B]でコンパイラが走り、main.hex が生成されているはずです。

生成されたバイナリファイルの書き込みにはWCH社提供のWCHISPToolを使用します。ダウンロードページからダウンロード、インストールしてください。
準備ができたら、前回の記事で紹介したマイコンボードのPGM(プログラム)ボタンを押しながらPCのUSBポートに接続します。PGMボタンは1-2秒で離してください。これでブートローダが起動して、書き込めるようになります。起動に成功すればデバイスマネージャに"USB Module"というデバイスが現れているはずですが、うまくいかなければいったん接続を外してやり直してみてください。

この状態でWCHISPToolを起動し、「8 Bit CH55X series」タブを選択、「Chip model」で「CH552」を選択すると、画面下方のデバイスリストに接続したマイコンが認識されているはずです。ここで「User File」でコンパイラの出力したhexファイルを選択し、「Download」ボタンをクリックすれば書き込みが完了します。

この状態でリセットボタンを押せばP1.1に接続したLEDが点滅するはずです。
SDCCでの開発はあまり資料がないので難しいかと思いましたが、一度環境構築してしまうとさほど大変ではありませんでした。今後の予定としては、メーカー提供のCH552用のライブラリやインクルードファイルなどをSDCCで利用できるように移植作業などを進めていきたいと思います。
最後に、参考資料へのリンクを載せておきます。
技術者見習いのメモ書き-USB機能付き格安マイコンCH552Tの入手方法と回路について
Cerevo TechBlog-[21日目]激安中華USBマイコンは使えるのか
GitHub CH554 software development kit for SDCC:SDCC用のサンプル
ElectroDragon-WCH Wiki
Bitbucket-Electrodragon WCH:Keil C51用のサンプル
新世代8051系マイコン入門ハンドブック【PDF版】