2019年10月27日日曜日

PSoC6 でLEDちかちか。

テキトーに放置して2年弱になりますが
プライベートの方が相当もめたり、ぐじゃぐじゃになったりしていました。
まー、就職できねーとかあったんです。
面接官から
「よく分らんイベント(PSoCまつり)やっているから…。」
「プライベートで開発しているとかってどうかしているとか…。」

モノ作ったりが好きで、プログラム書いたりするのも嫌いじゃないだけなんですけどね。
「今回はご縁がなかったことで。」
ばっかし…。
じゃ、そもそもエンジニアの求人票出すなやコラー!っていう…。

愚痴はほどほどでPSoC6でLEDチカチカさせようと思いますー。

PSoC6はPSoC5LPの後継機になるのですがPSoC5LPの面影はほとんど無いくらい
のPSoCでほとんど

「CPUパワーで殴り倒す」

って言う代物です。PSoCなのか??って思うほどです。

んで、いままでのPSoCCreatorの開発環境ではなく
Modus Toolboxというeclipseベースの開発環境に切り替わってしまいました。
インストールそのものはブログで取り上げるほどでもない位簡単なので割愛します。

さて、ここから先が結構厄介で、modus Toolboxの環境下というかPSoC6用ライブラリーも含めなのですが「FreeRTOS使ってね。それ前提だから」みたいな感じになっています。

このブログでFreeRTOSの仕様の解説までは出来ないので
簡単に触りを触れると、
「小さいプログラム(タスク)をつくって、全体のプログラムを分けて動作させよう。」
っというフレームワークです。

プロジェクトの新規作成は次の3ステップです。
①ファイルからmodus toolbox IDE application を起動させます。


②使用するPSoC6のボードを選びます。


③emptyのプロジェクトを選んで、application nemeを変更すれば出来上がり。



この状態だとRTOSもなにも入っていない状態のプロジェクトが出来上がります。
まずはRTOSの導入と、GPIOの設定をしてしまいましょう。
RTOSの導入をします。
まずは「Library Manager」をクリックして次の画面を出します。
Libraryのタブをクリックし、RTOSのチェックボックスを入れます。

そのあと、applyをクリックして画面を閉じます。

GPIOの設定はDevice Configuratorで行います。
GPIOの設定は次の通りです。

こちらはOKボタンがないのでFile→seveをクリックします。
ここまででとりあえず一区切りです。

libディレクトリのfreertosディレクトリにFreeRTOSConfig.hというRTOSに対しての設定を行うヘッダファイルがあるのでこれをルートディレクトリへ持っていきます。


FreeRTOSConfig.h
でヒープのアルゴリズムを次の通りにしました。

#define configHEAP_ALLOCATION_SCHEME (HEAP_ALLOCATION_TYPE4)

main.cのプログラムは次の通りです。

#include "cy_pdl.h"
#include "cyhal.h"
#include "cybsp.h"
#include "freeRTOS.h"
#include "task.h"
void led_blink(void);
TaskHandle_t led_blink_Handle;

int main(void)
{
    cy_rslt_t result;

    /* Initialize the device and board peripherals */
    result = cybsp_init() ;
    if (result != CY_RSLT_SUCCESS)
    {
        CY_ASSERT(0);
    }
    __enable_irq();
    xTaskCreate(led_blink, "LED_BLINK", 128, NULL, 3, led_blink_Handle);

    vTaskStartScheduler();

    for(;;)
    {
    }
}

void led_blink(void)
{
init_cycfg_pins();
cyhal_gpio_write(LED3_HAL_PORT_PIN, 1);
for(;;)
{
vTaskDelay(250);
Cy_GPIO_Write(LED3_PORT, LED3_NUM, 0);
vTaskDelay(250);
Cy_GPIO_Write(LED3_PORT, LED3_NUM, 1);
}
}
/* [] END OF FILE */


cyhal_gpio_wite()はHALでのGPIO操作関数です。
Cy_GPIO_Write()はPDLでのGPIO操作関数です。

HALとPDLの2つがありますが、
明確にどちらを使うのが適切なのかよくわかりません。
サンプルコードを読むとHALを使ってほしいように見えます。
ですが、ドキュメント読みやすさからするとPDLかと思いました。
またHALもPDLを操作するような書かれ方をしていました。

PS.
なんでレベル4かというと、RTOS使うから。
RTOSのフレームワークって結構奥が深いので。