|
Здравствуйте Дмитрий!
Большое спасибо, что нашли время и откликнулись на мою просьбу.
Только Вы знаете, при компиляции своего примера вместе с Вашим xcl-файлом компоновщик последовательно выдает ошибке о том, что не описан сегмент кода(-Z(CODE)CODE...), потом, что не описан сегмент данных (-Z(DATA)DATA_I-так вроде бы) и т.д. Может я не произвел каких-либо настроек проекта в самом IAR-е? Вообще, проблемма у меня с прерываниями: в процессе отладки программы контроллер не входит в обработчик прерываний от таймера. В силу того, что исходный код, как мне кажется, правильный я начал рыться в настройках проекта и карте памяти, но пока успеха не добился. Где-то хомут, а где понять не могу.
На всякий случай привожу текст примера, может если будет время, попробуете его запустить, может, что свежим глазом увидете?!
#include unsigned int install_handler(unsigned int *vector, unsigned int function) vec = ((function - (unsigned int)vector - 8) >> 2); old_vec = *vector; old_vec &= ~0xea000000; volatile unsigned char TimerIsUp=0; void InitTimer0(); __arm __irq void Timer0ISR(void) //Timer0 ISR InitPLL(); //Initialise PLL //VIC config //Timer install_handler(irqvec, (unsigned int)Timer0ISR); } текст pll.c #include void InitPLL(); void InitPLL() P.S. Кстати IAR v4.10B, LPC2106 заменил на PLC2104, т.к. 06 явно глючил - в отладчике корректно не проходил программный сброс, т.е. часть регистров VIC не обнулялась. После перепайки нормальная работоспособность восстановилась, однако пример так и не заработал. Заранее благодарен.
E-mail:
info@telesys.ru
#include
#include
#include "PLL.c"
{
unsigned int vec, old_vec;
vec |= 0xea000000; /* add opcode for B instruction */
*vector = vec;
old_vec = ( old_vec << 2 ) + (unsigned int)vector + 8;
return(old_vec);
}
{
TimerIsUp=1; //set Flag
T0_IR=0x01; //reset interrupt flag
VICVectAddr=0; //reset VIC
return;
}
void main()
{
SCB_MEMMAP=2; // remapping!
__disable_interrupt();
VICProtection = 0; // VIC registers can be accessed in both mode
VICIntEnClear = 0xffffffff; // Disable all interrupts
VICIntSelect = 0x0; // IRQ on timer 0 line.
VICVectAddr0 = (unsigned int)&Timer0ISR;
VICVectCntl0 = 0x24; // Enable vector interrupt for timer 0.
VICIntEnable = 0x10; // Enable timer 0 interrupt.
T0_TCR = 0; // Disable timer 0.
T0_PC = 0; // Prescaler is set to no division. Cclk is 14.7456 MHz, pclk is 3.6864 MHz.
T0_MR0 = 3686; // Count up to this value. Generate 1000 Hz interrupt.
T0_MCR = 1; // interrupt on MR0 (match register 0).
T0_CCR = 0; // Capture is disabled.
T0_EMR = 0; // No external match output.
T0_TC= 0; //reset Timer counter
T0_TCR = 1; // Start timer 0.
__enable_interrupt(); //enable irq in ARM-core (intrinsic function)
for(;;);
{
SCB_PLLCFG=0x60; //Fosc=14.7456 MHz, cclk=14.7456 MHz, M=1(0000), P=8(11)
//PLLCFG=b0110'0000(0x60)
SCB_PLLFEED=0xAA; //PLL Feed Sequence
SCB_PLLFEED=0x55; //PLL Feed Sequence
SCB_PLLCON=1; //enable
SCB_PLLFEED=0xAA; //PLL Feed Sequence
SCB_PLLFEED=0x55; //PLL Feed Sequence
while (!(SCB_PLLSTAT&0x400)); //wait for the PLL to be locked
SCB_PLLCON=3; //connect
SCB_PLLFEED=0xAA; //PLL Feed Sequence
SCB_PLLFEED=0x55; //PLL Feed Sequence
SCB_VPBDIV=0x0; //pclk=cclc/4
return;
}
JTAG-рабочий. Плюс ко всему мне прислали пример под Cross Works, в котором прерывания от таймера на моей плате прекрасно работают, никакой разницы в настройках переферии контроллера я не увидел, остается толька карта памяти и startup код. И еще с ARM-ми работаю совсем недавно, поэтому много проблем, не обессудьте :-)
С уважением, Дмитрий.
Ответы