Для DASM: вопос по LPC2106
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

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

Отправлено altdv 24 июня 2004 г. 10:19

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

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

#include "Lpc210x.h"
#include "inarm.h"
#include "arm_interrupt.h"
#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