セクションの複数ページをまとめています。 印刷またはPDF形式で保存...

もとのページに戻る

2025-08-08 現在

utils.h

始動関数 main(), WarmMain()
    utils.h をインクルードすることで利用できるマクロ・関数を紹介します。

    utils.h

    utils.h をインクルードすることで利用できるマクロ・関数を紹介します。

    S_OCTET(x)

    1バイトをメモリを書き込む。

    uint8 *q = &sTx.au8Data[0];
    
    S_OCTET(0x12); 
    S_BE_WORD(0x1234);
    S_BE_DWORD(0x12345678);

    uint8 *q をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。代入演算子の評価後 q++ が実行される。

    S_BE_WORD(x)

    2バイトをメモリを書き込む。

    uint8 *q = &sTx.au8Data[0];
    
    S_OCTET(0x12); 
    S_BE_WORD(0x1234);
    S_BE_DWORD(0x12345678);

    uint8 *q をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。代入演算子の評価後 q+=2 が実行される。

    BE はビッグエンディアン、LE はリトルエンディアン。

    S_BE_DWORD(x)

    4バイトをメモリを書き込む。

    uint8 *q = &sTx.au8Data[0];
    
    S_OCTET(0x12); 
    S_BE_WORD(0x1234);
    S_BE_DWORD(0x12345678);

    uint8 *q をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。代入演算子の評価後 q+=4 が実行される。

    BE はビッグエンディアン、LE はリトルエンディアン。

    G_OCTET()

    1バイトメモリを読み込み uint8 型の変数に値を格納する。

    uint8 *p = &sRx.au8Data[0];
    
    uint8 u8data1 = OCTET(); 
    uint16 u16data2 = G_BE_WORD();
    uint32 u32data3 = G_BE_DWORD();

    uint8 *p をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。=演算子の評価後 p++ が実行される。

    G_BE_WORD()

    2バイトメモリを読み込み uint16 型の変数に値を格納する。

    uint8 *p = &sRx.au8Data[0];
    
    uint8 u8data1 = OCTET(); 
    uint16 u16data2 = G_BE_WORD();
    uint32 u32data3 = G_BE_DWORD();

    uint8 *p をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。=演算子の評価後 p+=2 が実行される。

    BE はビッグエンディアン、LE はリトルエンディアン。

    G_BE_DWORD()

    1バイトメモリを読み込み uint8 型の変数に値を格納する。

    uint8 *p = &sRx.au8Data[0];
    
    uint8 u8data1 = OCTET(); 
    uint16 u16data2 = G_BE_WORD();
    uint32 u32data3 = G_BE_DWORD();

    uint8 *p をローカル変数として宣言しておき、データを読み込みたい領域のポインタとしておく。=演算子の評価後 p+=4 が実行される。

    BE はビッグエンディアン、LE はリトルエンディアン。

    ENCODE_VOLT(x)

    2000~3600 の値を 8bit 値に変換します。

    • 1.95~2.80V は 5mV 刻み
    • 2.81~3.65V は 10mV 刻み
    // utils.h の定義
    #define ENCODE_VOLT(m) \
    	(m < 1950 ? 0 : \
    		(m > 3650 ? 255 : \
    			(m <= 2802 ? ((m-1950+2)/5) : ((m-2800-5)/10+171)) ))
    ...
    uint16 u16Volt = 2860;
    uint8 u8Volt_enc = ENCODE_VOLT(u16Volt);
    uint16 u16Volt_dec = DECODE_VOLT(u8Volt_Enc);

    2000~2800 の値は 5 刻み、2800~は10 刻みで 8bit 値に割り当てます。

    DECODE_VOLT(x)

    ENCODE_VOLT() により得られた8bit値を元の値に戻します。

    • 1.95~2.80V は 5mV 刻み
    • 2.81~3.65V は 10mV 刻み
    // utils.h の定義
    #define DECODE_VOLT(i) \
    	(i <= 170 ? (1950+i*5) : (2800+(i-170)*10) )
    ...
    uint16 u16Volt = 2860;
    uint8 u8Volt_enc = ENCODE_VOLT(u16Volt);
    uint16 u16Volt_dec = DECODE_VOLT(u8Volt_Enc);

    2000~2800 の値は 5 刻み、2800~は10 刻みで 8bit 値に割り当てます。

    vPortAsInput(c)

    ポートcを入力に設定する

    #define vPortAsInput(c) vAHI_DioSetDirection(1UL << (c), 0)

    vPortAsOutput(c)

    ポートcを出力に設定する

    #define vPortAsOutput(c) vAHI_DioSetDirection(0, 1UL << (c))

    vPortSetHi(c)

    ポートcをHi状態にする

    #define vPortSetHi(c) vAHI_DioSetOutput(1UL << (c), 0)

    vPortSetLo(c)

    ポートcをLo状態にする

    #define vPortSetLo(c) vAHI_DioSetOutput(0, 1UL << (c))

    vPortSet_TrueAsLo(c, s)

    ポート c を s が TRUE なら Lo, FALSE なら Hi に設定する

    #define vPortSet_TrueAsLo(c, s)  vAHI_DioSetOutput((s) ? \
        0 : 1UL << (c), s ? 1UL << (c) : 0)

    bPortRead(c)

    ポート c を読み出す。Loレベルなら TRUE が返る

    #define bPortRead(c) ((u32AHI_DioReadInput() & \
        (1UL<<(c))) ? FALSE : TRUE)

    u32PortReadBitmap()

    ポート c を読み出す。Loレベルなら TRUE が返る。

    #define u32PortReadBitmap() (u32AHI_DioReadInput())

    ビットマップの1がHi,0がLoとなります。

    bPortCheckBitmap(bitmap, c)

    読みだしたビットマップのポート c に対応するビットがLoレベルならTRUEを返す。

    #define bPortCheckBitmap(bitmap, c) \
        (bitmap & (1UL<<(c))) ? FALSE : TRUE)

    vPortDisablePullup(c)

    ポート c のプルアップを停止する。

    #define vPortDisablePullup(c) vAHI_DioSetPullup(0x0, 1UL << (c))

    _C

    switch でスコープを定義したい場合 _C { … } と記述している。

    #define _C if(1)
    // for example
    
    switch(c) {
    case 1:
      _C {
        uint8 u8work;
        ; // work
      } break;
    default:
    }

    LB

    改行コード (CRLF) 文字列です。

    2バイトの文字列リテラルですので、vPutChar() では利用できません。

    #define LB "\r\n"

    vWait()関数

    ループによる時間待ちを行います。

    void vWait(uint32 c) {
    	static volatile uint32 u32ct = 0;
    	while (c-- > 0)
    		u32ct++;
    }

    処理内容はソースコードの通りです。

    vAnalogueConfig(), vAnalogueDisable()

    ADC機能の初期化と停止を行う手続きをまとめています。既存コードの互換性を目的としています。

    void vAnalogueConfig(void) {
    #if defined(JN516x)
    	if (!bAHI_APRegulatorEnabled()) {
    		vAHI_ApConfigure(E_AHI_AP_REGULATOR_ENABLE,
    				E_AHI_AP_INT_DISABLE,
    				E_AHI_AP_SAMPLE_4,
    				E_AHI_AP_CLOCKDIV_1MHZ,
    				E_AHI_AP_INTREF);
    
    		while (!bAHI_APRegulatorEnabled())
    			;
    	}
    #elif defined(CPU_JN518X)
    #endif
    
    void vAnalogueDisable(void) {
    #if defined(JN516x)
    	vAHI_ApConfigure(E_AHI_AP_REGULATOR_DISABLE,
    			E_AHI_AP_INT_DISABLE,
    			E_AHI_AP_SAMPLE_4,
    			E_AHI_AP_CLOCKDIV_1MHZ,
    			E_AHI_AP_INTREF);
    #elif defined(CPU_JN518X)
    #endif
    }

    その他マクロ定義

    // 64bit mac address
    #define MAC_EXT_ADDR_TO_64BIT(ext) ((uint64)(ext.u32L) | (((uint64)(ext.u32H)) << 32))
    
    // TIME COMPARE
    #define u32TimeDiff(ref, now) (now - ref < 0x7FFFFFFF ? now - ref : )
    
    // IO settings
    #define vPortSetHi(c) vAHI_DioSetOutput(1UL << (c), 0)
    #define vPortSetLo(c) vAHI_DioSetOutput(0, 1UL << (c))
    #define vPortSet_TrueAsLo(c, s)  vAHI_DioSetOutput((s) ? 0 : 1UL << (c), s ? 1UL << (c) : 0)
    #define vPortAsInput(c) vAHI_DioSetDirection(1UL << (c), 0)
    #define vPortAsOutput(c) vAHI_DioSetDirection(0, 1UL << (c))
    #define bPortRead(c) ((u32AHI_DioReadInput() & (1UL<<(c))) ? FALSE : TRUE) // Lo as True
    #define u32PortReadBitmap() (u32AHI_DioReadInput())
    #define bPortCheckBitmap(bitmap, c) ((bitmap & (1UL<<(c))) ? FALSE : TRUE)
    #define vPortDisablePullup(c) vAHI_DioSetPullup(0x0, 1UL << (c))
    
    #if defined(JN516x) || defined(CPU_JN518X)
    #define PORT_KIT_SW1 2
    #define PORT_KIT_SW2 3
    #define PORT_KIT_SW3 10
    #define PORT_KIT_SW4 9
    #define PORT_KIT_LED1 17
    #define PORT_KIT_LED2 13
    #define PORT_KIT_LED3 12
    #define PORT_KIT_LED4 11
    #endif
    
    #define PORT_KIT_SW1_MASK (1UL << PORT_KIT_SW1)
    #define PORT_KIT_SW2_MASK (1UL << PORT_KIT_SW2)
    #define PORT_KIT_SW3_MASK (1UL << PORT_KIT_SW3)
    #define PORT_KIT_SW4_MASK (1UL << PORT_KIT_SW4)
    #define PORT_KIT_SW_ALL2_MASK (PORT_KIT_SW1_MASK | PORT_KIT_SW2_MASK)
    #define PORT_KIT_SW_ALL4_MASK (PORT_KIT_SW1_MASK | PORT_KIT_SW2_MASK | PORT_KIT_SW3_MASK | PORT_KIT_SW4_MASK)
    
    #define PORT_KIT_LED1_MASK (1UL << PORT_KIT_LED1)
    #define PORT_KIT_LED2_MASK (1UL << PORT_KIT_LED2)
    #define PORT_KIT_LED3_MASK (1UL << PORT_KIT_LED3)
    #define PORT_KIT_LED4_MASK (1UL << PORT_KIT_LED4)
    #define PORT_KIT_LED_ALL2_MASK (PORT_KIT_LED1_MASK | PORT_KIT_LED2_MASK)
    #define PORT_KIT_LED_ALL4_MASK (PORT_KIT_LED1_MASK | PORT_KIT_LED2_MASK | PORT_KIT_LED3_MASK | PORT_KIT_LED4_MASK)
    
    // UART related
    #define WAIT_UART_OUTPUT(P) SERIAL_vFlush(P)
    
    // IO clock (on JN514x, IO runs at 16Mhz regardless of CPU clock.
    #if defined(JN516x)
    #define u32IO_FREQ_HZ 16000000UL
    #elif defined(CPU_JN518X)
    //#define u32IO_FREQ_HZ 32000000UL
    #define u32IO_FREQ_HZ 16000000UL
    #endif
    
    void vAnalogueConfig(void);
    void vAnalogueDisable(void);
    
    void vWait(uint32 c);