Мой первый ISR PIC32MX не срабатывает, код зависает

Я только начинаю работать с PIC32MX340F12 и MPLABX. Моей первой попыткой было написать прерывание по таймеру, поэтому я работал с таблицей данных, руководством по компилятору и примерами и пришел к следующему. Но это не работает ... прерывание никогда не срабатывает, и на самом деле, если я оставлю активными и разрешение прерывания по таймеру (T1IE = 1), и общее разрешение прерывания («ei»), оно работает в течение нескольких секунд, а затем зависает (говорит «цель остановлена» в режиме отладки). Если я удаляю любой из них, он просто работает бесконечно, но все равно не прерывается по таймеру. Итак, у меня, похоже, есть довольно серьезная проблема где-то в синтаксисе ISR. Оно у кого-нибудь выскакивает?

Как я уже сказал, я только начинаю, поэтому я уверен, что это довольно глупая оплошность. И, как вы могли заметить, мне нравится работать как можно более непосредственно с регистрами и директивами компилятора (а не с функциями, предоставленными производителем), я чувствую, что так я учусь больше всего.

Спасибо!

#include <stdio.h>
#include <stdlib.h>
#include "p32mx340f512h.h"
#include <stdint.h>

int x = 0;

int main(int argc, char** argv) 
{
    INTCONbits.MVEC = 1;  // turn on multi-vector interrupts
    T1CON = 0;            // set timer control to 0
    T1CONbits.TCKPS = 1;  // set T1 prescaler to 8
    PR1 = 62499;          // set t1 period
    TMR1 = 0;             // initialize the timer
    T1CONbits.ON = 1;     // activate the timer

    IPC1bits.T1IP = 5;    // T1 priority to 5
    IPC1bits.T1IS = 0;    // T1 secondary priority to 
    IFS0bits.T1IF = 0;    // clear the T1 flag
    IEC0bits.T1IE = 1;    // enable the T1 interrupts

    asm volatile("ei");   // enable interrupts

    while (1)
    {
         x++;   

         if (x > 10000)
         {
             x = 0;
         }
    }
    return (EXIT_SUCCESS);
}

bool zzz = false;

void __attribute__((interrupt(IPL5AUTO))) T1Handler(void)
{
    IFS0bits.T1IF = 0;
    zzz = true;
}

person Chris    schedule 06.03.2017    source источник


Ответы (1)


Встроенные системы несколько специализированы, и я не знаком с этой конкретной.

Однако при работе с другими системами вам, возможно, придется связать адрес функции Int Handler (T1Handler) с прерыванием, которое она обрабатывает. (Если только используемый вами фреймворк не делает это за вас при сборке?)

Все ли те имена, которые вы используете, автоматически сопоставляются системой сборки? Если нет, вам может понадобиться вызвать какую-то HW init или framework init в верхней части основного, прежде чем использовать их.

Также может потребоваться некоторая инициализация/сброс HW, прежде чем можно будет запрограммировать HW.

Надеюсь, что-то из этого поможет.


person Carlos Querol    schedule 16.03.2017