ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Среда
17 июля
44581 Топик полностью
blackbit (22.11.2005 09:56, просмотров: 1) ответил Ivan S на Есть у кого нибудь пример реализации прерывания вызываемого таймером для LPC2000 реализованную ИАРе.
не грусти - похрусти вот накидал для LPC2129:
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: main.c

#include 
#include 

#include "init.h"
#include "isr.h"

// ...........................................................................
__arm void main(void)
{
  mam_Init();
  pll_Init();
  gpio_Init();

  __disable_interrupt();
  vic_Init();
  tmr_Init();
  __enable_interrupt();

  while (1)
  {
    //сделаем хоть что-нибудь:
    // цифровой выход на осциллограф - меандр с периодом (примерно) 600нс
    IO0SET = 0x20;
    IO0CLR = 0x20;
  }
}

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: isr.c

#ifndef _isr_c_
#define _isr_c_

#include 

       void vic_Init(void);
static void isr_Timer0(void);

// ---------------------------------------------------------------------------
__arm void vic_Init(void)
{
  VICProtection = 0x1;

  VICIntEnClear = 0xFFFFFFFF;  // запретим все прерывания
  VICIntSelect  = 0x0;         // прерывание классифицировано как IRQ (по умолчанию)

  // настройка вектора прерываний от таймера:
  VICVectCntl0   = 0x24;       // преравание от 4 канала установим как IRQ
                               // и назначим его на слот 0 контроллера
  VICVectAddr    = 0x0;
  VICVectAddr0   = (unsigned int) &isr_Timer0; //собственно вектор

  VICIntEnable  = 0x10;        // разрешение прерывания от канала 4 (таймер 0)

  VICProtection = 0x0;

  return;
}

// ---------------------------------------------------------------------------
// обработчик прерывания от таймера
// (сосредоточим всю мощь АРМ'а на 2-х светодиодах ;)
__arm static void isr_Timer0(void)
{
    // светодиод зеленый:
    if(T0IR & 0x01)
    {
     if(IO0PIN&0x10)   // оценим уровень на выходе порта
     {
      IO0CLR = 0x10;   // включить зеленый светодиод
     }
      else
     {
      IO0SET = 0x10;   // выключить зеленый светодиод
     }
    }

    //светодиод красный:
    if(T0IR & 0x02)
    {
     if(IO0PIN&0x80)   // оценим уровень на выходе порта
     {
      IO0CLR = 0x80;   // включить красный светодиод
     }
     else
     {
      IO0SET = 0x80;   // выключить красный светодиод
     }
    }

  T0IR   = 0x03; // сбросим внутренние IF флаги таймера каналов MR0, MR1

  return;
}

#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: init.c

#ifndef  _init_c_
#define _init_c_

#include 


void pll_Init(void);
void mam_Init(void);
void gpio_Init(void);
void tmr_Init(void);


// ---------------------------------------------------------------------------
// инициализация модуля MAM
__arm void mam_Init(void)
{
  MAMTIM = 3;   //установим 3 цикла ожидания, поскольку Fpclk > 40МГц
  MAMCR  = 2;   //MAM будет использоваться в полном режиме

  return;
}

// ---------------------------------------------------------------------------
// инициализация модуля PLL
__arm void pll_Init(void)
{
  PLLCON  = 0x01;                 // установим разрешение PLL, но без подключения к ядру

  PLLCFG  = 0x05;                 // Коэфф. умножения частоты кварца: PLLCFG+1 = 6.
                                  // Частота кварца Fosc = 11.0592 Мгц, отсюда следует:
                                  // внутренняя частота тактирования (с выхода PLL):
                                  //  Fpclk = 11.059 * 6 = 66.3552 Мгц

  PLLFEED = 0xAA;                 // произведем
  PLLFEED = 0x55;                 // фиксирующую последовательность

  while (!(PLLSTAT&0x400));       // не льсти себе, подождем захвата петли PLL

  PLLCON  = 0x03;                 // установим разрешение PLL и подключение ее выход pclk к ядру

  PLLFEED = 0xAA;                 // еще раз запускаем
  PLLFEED = 0x55;                 // фиксирующую последовательность

  return;
}

// ---------------------------------------------------------------------------
// инициализация портов
__arm void gpio_Init(void)
{
  IO0DIR = 0xB0;  // выводы порта P0 4,5, 7 установлены на выход, все остальное - на вход
  IO0SET = 0x90;

  return;
}

// ---------------------------------------------------------------------------
// инициализация таймера
__arm void tmr_Init(void)
{
  T0MR0 = 4000000;       // период срабатывания 0-го канала (взят произвольно)
  T0MR1 = 2000000;       // период срабатывания 1-го канала (взят произвольно)

  T0MCR = 0xB;           // для канала МR0: разрешено прерывание и сброс
                         // для канала МR1: разрешено прерывание

  T0PR  = 0x01;          // предделитель на 2
  T0TC  = 0x00;          // сброс счетчика
  T0TCR = 0x01;          // запуск таймера0

  return;
}

#endif
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: vectors.c

#ifndef _vectors_c_
#define _vectors_c_

#include 
#include "isr.h"

// ---------------------------------------------------------------------------
// IRQ.
#pragma vector=0x18
__irq __arm void isr_handler_irq(void)
{
  void (*interrupt_function)();
  unsigned int vector;

  vector = VICVectAddr;                     // возьмем вектор обработки прерывания
  interrupt_function = (void(*)())vector;   // настроим указатель на функцию обработки по вектору
  (*interrupt_function)();                  // вызов функции обработки прерывания по вектору

  VICVectAddr = 0;
}

// ---------------------------------------------------------------------------
// FIG.
#pragma vector=0x1C
__fiq __arm void isr_handler_fig(void)
{
  // пустой...
  VICVectAddr = 0;
}

#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: init.h

#ifndef  _init_h_
#define _init_h_

extern void pll_Init(void);
extern void mam_Init(void);
extern void gpio_Init(void);
extern void tmr_Init(void);

#endif
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// file: isr.h

#ifndef _isr_h_
#define _isr_h_

extern void vic_Init(void);

#endif
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~