Ошибка в Hx0 блока защиты Хэмминга для DSP.
При выполнении программы CPU включаю защиту Хэмминга на DSP0 (Все что можно включить). Затем загружаю программу в PRAM, а так же загружаю необходимые данные в XYRAM. После устанавливаем в регистре PC точку входа и запускаю выполнение программы DSP (пример из MCSTUDIO CPU_DSP0_DSP1). Но всегда происходит ошибка в “Регистре управления контроллера Hx0”. Если запустить отладчик повторно, не снимая питания с устройства, то все работает всегда без ошибок.
Добрый день.
Под “Регистром управления контроллера Hx0” понимается регистр CSR_x0? Если да, то какие конкретно разряды установлены?
А как запускается отладчик повторно? Перезапуск MDB, командой reset из MDB, заново запускаете проект в MCStudio или др.?
Про пример из какой версии MCStudio идёт речь? В последних версиях примера с таким именем не наблюдаю.
CSR_X0 = 0x1ff0004
Запускаю через MCStudio.
Параметры запуска отладчика (Включить Хэмминг перед командой load @@FULL_PATH_TO_ELF_FILE@@):
monitor set 0xb82f4004 0xffffffff # enable all clocks
monitor set 0xb82f4400 0x00ff0001
monitor set 0xb8480300 0x00ff0001
monitor set 0xb8480308 0x00ff0001
monitor set 0xb8480310 0x00ff0001
monitor set 0xb8480318 0x00ff0001
monitor set 0xb8480320 0x00ff0001
monitor set 0xb8480328 0x00000001
monitor set 0xb848032c 0x00ff0001
monitor set 0xb8480334 0x00ff0001
Пример
Dsp0.s0
.global DSP0_calculate
.global DSP0_In_A
.global DSP0_In_B
.global DSP0_Out_C.text
DSP0_calculate:
MOVE DSP0_In_A,A0.S
MOVE DSP0_In_B,A1.S
MOVE DSP0_Out_C,A2.SMOVE (A0),R0.L
MOVE (A1),R2.LADD R0,R2,R0
MOVE R0.L,(A2)
nop
nop
nop
nop
stop
nop
nop
nop
nop.data
DSP0_In_A: .word 0
DSP0_In_B: .word 0
DSP0_Out_C: .word 0
Кусок кода main
// **** тут настраиваем DSP на 100Мгц и ждем паузу 200мс
unsigned int DSP0_InputA = 5;
unsigned int DSP0_InputB = 2;
DSP0_In_A = DSP0_InputA;
DSP0_In_B = DSP0_InputB;
struct DSP_QSTR_BITS DSP_QSTR;
*((unsigned int*)&DSP_QSTR) = 0;
// прерывание по STOP
DSP_QSTR.STP0 = 1;
DSP_CSR.MASKR_DSP.data = *((unsigned int*)&DSP_QSTR);
// разрешить прерывания
SYSTEM_Interrupt(1);
DSP0_PCU.PC.data = ((unsigned int) &DSP0_calculate - 0xb8440000) >> 2;
DSP0_PCU.DCSR.bits.RUN = 1;
// ждем бесконечно
while (1);
В итоге должно сработать прерывание, а оно не срабатывает с 1 раза. Т.к в CSR_x0 ошибки Хэмминга. Но если перезапустить отладчик, все начинает стабильно работать.
Еще заметил, что в регистре DSP0_PCU.DCSR= 0x480048; Устанавливается 6 бит который находится в резерве.