DXMIOに搭載されたLPC824のペリフェラルを応用したライブラリ集です。
GCC Developer Liteにはほとんどの各マイコンボード用にGPIOやシリアル通信に関する簡単なライブラリが含まれていますが、それ以外のペリフェラル等を活用するとなるとゼロからプログラムしなくてはなりません。その場合、プログラムコードの大半がそれらの初期化ルーチンや制御ルーチンで埋め尽くされ、1つのソースコードの編集しか許容していないGCC Developer Liteでは大きな負担となります。
もちろんGCC Develoer Liteにこだわらなければ、その他の便利な開発環境を使用する事で、標準で提供されるペリフェラルライブラリが使えたり、複数ソースのコンパイルや編集が可能です。
とはいえ常時複数のソースプログラムを編集するのは大変ですし、最終的には改変を行うソースプログラムは集約されて行きますので、GCC Developer Liteとしてももう少しライブラリを拡充しようと言うことで用意しました。
なお、機能がかなり偏っていますが、
といった観点で選択しています。要望によっては拡充されたりる可能性もありますし、多勢に無勢なところで記述方法等が変わる事は十分ありますので、予めご了承ください。
機能別にAPIの詳細を解説します。主なコンテンツを以下に紹介します。
それ以外に処理系に依存しにくい体裁として、変数型の宣言の際は概ね以下を使用する事とします。
FreeRTOSをCortex-M0コア用としてコンパイル及びライブラリ化し「TARGET/FREERTOS_CM0」フォルダに収録しています。必要に応じて同梱の「FreeRTOSConfig.h」を編集してライブラリを再構築する事もできます。
FreeRTOS自体は自信のプログラムの状態にかかわらず自由にリンクして使う事ができますので、OSが必要になった段階で適用の可否を判断したとしても影響が過大になることは少ないでしょう。
詳細はFreeRTOSのサイトに委ねます。
正確な時間を元に時間待ちや経過時間を計測します。元となるクロックはMRT(Multi-Rate Timer)を使用しているため、各APIを定期的にコールする際は67秒以内(2147483647/32MHz)に行う必要があります。
マイクロ秒単位の時間待ちを行う。
void Delay_us (uint32_t *mydelaybuf, uint32_t us);
API内で使用されるカウンタ情報のポインタ
APIが初回に呼び出される際は変数は必ず0に初期化しておく必要がある
時間待ちする時間
なし
#include <wl_delay.h> int main (void) { uint32_t t = 0; while (1) { Delay_us (&t, 2000); } }
ミリ秒単位の時間待ちを行う。
void Delay_ms (uint32_t *mydelaybuf, uint32_t ms);
API内で使用されるカウンタ情報のポインタ
APIが初回に呼び出される際は変数は必ず0に初期化しておく必要がある
時間待ちする時間
なし
#include <wl_delay.h> int main (void) { uint32_t t = 0; while (1) { Delay_ms (&t, 1000); } }
本APIが始めて呼び出されてからの経過時間をミリ秒で返す。
uint32_t Delay_GetTick (uint32_t *mytickbuf);
API内で使用されるカウンタ情報のポインタ
APIが初回に呼び出される際は変数は必ず0に初期化しておく必要がある
経過時間
#include <wl_delay.h> void delay (uint32_t ms) { uint32_t t = 0, target; target = Delay_GetTick (&tt) + ms; while (target > Delay_GetTick (&t)) ; } int main (void) { while (1) { delay (1000); } }
API内の時間待ちの間に呼び出されるコールバックルーチンへのポインタを指定。
デフォルトはNULLが指定されているため呼び出されない。
void (*Delay_csw) (void);
X^16+X^15+X^2+1の多項式に限定した16ビット幅のチェックサムを算出します。DynamixelプロトコルV2に使用されるチェックサムを目的としているため、それ以外のCRCを算出する用途には使えません。
なお、APIの引数に応じて内蔵ペリフェラルもしくはソフトウェアによるCRCの算出が選択されます。
また、CRCを算出する対象データの指定方法を複数用意しているのは、長大なデータが指定された場合の無駄なループ時間を削減する事が目的ですので、通常は CRC_Write か CRC_Writes で十分です。
CRCの初期値を設定する。
void CRC_SetSeed (uint16_t *pCRC, uint16_t d);
CRCの計算結果を保存する変数のポインタ。
NULLを指定するとペリフェラルを使用した計算とみなす。
CRCの初期値
なし
指定1バイトのCRCを算出する。
void CRC_Write (uint16_t *pCRC, uint8_t d);
CRCの計算結果を保存する変数のポインタ。
NULLを指定するとペリフェラルを使用した計算とみなす。
CRCを計算する対象データ
なし
指定バイト数のCRCを算出する。
void CRC_Writes (uint16_t *pCRC, uint8_t *src, uint16_t len);
CRCの計算結果を保存する変数のポインタ。
NULLを指定するとペリフェラルを使用した計算とみなす。
CRCを計算する対象データのポインタ
CRCを計算する対象データのバイト数
なし
指定バイト数のCRCを算出しながらデータをコピーする。
void CRC_Writes2 (uint16_t *pCRC, uint8_t *dest, uint8_t *src, uint16_t len);
CRCの計算結果を保存する変数のポインタ。
NULLを指定するとペリフェラルを使用した計算とみなす。
srcのコピー先のポインタ
CRCを計算する対象データのポインタ
CRCを計算する対象データのバイト数
なし
コールバックルーチンを呼び出しながら指定バイト数のCRCを算出する。
void CRC_Writes3 (uint16_t *pCRC, uint8_t (*pf) (uint8_t), uint8_t *src, uint16_t len);
CRCの計算結果を保存する変数のポインタ。
NULLを指定するとペリフェラルを使用した計算とみなす。
コールバックルーチンのポインタ
CRCを計算する対象データ
CRCを計算する対象データのバイト数
なし
算出したCRCを取得する。
なお、ソフトウェアによる算出を選択している場合は、本APIを使用せずとも変数にCRCが保存されている。
uint16_t CRC_Get (uint16_t *pCRC);
#include <wl_crc.h> uint8_t data[] = {0,1,2,3,4,5,6,7,8,9}; uint16_t crc_hard (void) { CRC_SetSeed (NULL, 0); CRC_Writes (NULL, dat, sizeof (dat)); return CRC_Get (NULL); } uint16_t crc_soft (void) { uint16_t crc; CRC_SetSeed (&crc, 0); CRC_Writes (&crc, dat, sizeof (dat)); return CRC_Get (&crc); } int main (void) { CRC_Init (); crc1 (); crc2 (); }
指定されたフラッシュのアドレスへ指定されたバイト数のデータを書き込む。
なお、コードが書き込まれた領域を侵さないアドレスを指定しなくてはならないが、本APIではそれらを判断しないまま消去及び書き込み処理を行う。
bool FLASH_Write (uint32_t destaddr, uint8_t *dat8, uint32_t DataLengthByte);
MPUのペリフェラルを初期化し、デバイスと通信できるようにする。
TDeviceID DX_OpenPort (const TDX_UsartFunc *us, uint32_t baud);
typedef struct { uint8_t *txbuff; uint32_t txbufflength; uint8_t *rxbuff; uint32_t rxbufflength; uint32_t (*init) (uint32_t baudrate, uint8_t *txbuf, uint16_t txl, uint8_t *rxbuf, uint16_t rxl); uint32_t (*setbaudrate) (uint32_t); uint16_t (*rx_buff) (void); void (*rx_purge) (void); int (*putsb) (const uint8_t *, int); char (*getch) (void); } TDX_UsartFunc;
デバイスからの応答の待ち時間のオフセット時間を指定。
void DX_SetTimeOutOffset (TDeviceID dvid, uint32_t t);
任意のインストラクションパケットを送信する。
コントロールテーブルを読み書きするAPIではサポートしていないパケットを送信する際に使用する事を目的としているため、不用意な使用は禁物。
bool DX_TxPacket (TDeviceID dvid, uint8_t id, TDXInstruction inst, uint8_t *param, uint32_t len, TDXErrCode *err);
ステータスパケットを受信する。
コントロールテーブルを読み書きするAPIではサポートしていないパケットを送信した際にステータスパケットを受信する事を目的としているため、不用意な使用は禁物。
bool DX_RxPacket (TDeviceID dvid, uint8_t *rdata, uint32_t rdatasize, uint32_t *rlen, uint32_t timeout, TDXErrCode *err);
bool DX_ReadBlockData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, uint32_t len, TDXErrCode *err);
指定されたID・アドレスから1バイトの情報を読み出す。
bool DX_ReadByteData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *rdata, TDXErrCode *err) {
指定されたID・アドレスから2バイトの情報を読み出す。
bool DX_ReadWordData (TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t *rdata, TDXErrCode *err) {
指定されたID・アドレスから4バイトの情報を読み出す。
bool DX_ReadLongData (TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t *rdata, TDXErrCode *err) {
bool DX_WriteBlockData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t *dat, uint32_t len, TDXErrCode *err);
指定されたID・アドレスへ1バイトの情報を書き込む。
bool DX_WriteByteData (TDeviceID dvid, uint8_t id, uint16_t adr, uint8_t dat, TDXErrCode *err) {
指定されたID・アドレスへ2バイトの情報を書き込む。
bool DX_WriteWordData (TDeviceID dvid, uint8_t id, uint16_t adr, uint16_t dat, TDXErrCode *err) {
指定されたID・アドレスへ4バイトの情報を書き込む。
bool DX_WriteLongData (TDeviceID dvid, uint8_t id, uint16_t adr, uint32_t dat, TDXErrCode *err) {
bool DX_ReadSyncData (TDeviceID dvid, uint8_t *dat, uint32_t size, uint8_t *retdat, TDXErrCode *err);
bool DX_WriteSyncData (TDeviceID dvid, uint8_t addr, uint16_t isize, uint8_t *dat, uint32_t size, TDXErrCode *err);
bool DX_Ping2 (TDeviceID dvid, uint32_t *num, TDXAlarmStatus *AlarmStatus, TDXErrCode *err);
コントロールテーブルの定義・基本シリアル通信API・各イベントにおけるコールバックルーチンを指定し、クライアント機能の初期設定を行う。
bool DX_Config (TDX_ConfParam *pDX_ConfParam);
typedef struct { struct { void *MemDefault; uint16_t CtrlTableSize; void (*wdt_feed) (void); void (*sys_reset) (void); uint32_t nvm_address; uint32_t nvm_size; } sys; struct { uint32_t (*us_init) (uint32_t); void (*us_deinit) (void); uint32_t (*us_setbaudrate) (uint32_t); uint16_t (*us_tx_buff) (void); uint16_t (*us_rx_buff) (void); void (*us_tx_purge) (void); void (*us_rx_purge) (void); int (*us_putsb) (const uint8_t *, int); char (*us_getc) (void); } us; struct { bool (*ValidPrevMapRange) (const void *pNewControlTable, uint8_t u_st, uint8_t u_len); bool (*ValidNextMapRange) (const void *pNewControlTable); void (*InitNVMValue) (void *pControlTable, const void *pNVMData); void (*ReadAction) (void *pCtrlTable); void (*WriteAction) (const void *pNewCtrlTable, void *pCtrlTable, bool force); } mem; } TDX_ConfParam;