アニメキャラの腰つきを重視するひらりんです.
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あり ←わたしが最初に掴んでしまったもの
かしこ
おはようございます.お、SHARC遣いの方.
返信削除そうゆうことでしたか.調べて訂正しなくちゃ.有用な情報ありがとうございます.
.svcを開いて出てくるsample codeがCTMRだったのでその道に入ってしまいました.