Доброго времени суток.
Заимел тут случаем камень ATSAM4S16C и начал знакомиться с ARM архитектурой. Знакомлюсь в Keil uVision версии 4.5.х или 4.3.х точно не помню.
Светодиодиком моргать научился, теперь пытаюсь освоить прерывания. Никак не могу взять в толк, каким образом нужно писать название функции обработчика прерывания и где их взять. Прерывание пытаюсь сделать по фронту на пинах 0 и 1 порта B.
Вот код программы
|
Код:
|
#include ‹SAM4S16C.h›
#include "system_SAM4S.h"
#define MASK_WRITE_PIOA 0xFFFFF9FF
#define MASK_WRITE_PIOB 0xFFFFF00C //dva poslednih baita nugny dlya zadaniya regimov
#define MASK_WRITE_PIOC 0xFFFFFFFF
#define MASK_READ_clk 0x00000001
#define MASK_READ_command 0x00000002
volatile unsigned long SysTickCnt; /* SysTick Counter */
unsigned char command=0, clk=0, i=0;
/*----------------------------------------------------------------------------
SysTick Handler
*----------------------------------------------------------------------------*/
void SysTick_Handler (void) { /* SysTick Interrupt Handler (1ms) */
SysTickCnt++;
}
/*----------------------------------------------------------------------------
Delay Function
*----------------------------------------------------------------------------*/
void Delay (unsigned long tick) { /* Delay Function */
unsigned long systickcnt;
systickcnt = SysTickCnt;
while ((SysTickCnt - systickcnt) ‹ tick);
}
__irq void pfnPIOB_Handler(void)
{
// Delay(5);
// command=0x02; //( (command ‹‹ 1) | ( (PIO_PDSR_P1 & PIOB-›PIO_PDSR) ›› 1 ) );
// i++;
PIOC-›PIO_SODR=1‹‹1;
}
void PIO_init(void)
{
PIOA-›PIO_WPMR = ((1‹‹9)|(1‹‹10)); //Write protection
PIOB-›PIO_WPMR = ((1‹‹4)|(1‹‹5)|(1‹‹6)|(1‹‹7)|(1‹‹8)|(1‹‹9)|(1‹‹10)|(1‹‹11)); //Write protection
PIOB-›PIO_ODR = ((1‹‹0)|(1‹‹1)); //Output dis
PIOB-›PIO_MDER = ((1‹‹0)|(1‹‹1));//Multi-drive dis
PIOB-›PIO_IFER = ((1‹‹0)|(1‹‹1)); //Input filter enable
PIOB-›PIO_PUER = ((1‹‹0)|(1‹‹1)); //Pull-up resistor
PIOB-›PIO_SODR = ((1‹‹0)|(1‹‹1));
}
void LED_init()
{
PIOA-›PIO_PER=((1‹‹7)|(1‹‹26)|(1‹‹11)|(1‹‹8)|(1‹‹12)); //PIO Enable, direct select the control pin
PIOA-›PIO_OER=((1‹‹7)|(1‹‹26)|(1‹‹11)|(1‹‹8)|(1‹‹12)); // Output enable
PIOA-›PIO_PUER=((1‹‹7)|(1‹‹26)|(1‹‹11)|(1‹‹8)|(1‹‹12)); // Pull-up resistor enable
PIOA-›PIO_OWER=((1‹‹7)|(1‹‹26)|(1‹‹11)|(1‹‹8)|(1‹‹12)); // Output write enable
PIOC-›PIO_PER=((1‹‹3)|(1‹‹2)|(1‹‹1)); //PIO Enable, direct select the control pin
PIOC-›PIO_OER=((1‹‹3)|(1‹‹2)|(1‹‹1)); // Output enable
PIOC-›PIO_PUER=((1‹‹3)|(1‹‹2)|(1‹‹1)); // Pull-up resistor enable
PIOC-›PIO_OWER=((1‹‹3)|(1‹‹2)|(1‹‹1)); // Output write enable
}
int main(void)
{
SystemCoreClockUpdate(); /* Get Core Clock Frequency */
SysTick_Config(SystemCoreClock/1000); /* Generate interrupt each 1 ms */
PIO_init();
LED_init();
__enable_irq();
PIOB-›PIO_IER=PIO_IER_P0|PIO_IER_P1; // PIO interrupt mask
PIOA-›PIO_PER=(1‹‹25); //PIO Enable, direct select the control pin
PIOA-›PIO_OER=(1‹‹25); // Output enable
//PIOA-›PIO_PUER=(1‹‹25); // Pull-up resistor enable
PIOA-›PIO_OWER=(1‹‹25); // Output write enable
PIOA-›PIO_MDDR=(1‹‹25);
PIOC-›PIO_PER=((1‹‹5)|(1‹‹6)); //PIO Enable, direct select the control pin
PIOC-›PIO_OER=((1‹‹5)|(1‹‹6)); // Output enable
//PIOC-›PIO_PUER=((1‹‹5)|(1‹‹6)); // Pull-up resistor enable
PIOC-›PIO_OWER=((1‹‹5)|(1‹‹6)); // Output write enable
PIOC-›PIO_SODR=1‹‹1;
PIOC-›PIO_SODR=1‹‹2;
Delay(1000);
PIOC-›PIO_CODR=0xFFFFFFFF;
for(;;)
{
PIOC-›PIO_CODR=1‹‹5;
PIOA-›PIO_SODR=1‹‹25;
Delay(100);
PIOC-›PIO_CODR=1‹‹5;
PIOA-›PIO_CODR=1‹‹25;
Delay(100);
if (PIOB-›PIO_ISR)
{
PIOC-›PIO_SODR=1‹‹2;
Delay(1000);
PIOC-›PIO_CODR=0xFFFFFFFF;
}
}
} |