2023年8月14日月曜日

BlackFinを使ってみるなり(15) TIMERの例外の解決

アニメキャラの腰つきを重視するひらりんです.

BF706 DSPを動かしています.

AD社提供のライブラリを使います.しかし、TIMERとUARTで例外が出るんです.

例えばこれはUARTで生じる例外.→こちらに少し書いた
A non-recoverable error or exception has occurred.
  Description:   A data CPLB miss has occurred without a corresponding CPLB entry.
  General Type:  RunTimeError

これと同類の例外がTIMERでも起きて困ってたんです.がっ解決しました.

症状: TIMER0は動くが、1や2や3をopenすると例外が生じる

以下原因を書きますが、ポエム的表現ではこんな感じでした.
AD提供のTIMERライブラリには、TMRとCTMRの2つあり、CTMRが新しいようだ.
TMRなら正常.しかしCTMRは例外を生じる.
CTMRは、ライブラリソース自体がTIMER1~7を動かすように作られていなかった

UARTの例外も似たよな事情かもしれません.

ーーーー
↓CTMRライブラリ関数を使ったTIMER1の設定はこんな関数でやってました.でもこれだと例外です.
#include <services/tmr/adi_ctmr.h>
adi_ctmr_Open (1, Timer1Handler, 0, &phCTimer1);
adi_ctmr_SetPeriod(phCTimer1, 100000);
adi_ctmr_SetScale(phCTimer1, 100);
adi_ctmr_Enable(phCTimer1, true);
adi_ctmr_EnableAutoReload(phCTimer1, true);
adi_ctmr_Activate(phCTimer1, true);

↓TMRライブラリ関数だとこうなります.これなら動きます.
#include <services/tmr/adi_tmr.h>
adi_tmr_Open(1, Timer1CBMEM, ADI_TMR_MEMORY, Timer1Handler, 0, &phCTimer1);
adi_tmr_SetMode(phCTimer1,ADI_TMR_MODE_CONTINUOUS_PWMOUT);
adi_tmr_SetPeriod(phCTimer1,100000*100);
adi_tmr_SetIRQMode(phCTimer1, ADI_TMR_IRQMODE_PERIOD);
adi_tmr_Enable(phCTimer1, true);

↓CTMRライブラリ関数の問題箇所はここです.
TIMER0~7まで8個の配列が必要ですがTIMER0しか書かれていませんから、TIMER1をopenしたらメモリ壊しますわなぁ.そして例外が生じます.1~7を追加するのはやめときます.
static ADI_CTMR_DATA gCTimerData[] = {
 { // TIMER0のみ
  (volatile ADI_CTMR_REGS  *)TCNTL,
  NULL,
  NULL,
  false
 },
}

↓TMRにも同様の配列がありまして、こちらは0~7まで記述されており、正しく動きます.
static ADI_TMR_DEV  gaTimers[] = {
 {    /* Timer 0 */
  (ADI_TMR_REGS_PTR) pREG_TIMER0_TMR0_CFG,
  (uint32_t)INTR_TIMER0_TMR0,
  0u,
  NULL
 },
 {    /* Timer 1 */
  (ADI_TMR_REGS_PTR) pREG_TIMER0_TMR1_CFG,
  (uint32_t)INTR_TIMER0_TMR1,
  1u,
  NULL
 },
以下Timer7まで記述されている....

ーーーー
訂正.
BFにはGP Timer 0-7とCore Timer 0 の2種類あるとわかりました.(コメ欄の情報より)

TMRはGP Timerのライブラリ関数です.CTMRはCore Timerのライブラリ関数です.

わたしは最初からTMR関数を使うべきだったのでした.

資料を調べました.

1)ADSP-BF7xxシリーズdatasheet
General-Purpose Timer の記述あり.
Core Timer 「coreが独自に持つtimerでsystem tickに使用」と記述あり.

2)ADSP-BF70x Blackfin+ Processor Hardware Reference
General-Purpose Timer の記述あり.
Core Timerの記述無し.

3)ADSP-BF7xx Blackfin+ Processor Programming Reference
General-Purpose Timer の記述無し.
Core Timer の記述あり.

4)system.svcからのexample
「GP timer configured in PWM out mode」exampleあり
「Core Timer configured to auto reload」exampleあり ←わたしが最初に掴んでしまったもの

14へ     16へ

かしこ

1 件のコメント:

  1. おはようございます.お、SHARC遣いの方.

    そうゆうことでしたか.調べて訂正しなくちゃ.有用な情報ありがとうございます.

    .svcを開いて出てくるsample codeがCTMRだったのでその道に入ってしまいました.

    返信削除