2023年8月14日月曜日

BlackFinを使ってみるなり(14) UART Tx実装

ライブラリで悩むのがプログラミングに要する時間の大半、ひらりんです.

UARTのbaudrate問題が解決したので、UARTのTxのみですが、project詰め合わせをupしておきます.こちらです.Txのみなのは、内部状態を出力させたいためです.

あまりdebugしてないのでなにか不具合はあるでしょう.ダメなら素直に死のう.

ーーーー
USB COMのhardware
UART0_TXだけしか使ってません.なので信号の取り出しはコネクタP9の3番ということになります.この先にUSB COM ICであるFT232などを取り付けることになります.
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);
}


こんなところですかね.

13へ     15へ

かしこ

0 件のコメント:

コメントを投稿