久しぶりに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もできれば割り込みで動かしたいので、必要な情報はそれなりにありそうです。
今日はこのあたりまで。手探りだと時間がかかりますね・・・。