Strict Standards: Declaration of action_plugin_importoldchangelog::register() should be compatible with DokuWiki_Action_Plugin::register($controller) in /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php on line 8

Deprecated: Function split() is deprecated in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 146

Warning: Cannot modify header information - headers already sent by (output started at /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php:8) in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 236

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 390

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 390

Deprecated: preg_replace(): The /e modifier is deprecated, use preg_replace_callback instead in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/auth.php on line 387

Strict Standards: Only variables should be passed by reference in /home/aqq20189/public_html/embedders.org/kurt/wiki/doku.php on line 69

Warning: Cannot modify header information - headers already sent by (output started at /home/aqq20189/public_html/embedders.org/kurt/wiki/lib/plugins/importoldchangelog/action.php:8) in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/actions.php on line 128
sources:xtal [embedders WiKi ]
Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/template.php on line 222
 

Вариант 1

Запускаем внешний кварц, выдерживаем паузу на устаканивание и проверяем флаг. Если флаг сброшен, то все нормально - MCLK и SMCLK тактируются от кварца. В противном случае, делаем еще несколько попыток и переключаемся на тактирование от внутреннего DCO.

Частота сохраняется в глобальной переменной unsigned long xtal_freq; (модификация только в этом модуле)

Состояние в глобальном флаге g.bOscFault;

Полезно в главном цикле программы периодически проверять этот флаг и в случае возникновения сбоя обрабатывать (переинициализация периферии/сигнализация/журналирование)

/**
* @file	xtal.c
* @brief XTAL Module
*
* @author      Rustem Kalimullin
* @par E-mail:
*              hellos@mail.ru
* @par Copyright:
*              (c) Kurt, 2006
*/
 
#include "common.h"
 
#ifndef KR_EXT_XTAL_FREQ
#define KR_EXT_XTAL_FREQ 4608000L
#endif
#ifndef KR_DCO_XTAL_FREQ
#define KR_DCO_XTAL_FREQ 713200L
#endif
 
 
//---------------------------------------------------------
// Initialize HI-Speed XTAL
int setup_XTAL2( void )
{
	IE1 &= ~OFIE;                     // disable OSC_Fault interrupt
	BCSCTL1 &= ~XT2OFF;               // start XT2CLK
	unsigned int k = 0x10;            // # try
	do {
		IFG1 &= ~OFIFG;           // Clear OSCFault flag
		for(unsigned int i = 0xFFF; i; --i) __no_operation();  // Time for flag to set
		if( !(IFG1 & OFIFG) ) break; // OSCFault is clear?
	} while( --k );
 
	if( k == 0 ) {
		g.bOscFault = 1;
		BCSCTL1 |= XT2OFF;        // stop XT2CLK
		BCSCTL2 = SELM_0;         // MCLK = SMCLK = DCOCLK
		xtal_freq = KR_DCO_XTAL_FREQ;
		return 0;
	}
 
	g.bOscFault = 0;
	BCSCTL2 = SELM_2+SELS;            // MCLK Source Select 2: XT2CLK/LFXTCLK, SMCLK = XT2CLR
	xtal_freq = KR_EXT_XTAL_FREQ;
	IE1 |= OFIE;                      // enable OSC_Fault interrupt
	return 1;
}
 
//---------------------------------------------------------
// Oscill fault interrupt handler. Try to restore synchronization
#pragma vector=NMI_VECTOR
__interrupt void NMI_handler(void)
{
	if ( IFG1 & OFIFG ) {
		IE1 &= ~OFIE;                      // disable OSC_Fault interrupt
		IFG1 &= ~OFIFG;                    // Clear OSCFault flag
		for(unsigned int i = 0xFF; i; --i) __no_operation(); 
 
		if( (IFG1 & OFIFG) ) {
			BCSCTL1 |= XT2OFF;           // stop XT2CLK
			BCSCTL2 = SELM_0;            // MCLK = SMCLK = DCOCLK
			g.bOscFault = 1;
		}
		IFG1 &= ~OFIFG;
		IE1 |= OFIE;                       // enable OSC_Fault interrupt	
	} else if( IFG1 & NMIIFG ) {
		IFG1 &= ~NMIIFG;                   // Reclear NMI flag in case bounce
	} else if( IFG1 & WDTIFG ) {
		IFG1 &= ~WDTIFG;
	}
}

forum

 

Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected the timezone 'UTC' for now, but please set date.timezone to select your timezone. in /home/aqq20189/public_html/embedders.org/kurt/wiki/inc/template.php on line 738
sources/xtal.txt · Последние изменения: 2021/10/09 14:22 kurt
 

Strict Standards: Only variables should be passed by reference in /home/aqq20189/public_html/embedders.org/kurt/wiki/doku.php on line 77