USBホストになれるCH559入門 その1 開発環境構築

概要

USBホストになれるCH559の開発ボードを購入したので、開発をしてみたいと思います。

CH559ってなに?

USB機能を持ったワンチップマイコンです。パソコンに接続するとUSBシリアルやキーボードに見えるUSBデバイスの機能と、他のUSBキーボードやマウスなどのUSBデバイスを認識して使うUSBホストの両方の機能が使えます。

また、GPIOもそれなりにあるのでこれ単体でもそこそこ動くことができます。

開発環境について

有償

Intel 8051用の開発環境を利用することでビルドすることができるみたいです。上記のKeilを使うのが一番安心して使える開発環境になります。

オフィシャルのサンプルプログラムのこの環境でビルドするためのものだと推測します。ただし、非常に高いのでおすすめしません。

無償

上記にZ80やIntel 8051がビルドできるツールが公開されています。趣味で使う分だとこのツールで十分だと思います。今回はSDCCを使って開発環境を準備していきたいと思います。

SDCCのインストール

上記ダウンロードページから、環境にあったファイルをダウンロードしてきます。私はWindows環境なので「sdcc-win64」の最新バージョンである4.0.0をインストールしました。

前回は上記のGitHubから環境をダウンロードしましたが、中に入っているコンパイラは3.9.3でした。ただし、このバージョンって公式サイトでは公開していないんですよね。ちょっと不安だったので、公式サイトからインストールして使いました。

ちなみにバージョンは違いますが同じソースをコンパイルして、ビルドしたHEXファイルに差分はありませんでした。

インストール自体はとくに問題がないと思います。Linux環境などでもかんたんにインストールできると思います。Windowsの場合には最後にPathに追加されるか聞かれますが、どちらでもかまいません。

Lチカしてみる

GitHubのものを参考に、Lチカできる環境を作りたいと思います。

ビルドバッチ編集

@echo off 

set sdcc_path="C:\Program Files\SDCC"

set project_name=CH559Blink
set xram_size=0x0800
set xram_loc=0x0600
set code_size=0xEFFF
set dfreq_sys=48000000

del *.hex

%sdcc_path%\bin\sdcc -c -V -mmcs51 --model-large --xram-size %xram_size% --xram-loc %xram_loc% --code-size %code_size% -I/ -DFREQ_SYS=%dfreq_sys%  main.c

%sdcc_path%\bin\sdcc main.rel -V -mmcs51 --model-large --xram-size %xram_size% --xram-loc %xram_loc% --code-size %code_size% -I/ -DFREQ_SYS=%dfreq_sys%  -o %project_name%.ihx

%sdcc_path%\bin\packihx %project_name%.ihx > %project_name%.hex

del %project_name%.lk
del %project_name%.map
del %project_name%.mem
del %project_name%.ihx

del *.asm
del *.lst
del *.rel
del *.rst
del *.sym

Windows向けのビルドバッチです。GitHubのものはプロジェクトの中にSDCCがありましたが、こちらは別にインストールしているので、先頭のsdcc_pathでPATHを設定しています。

他のパラメーターなどはGitHubのものを見ながら調整したものになります。

プログラム

#include <stdint.h>
#include "ch559.h"

static inline void delay()
{
    uint32_t i;
    for (i = 0; i < (120000UL); i++)
    {
        __asm__("nop");
    }
}

void main()
{
    PORT_CFG = 0b00101101;
    P1_DIR = 0b11110000;
    P1 = 0x00;

    AIN4 = 0; // P1_4
    AIN5 = 1; // P1_5
    AIN6 = 0; // P1_6
    AIN7 = 1; // P1_7

    while (1)
    {
        delay();
        AIN4 = !AIN4;
        AIN5 = !AIN5;

        delay();
        AIN4 = !AIN4;
        AIN5 = !AIN5;
        AIN6 = !AIN6;
        AIN7 = !AIN7;
    }
}

こちらは新規で作りました。delay関数で遅延させています。NOPを呼び出していますが、実はこの行がなくても同じ動きでした。

最初にちょっと謎の初期化が入りますが、今回は無視します。P1に一般的にLEDが接続されているようでして、BitでIOを制御可能なみたいです。最初に0で初期化して、その後ビット単位にアクセスをするAIN4からAIN7を初期化して、遅延しつつ値を変更しています。

この状態でビルドするとhexファイルが作成されます。

転送

こちらは前回と同じ手順です。AutoDownloadにチェックをすると、ダウンロードモードで認識するたびに最新のhexファイルを転送するようになります。

GitHubはchflasherというツールを使って転送していましたが、公式ツールでも問題はないのかなと思います。

ch559.h

このファイルがかなり重要です。今回はGitHubのものとオフィシャルのプログラム例を見ながら差分を埋めてみました。GitHubのはP1_4という宣言がありませんでした。この名前は開発ボードのLEDのところに表示されているものです。

AIN4はGitHub版でも、オフィシャルプログラム例版のどちらでも定義がされていました。この2つの差はこのへんの定義が一部抜けているのと、コンパイラが違うので特殊なプリプロセッサ処理の部分が書き換えてありました。

たぶん、結構古いオフィシャルプログラム例をベースに、GitHub版が作られており、その後にオフィシャルプログラム例が更新されたので差分が出ている気がします。

関連ファイル

上記に関連ファイルをアップしてあるので、参考にしてください。

まとめ

まだまだこれだけだと何ができるかわからないと思います。またデバッガがないのでprintfなどの標準出力を確認することができません。次回はUARTを使ってprintfデバッグができるようにしたいと思います。

続編

コメント