Dlinyj (dlinyj) wrote in ru_radio_electr,
Dlinyj
dlinyj
ru_radio_electr

Categories:

Вопрос по Армам LPC21**, прерываниям и GCC

Приветствую всех кто работает с армами и gcc. Товарищ rufous_spbв своё время прислал мне макетную платочку с LPC2103, поковыряв контроллер, я понял что он меня устраивает на все сто процентов для решения моих повседневных задач.

http://img-fotki.yandex.ru/get/5503/dolin-s.7/0_641bc_27d631d8_XL.jpg
lpc2103 отлаживаем прерывания


Платка с LPC, отлаживаем прерывания</b>
Плюс мне понравилось в контроллере то, что программируется он по UARTу, и его легко можно шить из консоли. Собственно говоря, это помогло мне реализовать мне мечту об удалённой отладке . Собственно говоря, передо мной стоит задача считать импульсы и время между ними. Следовательно надо осваивать внешние прерывания. Пишу я под Линукс на GCC, в качестве тулчейна использую arm-none-eabi. Написал простейшую програмку, обработчик прерывания. Суть программы такова: В майне, по умолчанию, программа мигает светодиодом, висящем на 26 порту. В случае, если происходит внешнее прерывание №1, программа зажигает или гасит (в зависимости от предыдущего состояния, определяемой переменной time_toggle) светодиод на 12 порту.



#include "config.h"
#include
"system.h"


int time_toggle=0;

void __attribute__ ((interrupt("IRQ"))) NonVectored(void)
{


if(VICIRQStatus&&0x00008000) //test for interrupt source

{

EXTINT
=0x00000002; //Clear EINT0 interrupt flag

}

if (time_toggle==0)
{
time_toggle
=1;
FIO0SET
= 1<<12; //LED off
}
else
{
time_toggle
=0;
FIO0CLR
= 1<<12; //LED on
}


EXTINT
=0x00000001; //Clear EINT0 interrupt flag
VICVectAddr=0; //Dummy write to signal end of interrupt
}



int EINTInit(void)
{
PINSEL0
=0x20000000; //enable EINT1;

VICDefVectAddr
=(unsigned long)NonVectored; // ISR address to VIC slot

VICIntEnable
=0x00008000; //Enable EINT in the VIC
}

int main (void)
{
volatile unsigned int i;
sysInit();
FIO0DIR
|= 1<<26; // P0.26 is an output
FIO0DIR |= 1<<12; // P0.12 is an output
FIO0CLR = 1<<26; //LED on

EINTInit();
FIO0SET
= 1<<12; //LED on

while(1)
{
for( i = 0; i < 1000000; i++ );
FIO0SET
= 1<<26; //LED off
// FIO0CLR = 1<<12; //LED on
for( i = 0; i < 1000000; i++ );
FIO0CLR
= 1<<26; //LED on
// FIO0SET = 1<<12; //LED off //Idle
}

}





Для удобства выкладываю весь проект: http://dl.dropbox.com/u/13582134/external_interupts.zip .Вот сколько не бьюсь - не работает. Проблема ещё заключается в синтаксисе, есть синтаксические отличия оформления кода для Keil и gcc. Если кто работал с внешними прерываниями этих камней - ай нид хелп. Что-то чтение манов, и гугление не приводит меня ни к чему. При написании программы использовались материалы:

http://electronix.ru/forum/lofiversion/index.php/t33730.html
http://www.edaboard.com/thread192589.html

http://winarm.scienceprog.com/arm-mcu-types/interrupt-system-of-arm-lpc2000-microcontrollers.html
http://www.8051projects.net/forum-t13741.html
http://www.8051projects.net/forum-t17994.html

http://www.microbuilder.eu/Tutorials/LPC2148/ADC.aspx

З.Ы. Чтобы было яснее - светодиодом в майне мигает, но прерывание не обрабатывает. Хочу понять, что я делаю не так.

UPD Всем спасибо, помог с вопросом товарищ serkon не очевидная проблема в файле crt0.S
Tags: arm, Вопрос, Прерывания, Цифра
Subscribe
  • Post a new comment

    Error

    Comments allowed for members only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 7 comments