久しぶりにLongan Nanoを触ります。
LinuxをLinuxMint18.3に更新したので、再度Platform IOの環境から構築し直します。手順は、前回のこれとこれと同じ。
Lチカまで確認できたら、GitHubにあるサンプルプログラムを動かしてみます。まずは、ZIPでダウンロードしてきて展開します。
Platform IOで新規プロジェクトを作成します。プロジェクト作成時には、ボード名は「Sipeed Longan Nano」を選択します。(Sipeed Longan Nano Lite)
作成したら、ダウンロードしてきたサンプルプログラムのgd32v_lcdディレクトリの中のincludeとsrcディレクトリの中身をvscodeのプロジェクトディレクトリのincludeとsrcディレクトリにそれぞれドラッグ&ドロップします。フォルダごとコピーしてworkspaceに追加するか聞いてくるので、「Copy Folders」を選択してコピーします。
platformio.ini を選択して編集します。
[env:sipeed-longan-nano-lite] platform = https://github.com/sipeed/platform-gd32v.git framework = gd32vf103-sdk board = sipeed-longan-nano-lite upload_protocol = dfu
下の方のチェックマークと右向き矢印でビルドと書き込みができました。画像のファイルの方は put_into_tf_card フォルダの中身を microSD に書き込んで、基板に挿入しておくと、リセットでロゴと動画が再生されました。
さて、やりたいのはデモプログラムを動かすことではありません。せっかくLCDといろんなI/Oがついているボードですから、工作に使いたい。そこで、まずはLCDとUARTを動かしたいところです。
で、いろんなところを参考に・・・というかパクらせてもらいながら作ったのが下記の main.c 。
#include "lcd/lcd.h"
#include "gd32v_pjt_include.h"
#include <stdio.h>
#include <string.h>
void init_uart0(void)
{
/* enable GPIO clock */
rcu_periph_clock_enable(RCU_GPIOA);
/* enable USART clock */
rcu_periph_clock_enable(RCU_USART0);
/* connect port to USARTx_Tx */
gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
/* connect port to USARTx_Rx */
gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);
/* USART configure */
usart_deinit(USART0);
usart_baudrate_set(USART0, 115200U);
usart_word_length_set(USART0, USART_WL_8BIT);
usart_stop_bit_set(USART0, USART_STB_1BIT);
usart_parity_config(USART0, USART_PM_NONE);
usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
usart_receive_config(USART0, USART_RECEIVE_ENABLE);
usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
usart_enable(USART0);
// usart_interrupt_enable(USART0, USART_INT_RBNE);
}
int main(void)
{
rcu_periph_clock_enable(RCU_GPIOA);
rcu_periph_clock_enable(RCU_GPIOC);
gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1|GPIO_PIN_2);
init_uart0();
Lcd_Init(); // init OLED
LCD_Clear(BLACK);
BACK_COLOR=BLACK;
LEDR(1);
LEDG(1);
LEDB(1);
LCD_ShowString(24, 0, (u8 *)("Hello World !!"), WHITE);
LCD_ShowString(24, 16, (u8 *)("Hello World !!"), BLUE);
LCD_ShowString(24, 32, (u8 *)("Hello World !!"), RED);
LCD_ShowString(24, 48, (u8 *)("Hello World !!"), GREEN);
LCD_ShowString(24, 64, (u8 *)("Hello World !!"), GBLUE);
Draw_Circle(120,40,25,RED);
LCD_DrawLine(120,0,130,80,BLUE);
LCD_DrawRectangle(120,40,159,79,GREEN);
LCD_Fill(130,20,150,30,MAGENTA);
int c = 0;
u8 buf[16];
while (1)
{
sprintf(buf,"%d ",c);
LCD_ShowString(24, 0, buf, WHITE);
LCD_ShowString(24, 16, buf, BLUE);
LCD_ShowString(24, 32, buf, RED);
LCD_ShowString(24, 48, buf, GREEN);
LCD_ShowString(24, 64, buf, GBLUE);
LEDR_TOG;
delay_1ms(20);
LEDG_TOG;
delay_1ms(20);
LEDB_TOG;
delay_1ms(20);
usart_printf("COUNT = %d\r\n",c++);
}
}
int _put_char(int ch)
{
usart_data_transmit(USART0, (uint8_t) ch );
while ( usart_flag_get(USART0, USART_FLAG_TBE)== RESET){
}
return ch;
}
#include <stdarg.h>
void usart_printf(const char *fmt, ...) {
char buf[100];
va_list args;
va_start(args, fmt);
vsprintf(buf, fmt, args);
va_end(args);
char *p = buf;
while( *p != '\0' ) {
_put_char(*p);
p++;
}
}
まずは情報源。
LCDライブラリの使い方はこちらのページとこちらのページを参考にさせていただきました。UARTの使い方はこちらを参考に、ライブラリのサンプルを見ながら試行錯誤しました。
ライブラリのサンプルなどは http://dl.sipeed.com/LONGAN/Nano/ の下のSDKの下にあるようです。ただ、現時点では基本的なものしかないような感じ。そうはいっても、参考にはなりそうです。UARTもできれば割り込みで動かしたいので、必要な情報はそれなりにありそうです。
今日はこのあたりまで。手探りだと時間がかかりますね・・・。
