PLLCON_bit.PLLE=l; // Включение PLL (ФАПЧ) без подключения к ядру
PLLFEED=0xAA;
PLLFEED=0x55;
while(!(PLLSTAT & PLOCK)); // Ожидание замыкания петли PLL (ФАПЧ)
PLLCON_bit.PLLC=l; // Подключение PLL (ФАПЧ) к ядру
PLLFEED=0xAA; PLLFEED=0x55;
//Инициализация МАМ и тактовой частоты периферии MAMCR_bit.MODECTRL=0; //Первоначальное отключение МАМ MAMTIM_bit.CYCLES=3; //Рекомендуется для CCLK>40 МГц
MAMCR_bit .MODECTRL=2; //Включение МАМ (функции МАМ полностью реализуются)
VPBDIV_bit.VPBDIV=0; //См. расчет PLL в секции tdefine этого файла //Инициализация GPIO
PINSEL0=0; //Младшие линии РО являются GPIO PINSEL1=0; //Старшие линии РО являются GPIO //задание направлений линий GPIO IO0DIR=0x3000000;
//ОЬОООО ООН 0000 0000 0000 0000 0000 0000 Р0.10...Р0.16 - входы // Р0.24, Р0.25 - выходы
IOlDIR=0xFF0000;
//ОЬОООО 0000 1111 1111 0000 0000 0000 0000 Р1.16...Р1.23 - выходы //задание начальных уровней на выходах IO0CLR=0x3000000; // сброс выходов Р0.24, Р0.25 IOlCLR=0xFF0000;
//ОЬОООО 0000 1111 1111 0000 0000 0000 0000 сброс выходов PI. 16...Р1.23 }
//------------------------------------------------------------------------
//Инициализация прерываний
//--------------------------------------------1---------------------------
void INTERRUPTSinit(void) {
// МЕММАР =2; // Переотобразит векторы прерываний в SRAM,
//в случае выполнения кода в SRAM //Установки контроллера прерываний
VICProtection =0; //К регистрам VIC можно обращаться в пользовательском режиме
VICIntEnClear = Oxffffffff; // Запретить все прерывания
VICDefVectAddr = (U16)&TimerInterrupt; // Адрес сервисной подпрограммы
// обработки прерываний VICIntSelect &= ~VIC_TIMER0_bit; // Линия IRQ от Таймера 0
VICVectAddrl = (U16) ScTimerlnterrupt; // Адрес сервисной подпрограммы
// обработки прерываний VICVectCntll = 0x20 I VIC_TIMER0; // Разрешить вектор прерывания от Таймера 0 VICIntEnable = VIC_TIMER0_bit; // Разрешить прерывание от Таймера 0
VICIntSelect &= ~VIC_UART0_bit; // Линия IRQ от UARTO.
VICVectAddr2 = (U16)&UART0Interrupt; // Адрес сервисной подпрограммы
// обработки прерываний VICVectCntl2 = 0x20 I VIC_UART0; // Разрешить вектор прерывания от UART0. VICIntEnable = VIC_UART0_bit; // Разрешить прерывание от UART0.
}
//------------------------------------------------------------------------
tpragma vector=0xl8
_irq _arm void irq_handler(void)
{
void (*interrupt_function)(); U16 vector;
vector = VICVectAddr; // Поместить адрес вектора в контроллер VIC
interrupt_function = (void(*)())vector;
(*interrupt_function) О; // Вызов функции вектора прерывания
VICVectAddr =0; // Сброс прерывания в VIC
}
//функция-обработчик прерывания от UART0 ---------------------------------
static void UARTOInterrupt()
//прием байта через UARTO //сброс прерывания при чтении U0RBR при приеме //индикация принятого через UART0 байта
НА ГЛАВНУЮ | | ЧТО ТАКОЕ PIC ? | | ПРОГРАММАТОР | | ПРОЕКТЫ | | СТАТЬИ | | ССЫЛКИ | | КАРТА САЙТА |