Да я тоже думаю, что дело не в 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) ); }