|
Столкнулся с такой фигней. Имею кварц на 7.37 МГц, подключенный к XTAL1. Код переключения с RC на XTAL1 (взят из примера)
*********************************************
BCSCTL1 |= XTS; // High-Frequency Mode
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (byte i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
BCSCTL2 |= SELM1+SELM0; // MCLK = LFXT1 (safe)
*********************************************
Все прекрасно работает на нескольких устройствах. Но вот на очередном новом девайсе возник такой эффект: проц не переключается на XTAL1 - продолжает тактироватся от DCO на частоте около 700 кГц (которая по умолчанию). Код вышеприведенный выполняется, все биты в регистрах стоят, как надо.
Путем различных экспериментов удалось заставить его все-таки переключаться. Для этого, как выяснилось, надо тот цикл "сброс флага-задержка-проверка флага" поставить еще раз, т.е. продублировать код:
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (byte i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) != 0); // OSCFault flag still set?
Так работает железно.
Есть какие-нибудь разумные объяснения такому поведению?
E-mail: info@telesys.ru