ライブラリで悩むのがプログラミングに要する時間の大半、ひらりんです.
UARTのbaudrate問題が解決したので、UARTのTxのみですが、project詰め合わせをupしておきます.こちらです.Txのみなのは、内部状態を出力させたいためです.
あまりdebugしてないのでなにか不具合はあるでしょう.ダメなら素直に死のう.
ーーーー
USB COMのhardware
UART0_TXだけしか使ってません.なので信号の取り出しはコネクタP9の3番ということになります.この先にUSB COM ICであるFT232などを取り付けることになります.
main()のUART初期化界隈
power界隈を初期化しないとbaudrate設定が正しく動きませんので.
adi_pwr_Init(0,25000000); // clkin 25MHz
UART設定いろいろ.UARTを使い慣れた人ならやってる事はわかるでしょう.送信終了でcallbackしてもらいたいので登録もしています.DMAもオンしてます.
adi_uart_Open(0, ADI_UART_DIR_TRANSMIT, driverMemory_uart, ADI_UART_UNIDIR_DMA_MEMORY_SIZE, &hDevice_uart);
adi_uart_SetMode(hDevice_uart, ADI_UART_MODE_UART);
adi_uart_SetBaudRate(hDevice_uart, 115200);
adi_uart_SetParity(hDevice_uart, ADI_UART_NO_PARITY);
adi_uart_SetNumStopBits(hDevice_uart, ADI_UART_ONE_STOPBIT);
adi_uart_SetWordLen(hDevice_uart, ADI_UART_WORDLEN_8BITS);
adi_uart_EnableDMAMode(hDevice_uart, true);
adi_uart_RegisterCallback(hDevice_uart, UARTCallback, (void*)0);
enableするために、先だってsubmitしなくちゃいけないのがBFライブラリの特徴と言えるかもしれない.
adi_uart_SubmitTxBuffer(hDevice_uart, txbuf_uart[0], 1);
adi_uart_EnableTx(hDevice_uart, true);
起動メッセージをCOMへ発信します.h_uart_tx_str()はひら自作です.
h_uart_tx_str("\n\n====== BF706 test program ======", true, false);
ひら自作関数
h_uartcom.cがそれです.
大雑把な構成を先に説明すると、、、
char txbuf_uart[2][100]
2本のバッファは、片方はUART Txに使用中、もう片方は送信したいデータを積むところ.それを交互に切り替えます.
なので、送信したいデータを積むのは基本的に随時行えます.(あまりにもドカドカ積むとoverflowしますけど)
積むのは随時.ならば、UART Txはいつkickされるのか?
TIMER0で0.1秒毎にkickされます.バッファが空ならスルーします.
本当はTIMER1を使いたかったのですが、不調で動きませんのでTIMER0を使います.
TIMER callback()
0.1秒割り込み毎にh_uart_tx()を呼びます."run"は動作確認用.
Timer1Handler(){
switch( Event ){
case ADI_CTIMER_EXPIRED:
h_uart_tx();
h_uart_tx_str("run",false,true);
break;
}
return;
}
h_uart_tx()
①UART送信中なら何もしない
②積みバッファの長さ
③積み荷が在ればUART Txをkickする
h_uart_tx(){
if(!bComplete_uart) return; ①
int len = strlen(txbuf_uart[tx01_uart]); ②
if(len!=0) adi_uart_SubmitTxBuffer(hDevice_uart, txbuf_uart[tx01_uart], len); ③
}
UARTCallback()
UART Txが終わったら処理します.
①終了フラグ
②バッファ切り替え
③バッファクリア
UARTCallback(){
switch (event) {
case ADI_UART_EVENT_TX_BUFFER_PROCESSED:
bComplete_uart = true; ①
if(tx01_uart==0) tx01_uart=1; ②
else tx01_uart=0;
txbuf_uart[tx01_uart][0]=0; ③
break;
}
}
バッファへ積む関数
例としてstringをバッファへ積む関数です.
末尾にspaceを追加するか、CRを追加するかはお好みです.
void h_uart_tx_str(char* x, bool CR, bool spc){
h_uart_tx_bufadd(x);
if(spc) h_uart_tx_char(0x20);
if(CR) h_uart_tx_char(0x0d);
}
こんなところですかね.
かしこ
0 件のコメント:
コメントを投稿