Не помогло :-(((
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено altdv 22 июня 2004 г. 12:04
В ответ на: у меня так. Ни на что не претендую, но работаю. Кучу не юзаю, поэтому очень маленькая. Не забудьте сделать REMAP векторов в RAM с 0x40000000 адреса отправлено DASM 21 июня 2004 г. 19:00

Здравствуйте Дмитрий!

Большое спасибо, что нашли время и откликнулись на мою просьбу.
Только Вы знаете, при компиляции своего примера вместе с Вашим xcl-файлом компоновщик последовательно выдает ошибке о том, что не описан сегмент кода(-Z(CODE)CODE...), потом, что не описан сегмент данных (-Z(DATA)DATA_I-так вроде бы) и т.д. Может я не произвел каких-либо настроек проекта в самом IAR-е? Вообще, проблемма у меня с прерываниями: в процессе отладки программы контроллер не входит в обработчик прерываний от таймера. В силу того, что исходный код, как мне кажется, правильный я начал рыться в настройках проекта и карте памяти, но пока успеха не добился. Где-то хомут, а где понять не могу.
На всякий случай привожу текст примера, может если будет время, попробуете его запустить, может, что свежим глазом увидете?!

#include
#include
#include
#include "PLL.c"

unsigned int install_handler(unsigned int *vector, unsigned int function)
{
unsigned int vec, old_vec;

vec = ((function - (unsigned int)vector - 8) >> 2);

old_vec = *vector;
vec |= 0xea000000; /* add opcode for B instruction */
*vector = vec;

old_vec &= ~0xea000000;
old_vec = ( old_vec << 2 ) + (unsigned int)vector + 8;

return(old_vec);
}

volatile unsigned char TimerIsUp=0;

void InitTimer0();

__arm __irq void Timer0ISR(void) //Timer0 ISR
{
TimerIsUp=1; //set Flag
T0_IR=0x01; //reset interrupt flag
VICVectAddr=0; //reset VIC
return;
}

void main()
{

InitPLL(); //Initialise PLL
SCB_MEMMAP=2; // remapping!
__disable_interrupt();

//VIC config
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.

//Timer
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.

install_handler(irqvec, (unsigned int)Timer0ISR);

__enable_interrupt(); //enable irq in ARM-core (intrinsic function)

for(;;);

}

текст pll.c

#include

void InitPLL();

void InitPLL()
{
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;
}

P.S. Кстати IAR v4.10B, LPC2106 заменил на PLC2104, т.к. 06 явно глючил - в отладчике корректно не проходил программный сброс, т.е. часть регистров VIC не обнулялась. После перепайки нормальная работоспособность восстановилась, однако пример так и не заработал.
JTAG-рабочий. Плюс ко всему мне прислали пример под Cross Works, в котором прерывания от таймера на моей плате прекрасно работают, никакой разницы в настройках переферии контроллера я не увидел, остается толька карта памяти и startup код. И еще с ARM-ми работаю совсем недавно, поэтому много проблем, не обессудьте :-)

Заранее благодарен.
С уважением, Дмитрий.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru