2023年8月14日月曜日

BlackFinを使ってみるなり(13) UARTライブラリの不調原因

おはよーございます.コミケで疲労なひらりんです.

UARTのbaudrateを設定できない不調を調査します.

UARTのライブラリsourceはadi_uart_bf60x.cが使われています.
まずこの中に不調があります.

この行で、system clock周波数を得ているのですが、正常終了はするものの、3変数とも値がゼロです.
if(adi_pwr_GetSystemFreq(0u, &fsysclk, &fsclk0, &fsclk1) != ...)

原因はadi_pwr_GetSystemFreqにあり.

fileはadi_pwr_v2.cです.
やってることは単純でこれだけ.ptrがゼロってるのかなぁ?
ADI_PWR_CLK_STRUCT clk;
ADI_PWR_DEVICE *pDevice = &gPWRDevice[nDeviceNum];
GetFreq(pDevice, &clk);
*fsysclk = clk.syscclk0;
*fsclk0 = clk.sclk0;
*fsclk1 = clk.sclk1;

ptrは非ゼロでした.疑いは晴れる.
&clk = 0x11803f50
pDevice = 0x11b00ce4

ということは、GetFreq()がおかしいのかな?
clk計算の種子であるclkinがゼロでした.これは基板上の25MHz Xtalを指すと思うのですが、#defineを忘れてるのかもしれない.
 pDevice->pDevData->clkin

解決しました.main()の最初で、このpower init関数を呼ばなければならないのです.25MHzはここで設定します.
 adi_pwr_Init(0,25000000); // clkin 25MHz

悪いのはわたしでした~ 切腹してお詫びを

12へ      14へ

かしこ

8 件のコメント:

  1. murasaki
    他人の作ったライブラリを使うときにこの辺が面倒くさいですよねー。ハード周りはmain()に来る前に設定してくれる場合と、用意された初期化関数呼ばなきゃいけない場合といろいろあって、すんなりといかないですね。

    返信削除
    返信
    1. このライブラリは統一感ないんです.open()の内部でinit()してくれるのとかもあるし.

      削除
    2. murasaki
      うーん、最悪。
      ライブラリやフレームワークは頭のいい人に作って欲しいです。

      削除
    3. 「STM32・STM8は出来が良かった」と遠い眼をしています.
      STMのライブラリとかmiddlewareの出来とか、分け隔てない公開度がフツーと思ってました.

      ともあれまずは切腹してお詫びを.

      削除
    4. いえいえ別に悪くなくてこういうのは全てが貴重なノウハウですー。

      削除
    5. ならばせめて辞職をもってお詫びを..

      power initって復活の呪文みたいでいいな

      削除
    6. power_initというのもあまり耳なじみのない関数名ですねー。コールドスタート系ですかね。
      最近の遊技機系は初期化もコールドスタート時やホットスタート時やWDT発生時とか、ノイズで描画や動画デコードがハングした時のエラー復帰系とかいろいろあってややこしいです。

      削除
    7. 兵器並みのフェイルセーフ。
      ライターでハンドルに火花飛ばして初期化するのはプロの仕事師。
      いや知らんけど。

      削除