はじめに

今回は、前回作成した開発環境でQCA4020のGPIOを使用してLチカ(LEDをチカチカ)するアプリケーションを作成していきます。QCA4020では、FreeRTOS/ThreadXのOS層をWrapしたQAPIというAPIを準備しています。QAPIを使用することでOSの違いを意識することなくコードを書くことができます。アプリの作成については、こちら(外部サイト)のドキュメントを参考にします。

・QCA402x (CDB2x) Development Kit User Guide:リファレンスボード&SDKの使い方
・QCA402X (CDB2X) PROGRAMMER'S GUIDE:アプリケーション作成に関するノウハウ
・QCA402X QAPI SPECIFICATION:QAPIの仕様書
・QCA4020 Device Specification:デバイスの仕様書
・QCA4020 Design Package:ハードウェアデザイン

アプリのベース作成

 まず、以下のSDKディレクトリ下にアプリ用のフォルダーを作成します。

{SDK_TOP}\target\quartz\demo

続いて作成したフォルダーにsrc、build/gccフォルダーを作成します。

{SDK_TOP}\target\quartz\demo\Sample\src
{SDK_TOP}\target\quartz\demo\Sample\build\gcc

ドキュメントには各ファイル・作り方の説明はないので、Helloworldをベースにアプリを作成していきます。

{SDK_TOP}\target\quartz\demo\Helloworld_demo\build\gcc以下のファイルを上記で作成したgccフォルダーにコピーします。

アプリを作成

1. build.batを修正

”Sources to compile" : 作成したソースコードのパスを追加します。
”Include directories" : 必要なヘッダファイルのパスを追加します。
”External objects and libraries" : 必要なライブラリーのパスを追加します。

2. ソースコードを作成ベース

Helloworldをに作成する場合、SDKで準備されているpal.cを使用することで一部機能の初期化を省略できます。
pal.cを使用した場合のアプリのエントリーポイントは、まずInitialize_Demo()が呼び出され、その後App_Start()が呼び出されます。
Initialize_Demo()にアプリ固有の初期化処理を、App_Start()にアプリの処理を書きます。

3. Threadの作成

今回はApp_Start()でThreadを生成し、Thread上でループさせLEDをPWMを使用して明滅させます。
以下のコードでThread(Sample_Thread)を生成します。

qurt_thread_attr_init(&Thread_Attribte);
qurt_thread_attr_set_name(&Thread_Attribte, "SampleThread");
qurt_thread_attr_set_priority(&Thread_Attribte, THREAD_PRIORITY);
qurt_thread_attr_set_stack_size(&Thread_Attribte, THREAD_STACK_SIZE);
qurt_thread_create(&Thread_Handle, &Thread_Attribte, Sample_Thread, NULL);

4. GPIO/PWMの設定を追加

GPIOはPWMに対応したGPIO12を使用します。(QCA4020 Device Specification参照)
以下のコードでGPIO12に対して各種設定をします。

OUTPUT/NO PULL/default HIGH/4.0mA drive

// Configure GPIO12
gpio_cfg.func = 0;
gpio_cfg.dir = QAPI_GPIO_OUTPUT_E;
gpio_cfg.pull = QAPI_GPIO_NO_PULL_E;
gpio_cfg.drive = QAPI_GPIO_4P0MA_E;
gpio_cfg.pin = 12;
// Drive GPIO with high value
qapi_TLMM_Get_Gpio_ID(&gpio_cfg, &gpio_id);
qapi_TLMM_Config_Gpio(gpio_id, &gpio_cfg);
qapi_TLMM_Drive_Gpio(gpio_id, gpio_cfg.pin, QAPI_GPIO_HIGH_VALUE_E);

続いてPWMです。GPIO12に紐づいているPWMはchannel0になっているため以下のように設定します。

frequency 300Hz/duty cycle 5%/phase shift 20%

// Configure PWM channel 0(GPIO12)
config_set.freq = 30000;
config_set.duty = 500;
config_set.phase = 2000;
config_set.moduleType = 0;
config_set.source_CLK = QAPI_PWM_SOURCE_CLK_SLEEP_MODE_E;
qapi_PWM_Channel_Open(QAPI_PWM_CHANNEL_0_E, &handle);
qapi_PWM_Channel_Set(handle, &config_set);
qapi_PWM_Enable(&handle, 1, 0x01);

あとはループで定期的にduty値を変更しLEDを明滅させます。

while(true) {
    ・・・ duty値を更新 ・・・
    qapi_PWM_Channel_Set(handle, &config_set);
}

実行

QCA4020 Design Packageに含まれている回路図からGPIO12・GNDのPINを確認します。リファレンスボードのJ5のGPIO12とGNDをブレッドボードに繋げてLED・抵抗を接続し完成です。わかりにくいですが、実行すると以下の画面のように明滅します。

まとめ

今回は、QCA4020でHelloworldをベースにLチカアプリを作成してみました。最終的に今回作成したコードをWi-Fi接続アプリに取り込み、Wi-Fi接続完了時にLEDを点灯させるようにします。次回はWi-Fi接続のトリガにするスイッチの割り込みを実装します。

QCA4020にご興味がありましたら以下までお問い合わせください。

お問い合わせ

製品に関するお問い合わせは以下リンクよりご用命ください。

Qualcomm メーカー情報Topへ

Qualcomm メーカー情報Topページへ戻りたい方は、以下をクリックください。