Пишу init_code на асме, никак не могу запустить прерывания от таймер. Может кто увидит что тут не так
Код
#include <defBF533.h>
#include "uartlib.h"
#include "sicnames.h"
#define UART_BAUD 9600 // uart baudrate, must be 9600 bps
#define XTAL 32768000 // quarz frequency in Hz
.section data1;
.align 4;
.var aEchoFifo[16];
.byte sHead[] = 13,10,'-------------------------------',
13,10,'ADSP-BF533 Blackfin is speaking',
13,10,'(DL =',0;
.section program;
/*******Pre-Init Section*********************************************/
/*******DO NOT MODIFY************************************************/
[--SP] = ASTAT; //Save Regs onto stack
[--SP] = RETS;
[--SP] = R7;
[--SP] = R6;
[--SP] = R5;
[--SP] = R4;
[--SP] = R3;
[--SP] = R2;
[--SP] = R1;
[--SP] = R0;
[--SP] = P5;
[--SP] = P4;
[--SP] = P3;
[--SP] = P2;
[--SP] = P1;
[--SP] = P0;
[--SP] = I0;
[--SP] = I1;
[--SP] = I2;
[--SP] = I3;
[--SP] = B0;
[--SP] = B1;
[--SP] = B2;
[--SP] = B3;
[--SP] = M0;
[--SP] = M1;
[--SP] = M2;
[--SP] = M3;
[--SP] = L0;
[--SP] = L1;
[--SP] = L2;
[--SP] = L3;
/********************************************************************/
/*******Init Code Section********************************************/
/*******SPI Setup************/
P0.L = lo(SPI_BAUD);
P0.H = hi(SPI_BAUD);
R0 = 0x0008(Z);
W[P0] = R0;
SSYNC;
call SetupInterruptVectors;
call InitTimer;
P0.L = lo(SIC_IMASK);
P0.H = hi(SIC_IMASK);
R0 = [P0];
BITSET(R0,16); // enable timer0 interrupt
[P0] = R0;
ssync;
P0.L = LO(IMASK);
P0.H = HI(IMASK);
R0 = [P0];
BITSET(R0,11); // ivg11 enabled
[P0] = R0;
/********UART setupr*********/
P0.L = lo(UART_GCTL);
P0.H = hi(UART_GCTL);
R0 = (XTAL*10)/(5*16*UART_BAUD); // set baudrate at 9600
call uart_init;
p1.l = sHead;
p1.h = sHead;
call uart_puts;
///////////////////////////////////////
P2.L = FIO_DIR & 0xffff;
P2.H = FIO_DIR >>16;
R0 = W[P2] (Z);
BITSET(R0,6); // set LED port to output
W[P2] = R0;
P2.L = FIO_FLAG_D & 0xffff;
P2.H = FIO_FLAG_D >>16;
R0 = W[P2] (Z);
BITSET(R0,6); // switch on LED
W[P2] = R0;
rx_data:
rx_wait:
r1 = w[p0+UART_LSR-UART_GCTL] (z);
CC = bittst(r1,bitpos(DR));
if !CC jump rx_wait;
r0 = w[p0+UART_RBR-UART_GCTL] (z);
call uart_putc;
P2.L = FIO_FLAG_T & 0xffff;
P2.H = FIO_FLAG_T >>16;
R0 = W[P2] (Z);
BITSET(R0,6);
W[P2] = R0;
jump rx_data;
//Set PF as input
P2.L = FIO_DIR & 0xffff;
P2.H = FIO_DIR >> 16;
R0 = W[P2](Z);
BITCLR(R0,10); //Set PF10 as input
W[P2] = R0;
//Set Active High Polarity
P2.H = FIO_POLAR >> 16;
P2.L = FIO_POLAR & 0xFFFF;
R0 = W[P2](Z);
BITCLR(R0,10); //Set active low polarity for PF10
W[P2] = R0;
//Enable PF
P2.H = FIO_INEN >> 16;
P2.L = FIO_INEN & 0xFFFF;
R0 = W[P2](Z);
BITSET(R0,10); //Enable PF10
W[P2] = R0;
//Read Flag Register
P2.H = FIO_FLAG_D >> 16;
P2.L = FIO_FLAG_D & 0xFFFF;
R0 = W[P2](Z); //Read the FLAG register
CC = BITTST(R0,10); //Check if PF10 was asserted
IF CC JUMP PF10_NOT_ASSERTED;
R3.H = 0x0000;
R3.L = 0x0100;
JUMP DONE;
PF10_NOT_ASSERTED:
R3.H = 0x0001;
R3.L = 0x9C80; // user programm start from page 200
DONE:
/*******Post-Init Section********************************************/
/*******DO NOT MODIFY************************************************/
L3 = [SP++];
L2 = [SP++];
L1 = [SP++];
L0 = [SP++];
M3 = [SP++];
M2 = [SP++];
M1 = [SP++];
M0 = [SP++];
B3 = [SP++];
B2 = [SP++];
B1 = [SP++];
B0 = [SP++];
I3 = [SP++];
I2 = [SP++];
I1 = [SP++];
I0 = [SP++];
P0 = [SP++];
P1 = [SP++];
P2 = [SP++];
P3 = [SP++];
P4 = [SP++];
P5 = [SP++];
R0 = [SP++];
R1 = [SP++];
R2 = [SP++];
RETS = [SP++];
R4 = [SP++];
R5 = [SP++];
R6 = [SP++];
R7 = [SP++];
RETS = [SP++];
ASTAT = [SP++];
/********************************************************************/
RTS;
//*******************************************************************
// Setup Timer interrupt vector
//*******************************************************************
SetupInterruptVectors:
P0.H = hi(EVT11);
P0.L = lo(EVT11);
R0.L = TIMER_ISR;
R0.H = TIMER_ISR; // Default Real Time Clock Handler (Int8)
[P0] = R0;
RTS;
InitTimer:
P4.H = hi(TIMER0_CONFIG);
P4.L = lo(TIMER0_CONFIG);
R1 = 0x59; // PWM_OUT | PERIOD_CNT | IRQ_ENA | OUT_DIS
W[P4] = R1;
P4.H = hi(TIMER0_PERIOD);
P4.L = lo(TIMER0_PERIOD);
R1 = 32000;
W[P4] = R1;
P4.H = hi(TIMER0_WIDTH);
P4.L = lo(TIMER0_WIDTH);
R1 = 5;
W[P4] = R1;
P4.H = hi(TIMER_ENABLE);
P4.L = lo(TIMER_ENABLE);
R1 = 1;
W[P4] = R1;
RTS;
TIMER_ISR: // Real Time Clock Wake-Up Interrupt
P4.H = hi(TIMER_STATUS);
P4.L = lo(TIMER_STATUS);
R1 = 1;
W[P4] = R1;
P2.L = FIO_FLAG_T & 0xffff;
P2.H = FIO_FLAG_T >>16;
R0 = W[P2] (Z);
BITSET(R0,6);
W[P2] = R0;
RTI;
По прерываниям от таймера должен инвертироваться флаг PF6, тоже самое происходит когда приходит символ через UART - это работает. Не смущайтесь что моя программа не выходит из этого init_code, это пока для отладки.