Программирование и переключение на внутренний 32 МГц генератор работает.
Переключение на кварцевый генератор никак.
В начале проверил/перепроверил аппаратуру.
Прозвонил все выводы XTAL, специально приобрел конденсаторы 15пФ.
Перепробовал три разных кварца из разных партий.
Все равно генерации нет, на одном выводе логический ноль (~0,1В), на втором единица(~3,3В)
Перечитал документацию, нашел особенность, защиты тактирования.
Взял примеры с этого сайта и с других.
Не менее 6 разных вариантов.
CODE
/* От RC генератора работает
CLKSYS_Enable( OSC_RC32MEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_2_gc );
do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
CLKSYS_XOSC_Config( OSC_FRQRANGE_9TO12_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
while( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
*/
// симулятор останавливается на третьем операторе - тактирования нет
/*
OSC.XOSCCTRL = 0xCB; // выбор внешнего генератора с временем запуска 16 тыс. CLK и частотой 12-16 МГц
OSC.CTRL = 0x08; // разрешение работы внешнего генератора
while((OSC.STATUS & 0x08) == 0 ); // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC3; // настройка блока PLL на синхронизацию от внешнего источника и 3-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ); // ожидание появления в регистре статуса бита включения блока PLL
CCP = 0xD8; // включение защиты от изменения регистров ввода-вывода на время изменения синхронизации
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
*/
/*
// симулятор останавливается на четвертом операторе - тактирования нет
CCP = 0xD8;
OSC.XOSCCTRL = 0xCB;
OSC.PLLCTRL = 0xC3;
OSC.CTRL = 0x08;
while((OSC.STATUS & 0x08) == 0);
OSC.CTRL = OSC.CTRL | 0x10;
while((OSC.STATUS & 0x10) == 0 );
CLK.CTRL=0x04;
OSC.CTRL = OSC.CTRL & 0xFE;
*/
// симулятор останавливается на третьем операторе - тактирования нет
/*
OSC.XOSCCTRL=0xCB; // 16MHz, start time 16000 clk
OSC.CTRL= 0x08; // enable external clock
while((OSC.STATUS & 0x08) == 0 ); // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC2; // настройка блока PLL на синхронизацию от внешнего источника и 2-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ); // ожидание появления в регистре статуса бита включения блока PLL
CCP=0xD8; // load protect IO
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
OSC.XOSCCTRL =0x4b;
OSC.CTRL = 0x08;
while (!(OSC.STATUS &OSC_XOSCRDY_bm));
CCPWrite(&CLK.CTRL,0x03);
OSC.CTRL = 0x08;
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
CLKSYS_XOSC_Config( OSC_FRQRANGE_2TO9_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
do {} while ( CLKSYS_IsReady( OSC_FRQRANGE_9TO12_gc ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
CLKSYS_Disable( OSC_RC2MEN_bm );
CLKSYS_PLL_Config ( OSC_PLLSRC_XOSC_gc, 4);
CLKSYS_Enable( OSC_PLLEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
*/
CLKSYS_Enable( OSC_RC32MEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_2_gc );
do {} while ( CLKSYS_IsReady( OSC_RC32MRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_RC32M_gc );
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
CLKSYS_XOSC_Config( OSC_FRQRANGE_9TO12_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
while( CLKSYS_IsReady( OSC_XOSCRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
*/
// симулятор останавливается на третьем операторе - тактирования нет
/*
OSC.XOSCCTRL = 0xCB; // выбор внешнего генератора с временем запуска 16 тыс. CLK и частотой 12-16 МГц
OSC.CTRL = 0x08; // разрешение работы внешнего генератора
while((OSC.STATUS & 0x08) == 0 ); // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC3; // настройка блока PLL на синхронизацию от внешнего источника и 3-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ); // ожидание появления в регистре статуса бита включения блока PLL
CCP = 0xD8; // включение защиты от изменения регистров ввода-вывода на время изменения синхронизации
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
*/
/*
// симулятор останавливается на четвертом операторе - тактирования нет
CCP = 0xD8;
OSC.XOSCCTRL = 0xCB;
OSC.PLLCTRL = 0xC3;
OSC.CTRL = 0x08;
while((OSC.STATUS & 0x08) == 0);
OSC.CTRL = OSC.CTRL | 0x10;
while((OSC.STATUS & 0x10) == 0 );
CLK.CTRL=0x04;
OSC.CTRL = OSC.CTRL & 0xFE;
*/
// симулятор останавливается на третьем операторе - тактирования нет
/*
OSC.XOSCCTRL=0xCB; // 16MHz, start time 16000 clk
OSC.CTRL= 0x08; // enable external clock
while((OSC.STATUS & 0x08) == 0 ); // ожидание появления в регистре статуса бита включения синхронизации от внешнего генератора
OSC.PLLCTRL = 0xC2; // настройка блока PLL на синхронизацию от внешнего источника и 2-х кратоное умножение
OSC.CTRL = OSC.CTRL | 0x10; // разрешение работы блока PLL
while((OSC.STATUS & 0x10) == 0 ); // ожидание появления в регистре статуса бита включения блока PLL
CCP=0xD8; // load protect IO
CLK.CTRL = 0x04; // настройка системной синхронизации от блока PLL
OSC.CTRL = OSC.CTRL & 0xFE; // отключение системной синхронизации от внутреннего RC-генератора частотой 2 МГц
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
OSC.XOSCCTRL =0x4b;
OSC.CTRL = 0x08;
while (!(OSC.STATUS &OSC_XOSCRDY_bm));
CCPWrite(&CLK.CTRL,0x03);
OSC.CTRL = 0x08;
*/
/*
// симулятор останавливается на третьем операторе - тактирования нет
CLKSYS_XOSC_Config( OSC_FRQRANGE_2TO9_gc, false, OSC_XOSCSEL_XTAL_16KCLK_gc );
CLKSYS_Enable( OSC_XOSCEN_bm );
do {} while ( CLKSYS_IsReady( OSC_FRQRANGE_9TO12_gc ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_XOSC_gc );
CLKSYS_Disable( OSC_RC2MEN_bm );
CLKSYS_PLL_Config ( OSC_PLLSRC_XOSC_gc, 4);
CLKSYS_Enable( OSC_PLLEN_bm );
CLKSYS_Prescalers_Config( CLK_PSADIV_1_gc, CLK_PSBCDIV_1_1_gc );
do {} while ( CLKSYS_IsReady( OSC_PLLRDY_bm ) == 0 );
CLKSYS_Main_ClockSource_Select( CLK_SCLKSEL_PLL_gc );
*/
Пробовал менять оптимизацию по скорости и размеру (IAR 6.10) толку никакого.
Наверное не там копаю.