Пару дней бьюсь и ничего не получается,
Задача такая использовать встроенный генератор 8МГц для тактирования 8 МГц (По дефолту тактирование от этого генератора делится на 4).
Микроконтроллер atxmega32e5.
В интернете всех интересует как затактировать его от встроенного 32МГц генератора, что кстати у меня тоже не получается. Хотя тактирование от кварца проходит.
Начал разбирать свой старый код для atxmega8e5, там у меня была задача как тактировать от внешнего кварца, код такой:
Код
OSC.XOSCCTRL = xoscctrl_reg;
OSC.CTRL = OSC_XOSCEN_bm;
while( !( OSC.STATUS & OSC_XOSCRDY_bm ) );
OSC.PLLCTRL = pllctrl_reg;
OSC.CTRL |= OSC_PLLEN_bm;
while ( !( OSC.STATUS & OSC_PLLRDY_bm ) );
asm ("ldi r16,0xd8");
asm ("ldi r17,0x04");
asm ("out 0x34,r16");
asm ("sts 64,r17");
OSC.CTRL = OSC.CTRL & 0xFE; //Отключение внутреннего 2 МГц генератора
OSC.CTRL = OSC_XOSCEN_bm;
while( !( OSC.STATUS & OSC_XOSCRDY_bm ) );
OSC.PLLCTRL = pllctrl_reg;
OSC.CTRL |= OSC_PLLEN_bm;
while ( !( OSC.STATUS & OSC_PLLRDY_bm ) );
asm ("ldi r16,0xd8");
asm ("ldi r17,0x04");
asm ("out 0x34,r16");
asm ("sts 64,r17");
OSC.CTRL = OSC.CTRL & 0xFE; //Отключение внутреннего 2 МГц генератора
На эти переменные xoscctrl_reg, pllctrl_reg не обращайте внимания они инициализированы выше в коде.
Самое, что интересное стало сейчас для меня что такой код работает, А что именно мне показалось интересным? То, что в этом коде нет записи в регистр CLK.CTRL
и по идее код на asm вроде как лишний, поскольку для изменения значения в регистре OSC не нужно записывать данные в CCP, но это я не проверял.
(возможно как раз при записи в CCP, происходит автоматическое изменение в регистре CLK.CTRL)
По аналогии я написал такой код:
Код
OSC.CTRL |= OSC_RC8MEN_bm;
while( !( OSC.STATUS & OSC_RC8MRDY_bm ) );
asm ("ldi r16,0xD8");
asm ("ldi r17,0x04");
asm ("out 0x34,r16");
asm ("sts 64,r17");
CLK.CTRL = CLK_SCLKSEL_RC8M_gc;
OSC.CTRL &= ~(1<<OSC_RC2MEN_bp);
while( !( OSC.STATUS & OSC_RC8MRDY_bm ) );
asm ("ldi r16,0xD8");
asm ("ldi r17,0x04");
asm ("out 0x34,r16");
asm ("sts 64,r17");
CLK.CTRL = CLK_SCLKSEL_RC8M_gc;
OSC.CTRL &= ~(1<<OSC_RC2MEN_bp);
Хотя я перепробовал очень много вариаций, и все тщетно.
При программной отладке происходит зависание в цикле, на железе зависаний нет, но частота не изменяется.
Можно конечно забить и поставить кварц, под него разведено, но так охото понять почему у меня ничего не получается.