久しぶりにLongan Nano

久しぶりに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もできれば割り込みで動かしたいので、必要な情報はそれなりにありそうです。

今日はこのあたりまで。手探りだと時間がかかりますね・・・。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)