⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 clk_deal.c

📁 单片机程序代码,经过很详细的测试.呵呵,硬件相关.
💻 C
📖 第 1 页 / 共 2 页
字号:
unsigned char get_clock_stat(struct cmd_para_save *get_clock){
//C14取得指定输入时钟源的状态
unsigned char xdata clksource;
unsigned char xdata return_value;

	clksource = get_clock -> clock_state_num;
	return_value = get_clock_state(clksource);
	if (!GetResRdyTbl(10))
		SetResRdyTbl(10); 
	return (return_value);
}


void report_clock_stat(unsigned char clk_state){
//C14回应函数
    tx_buf[0] = '$';
	tx_buf[1] = '2';
	tx_buf[2] = '1';
	tx_buf[3] = 0x43;
	tx_buf[4] = 0x31;
	tx_buf[5] = 0x34;
	tx_buf[6] = '0';
	tx_buf[7] = '0';
	tx_buf[8] = '0';
	tx_buf[9] = '3';
	if (clk_state == 0x0A){
		tx_buf[10] = '2';
		tx_buf[11] = '0';
		tx_buf[12] = '0';
	}
	else { 
	tx_buf[10] = '0';
	tx_buf[11] = (clk_state & 0x0F) + 0x30;
	tx_buf[12] = ((clk_state >> 4) & 0x0F) +0x30;
	}
	tx_buf[13] = '*';
	tx_buf_pointer = 0;	
	while(tx_buf[tx_buf_pointer] != '*'){
		SBUF = tx_buf[tx_buf_pointer];
		while(tx_done == 0);
		tx_done = 0;
		tx_buf_pointer++;
	}
	SBUF = tx_buf[tx_buf_pointer];          //发送最后一个字符'*'
	while(tx_done == 0);
	tx_done = 0;
}

void set_clock_switch(unsigned char clksource){
//设置时钟倒换函数
	switch (clksource){
		case 0: S_reg = 0x81;                  	//配置时钟源为光口0线路时钟
				clk_source = 0;
				break;
		case 1: S_reg = 0x82;                  	//配置时钟源为光口1线路时钟
				clk_source = 1;
				break;
		case 2: S_reg = 0x86;                  	//配置时钟源为光口2线路时钟
				clk_source = 2;
				break;
		case 3: S_reg = 0x87;                  	//配置时钟源为光口3线路时钟
				clk_source = 3;
				break;
		case 7: S_reg = 0x89;					//配置时钟源为第二外时钟
				clk_source = 7;
				break;
		case 6: S_reg = 0x8B;           		//配置时钟源为第一外时钟源
				clk_source = 6;
				break;
		case 8: S_reg = 0xC0;                   //配置时钟源自由振荡模式
				clk_source = 8;
				break;
		case 9: S_reg = 0xE0;                   //配置时钟源为保持模式
				clk_source = 9;
				break;
		default:break;
	}
}

void clk_switch(void){					
//主用时钟源丢失,自动倒换函数
unsigned char xdata temp;
	temp = get_clock_state(clkarray[0]);
	if (temp >> 4 == 1){
		set_clock_switch(clkarray[0]);
		clk_prio = 0;
	}
	else {
		temp = get_clock_state(clkarray[1]);
		if (temp >> 4 == 1){
			set_clock_switch(clkarray[1]);
			clk_prio = 1;
		}
		else {
			temp = get_clock_state(clkarray[2]);
			if (temp >> 4 == 1){
				set_clock_switch(clkarray[2]);
				clk_prio = 2;
			}
			else {
				temp = get_clock_state(clkarray[3]);
				if (temp >> 4 == 1){
					set_clock_switch(clkarray[3]);
					clk_prio = 3;
				}
				else {
					temp = get_clock_state(clkarray[4]);
					if (temp >> 4 == 1){
						set_clock_switch(clkarray[4]);
						clk_prio = 4;
					}
				  	else {
						temp = get_clock_state(clkarray[5]);
						if (temp >> 4 == 1){
							set_clock_switch(clkarray[5]);
							clk_prio = 5;
						}
					    else {
							temp = get_clock_state(clkarray[6]);
							if (temp >> 4 == 1){
								set_clock_switch(clkarray[6]);
								clk_prio = 6;
							}
							else {
								temp = get_clock_state(clkarray[7]);
								if (temp >> 4 == 1){
									set_clock_switch(clkarray[7]);
									clk_prio = 7;
								}
							}
					    }
				  	}
				}
			}
		}
	}
}

void get_clk_prio(unsigned char clksource){							
//得出主用源时钟的优先级
unsigned char xdata temp;
	clk_prio = 8;
	temp = 8;
	while (temp){
		if (clksource == clkarray[temp - 1]){
			clk_prio = temp - 1;
		}
		temp--;
	}
}


void check_switch_clk(void){
//主用时钟源不是最高优先级时钟,自动倒换函数
unsigned char xdata temp;
unsigned char xdata clk_pr;
unsigned char xdata flg;
	flg = 8;
	for (clk_pr = 6; clk_pr >= 1; clk_pr--){
		if (clk_prio > clk_pr){							//得到优先级的时钟状态
			temp = get_clock_state(clkarray[clk_pr]);
			if (temp >> 4){
				clkprio_array[clk_pr] += 1;				//时钟源有效计数值加1
				if (clkprio_array[clk_pr] > 300){		//计满5分钟
					flg = clk_pr;
					clkprio_array[clk_pr] = 0;
				}
			}
			else clkprio_array[clk_pr] = 0;				//时钟源无效清除计数
		}
	}		
	temp = get_clock_state(clkarray[0]);				//得到优先级0的时钟状态
	if (temp >> 4){
		clkprio_array[0] += 1;							//时钟源有效计数值加1
		if (clkprio_array[0] > 300){					//计满5分钟
			flg = 0;
			clkprio_array[0] = 0;
		}
	}
	else clkprio_array[0] = 0;							//时钟源无效清除计数

	if (flg < 8){
		set_clock_switch(clkarray[flg]);				//自动倒换时钟源
	}
/*	if (clk_prio > 6){									//得到优先级6的时钟状态
		temp = get_clock_state(clkarray[6]);
		if (temp >> 4){
			clkprio_array[6] += 1;						//时钟源有效计数值加1
			if (clkprio_array[6] > 300){				//计满5分钟
				flg = 6;
				clkprio_array[6] = 0;
			}
		}
		else clkprio_array[6] = 0;						//时钟源无效清除计数
	}
	if (clk_prio > 5){
		temp = get_clock_state(clkarray[5]);
		if (temp >> 4){
			clkprio_array[5] += 1;
			if (clkprio_array[5] > 300){
				flg = 5;
				clkprio_array[5] = 0;
			}
		}
		else clkprio_array[5] = 0;
	}
	if (clk_prio > 4){
		temp = get_clock_state(clkarray[4]);
		if (temp >> 4){
			clkprio_array[4] += 1;
			if (clkprio_array[4] > 300){
				flg = 4;
				clkprio_array[4] = 0;
			}
		}
		else clkprio_array[4] = 0;
	}
	if (clk_prio > 3){
		temp = get_clock_state(clkarray[3]);
		if (temp >> 4){
			clkprio_array[3] += 1;
			if (clkprio_array[3] > 300){
				flg = 3;
				clkprio_array[3] = 0;
			}
		}
		else clkprio_array[3] = 0;
	}
	if (clk_prio > 2){
		temp = get_clock_state(clkarray[2]);
		if (temp >> 4){
			clkprio_array[2] += 1;
			if (clkprio_array[2] > 300){
				flg = 2;
				clkprio_array[2] = 0;
			}
		}
		else clkprio_array[2] = 0;
	}
	if (clk_prio > 1){
		temp = get_clock_state(clkarray[1]);
		if (temp >> 4){
			clkprio_array[1] += 1;
			if (clkprio_array[1] > 300){
				flg = 1;
				clkprio_array[1] = 0;
			}
		}
		else clkprio_array[1] = 0;
	}
	temp = get_clock_state(clkarray[0]);				//得到优先级0的时钟状态
	if (temp >> 4){
		clkprio_array[0] += 1;							//时钟源有效计数值加1
		if (clkprio_array[0] > 300){						//计满5分钟
			flg = 0;
			clkprio_array[0] = 0;
		}
	}
	else clkprio_array[0] = 0;							//时钟源无效清除计数
	if (flg < 8){
		set_clock_switch(clkarray[flg]);				//自动倒换时钟源
	}
*/
}


void clk_check_frequence(void){
//出现主用时钟源丢失以后,将时钟源改为自由振荡并加频偏,
//解决时钟死锁长时间出现误码的现象

	if (clk_check_flg[0] == 1)			//光口出现告警标志
	{
		if (clk_check_flg[1] > 0)		//出现告警,重新进行时钟计数
		{
			clk_check_flg[1] = 1;
		}
		else if ((S_reg & 0xC0) != 0xC0)	//时钟源不工作在自由振荡状态,更改时钟配置
		{
//			clk_frequence_stat = S_reg;
			S_reg &= 0xDF;
			S_reg |= 0xC0;					//先将时钟源配置到自由振荡
//			Frep_reg = 0x80;				//添加频偏
			clk_check_flg[1] = 1;
			clk_frequence_stat = clkmode_reg;
			clkmode_reg = 1;
		}
		clk_check_flg[0] = 0;
	}

	if (clk_check_flg[1] > 0)			//开始时钟计数
	{
		if (clk_check_flg[1] > 5)		//计满5秒钟,将时钟配置改回来
		{
			S_reg &= 0x3F;
			S_reg |= 0x80;
//			Frep_reg = 0x40;
			clk_check_flg[1] = 0;
			clkmode_reg = clk_frequence_stat;
		}
		else clk_check_flg[1] += 1;
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -