ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
5 мая
38257 Топик полностью
slabnoff (01.09.2005 13:56, просмотров: 1) ответил slabnoff на LPC2214+IAR проблема c VPBDIV при отладке через MT-Link
Да я тоже думаю, что дело не в MT-link в общем-то. В общем вот код: Функция InitMain+InitCPUSpeed:
void InitCPUSpeed(int speed)
/*******************************************************************
* Название
*   InitCPUSpeed
* Описание
*   инициализация скорости процессора
* Вызов
*   (speed+1) - коэф. умножения частоты кварца
* Возвращаемые значения
*   нет
* Статус тестирования
*   функция работоспособна
********************************************************************/
{
    VPBDIV_bit.VPBDIV=0;// 1/4 скорость - если здесь сделать сразу полную скорость - то глючит
    VPBDIV_bit.XCLKDIV=0;// 1/4 скорость

    // конфигурируем банки
    BCFG0_bit.MW=0; // 8 bit ext bus
    BCFG1_bit.MW=0; // 8 bit ext bus
    BCFG2_bit.MW=0; // 8 bit ext bus
    BCFG3_bit.MW=0; // 8 bit ext bus

    BCFG0_bit.RBLE=0;
    BCFG1_bit.RBLE=0;
    BCFG2_bit.RBLE=0;
    BCFG3_bit.RBLE=0;

    BCFG0_bit.IDCY=0; // между банками и записью/чтением без задержек
    BCFG1_bit.IDCY=0; // между банками и записью/чтением без задержек
    BCFG2_bit.IDCY=0; // между банками и записью/чтением без задержек
    BCFG3_bit.IDCY=0; // между банками и записью/чтением без задержек

    // включили и подсоеденили PLL
    // а также сразу программируем скорости для flash
    // и памяти
    switch(speed)
    {
        case 1:
            // MAM config
            MAMTIM = 2; // 2 цикла ожидания при выборке из флеш
                        // для частот 20...40 МГц
            // конфигурация внешнего ОЗУ и устройств
            // ОЗУ
            BCFG0_bit.WST1=0; // хватит 3 ws на чтение = 101 нс
            BCFG0_bit.WST2=3; // хватит 3 ws на запись (+ еще 2 на обрамление) = 101 (168) нс

            // 29,4912 МГц
            PLLCON=3;
            PLLCFG_bit.PSEL=2;    // Focco=14.7456*4*(1+1)*2=235,9296 МГц
            PLLCFG_bit.MSEL=1;
            break;
        case 2:
            // MAM config
            MAMTIM = 3; // 3 цикла ожидания при выборке из флеш
                        // для частот >40 МГц
            // конфигурация внешнего ОЗУ и устройств
            // ОЗУ
            BCFG0_bit.WST1=1; // хватит 4 ws на чтение = 91 нс
            BCFG0_bit.WST2=3; // хватит 4 ws на запись (+ еще 2 на обрамление) = 91 (136) нс

            // 44,2368
            PLLCON=1;
            PLLCFG_bit.PSEL=1;    // Focco=14.7456*2*(2+1)*2=176,9472 МГц
            PLLCFG_bit.MSEL=2;
            break;
        case 3:
            // MAM config
            MAMTIM = 3; // 3 цикла ожидания при выборке из флеш
                        // для частот >40 МГц
            // конфигурация внешнего ОЗУ и устройств
            // ОЗУ
            BCFG0_bit.WST1=3; // хватит 5 ws на чтение = 84 нс
            BCFG0_bit.WST2=5; // хватит 5 ws на запись (+ еще 2 на обрамление) = 84 (118) нс

            // 58,9824
            PLLCON=1;
            PLLCFG_bit.PSEL=1;    // Focco=14.7456*2*(3+1)*2=235,9296 МГц
            PLLCFG_bit.MSEL=3;
            break;

        case 0:
        default:
            // MAM config
            MAMTIM = 1; // 1 цикл ожидания при выборке из флеш
                        // для частот <20 МГц
            // конфигурация внешнего ОЗУ и устройств
            // ОЗУ
            BCFG0_bit.WST1=0; // хватит 3 ws на чтение = 203 нс
            BCFG0_bit.WST2=1; // хватит 2 ws на запись (+ еще 2 на обрамление) = 135 (271) нс

            // PLL включен, но частота не умножается
            // 14,7456 МГц
            PLLCON=1;
            PLLCFG_bit.PSEL=3;    // Focco=14.7456*8*(0+1)*2=235,9296 МГц
            PLLCFG_bit.MSEL=0;
            break;
    }

    // активировали настройки PLL
    // включаем PLL
    PLLFEED=0xaa;    PLLFEED=0x55;

    // подождем, пока PLL войдет в захват
    while (!(PLLSTAT & 0x400));

    // теперь подключаем его к ядру
    PLLCON=3;
    PLLFEED=0xaa;    PLLFEED=0x55;

    MAMCR = 2;  //разрешили полное использование MAM

    // переключаем делитель внутренней частоты для переферии
    VPBDIV_bit.VPBDIV=1;// полная скорость
    VPBDIV_bit.XCLKDIV=1;// полная скорость
}

void InitMain(void)
/*******************************************************************
* Название
*   InitMain
* Описание
*   глобальная инициализация
* Вызов
*   нет
* Возвращаемые значения
*   нет
* Статус тестирования
*   функция работоспособна
********************************************************************/
{
    __disable_interrupt();

    // включаем нужную карту памяти для векторов прерываний
    #ifndef __CODE_IN_FLASH__
      MEMMAP = 2;
    #endif

    #ifdef __CODE_IN_FLASH__
      MEMMAP = 1;
    #endif

    PINSEL2=0xD800004; // 0000 1101 1000 0000 0000 0000 0000 0100

    InitCPUSpeed(3);
    ad660_initSPI();
    ads1256_initSPI();
    ads1256_self_cal();
    InitInterrupt();
    InitTimers();
    DIO_init();
    StartTimers();
    __enable_interrupt();
}
Далее функция обработчика прерывания таймера, если в ней раскомментировать DIO_setLED4_7 и в функции InitCPUSpeed программировать VPBDIV в самом начале, то делитель реально не переключается а остается на четверти при отладке, без отладки все работает; если же нераскомментировать DIO_setLED4_7 и в функции InitCPUSpeed программировать VPBDIV в самом начале, то все пашет:
void T1Interrupt()
/*******************************************************************
* Название
*   T1Interrupt
* Описание
*   обработчик прерывания от перовго таймера
* Вызов
*   нет
* Возвращаемые значения
*   нет
* Статус тестирования
*   функция работоспособна
********************************************************************/
{
    WORD i;
    DWORD MR2_val,T1IR_val;

    T1IR_val=T1IR;

    if( T1IR_val & (1 << 2))
    {// (MR2)

        if(!T1int_flag)
        {
            // забор данных
            SPI_send_array[0]=0;
            SPI_send_array[1]=0;
            SPI_wait_time=__MR_value__(1.0);
            SPI_PTR=0;
            SPI_NUM=2;
            VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;
            S0SPDR=0x00;
            T1int_flag=1;

            // готовим новые значения для MUX и GAIN
            if(qwert)
            {
                ADS1256_MUX_ADCON_DRATE_VALUES[0]=ADS1256_PSEL_AINCOM | ADS1256_NSEL_AINCOM;//ADS1256_PSEL_AIN0 | ADS1256_NSEL_AIN1; // AIN0_1
                ADS1256_MUX_ADCON_DRATE_VALUES[1]=7;//0x00;
            }
            else
            {
                ADS1256_MUX_ADCON_DRATE_VALUES[0]=ADS1256_PSEL_AIN0 | ADS1256_NSEL_AIN1; // AIN0_1
                ADS1256_MUX_ADCON_DRATE_VALUES[1]=0x00;
            }
            qwert=~qwert;
        }
        else if (T1int_flag == 1)
        {
            CurrentADCValue=0x00000000;
            CurrentADCValue=CurrentADCValue | ( ((DWORD)SPI_rec_array[0]) << 16);
            CurrentADCValue=CurrentADCValue | ( ((DWORD)SPI_rec_array[1]) << 8);
            CurrentADCValue=CurrentADCValue | ( (DWORD)SPI_rec_array[2] );

            if(qwert)
            {
                ADC_Res_array[((ADC_Res_array_ptr)&0x0000003f)]=CurrentADCValue;
                //ADC_Res_array_ptr++;
            }
            else
            {
                ADC_Res_array[((ADC_Res_array_ptr)&0x0000003f)+64]=CurrentADCValue;
                ADC_Res_array_ptr++;
            }
            // загрузка мультиплексоров и GAIN
            SPI_send_array[0]=1;
            SPI_send_array[1]=ADS1256_MUX_ADCON_DRATE_VALUES[0];
            SPI_send_array[2]=ADS1256_MUX_ADCON_DRATE_VALUES[1];
            SPI_wait_time=__MR_value__(1.0);
            SPI_PTR=0;
            SPI_NUM=3;
            VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;
            S0SPDR=ADS1256_CMD_WREG | (ADS1256_MUX & 0xf);

            T1int_flag=2;

        }
        else
        {
            //DIO_setLED4_7(0x0);
        }

        T1IR=1 << 2;
    }
    else if( T1IR_val & (1 << 3) )
    {// переполнение (MR3)
        T1EMR=(2 << 4) | (2 << 6) ; // mat10/11

        T1IR=1 << 3;
    }
    else if( T1IR_val & 1 )
    {// (MR0)
        //DIO_setLED4_7(0xf);
        // разрешаем прерывание по CAP10
        T1CCR=(1 << 1) | (1 << 2); // CAP10 faling edge + int
        // грузим новое значение ЦАП
        ad660_wrval(CurrentDACValue);

        T1IR=1;
    }
    else if( T1IR_val & (1 << 4) )
    {// прерывание (CAP10)

        // запрещаем прерывание по CAP10
        T1CCR=0;

        SPI_wait_time=__MR_value__(7.0);
        SPI_PTR=0;
        SPI_NUM=0;

        VICIntEnable=VIC_SPI0_bit + VIC_PWM0_bit + VIC_TIMER1_bit;

        T1int_flag=0;

        S0SPDR=ADS1256_CMD_RDATA;

        T1IR=1 << 4;
    }
}

void DIO_setLED4_7(BYTE val)
/*******************************************************************
* Название
*   DIO_setLED4_7
* Описание
*   управление отладочными светодиодами на плате
* Вызов
*   val - значения светодиодов VD1...VD4 (без необходимости инверсии)
* Возвращаемые значения
*   нет
* Статус тестирования
*   функция работоспособна
********************************************************************/
{
    val= ~ val;
    IO3CLR=0x01700000;
    IO3SET=(0x00700000 & (val << 20) ) | (0x01000000 & (val << 21) );
}