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

📄 self_check.c

📁 基于c的电动机保护程序
💻 C
字号:
/*************************************************************
**	模块:定时自检任务										**
**	功能:实现GPIO,FLASH,SDRAM等硬件部分的自检				**
**	实现:每隔4小时定时器起Timer_Self_Check任务				**
**	函数列表:												**
**		VOID Timer_Self_Check(UNSIGNED id)					**
*************************************************************/

#include "nucleus.h"
#include "hardware_intc.h"
#include "hardware_reg.h"

extern void delay(U32);
int flashCheck(unsigned int startAdd, unsigned int codeLength)
{
	#ifdef	EN_CHECK
	U32 checkSum, checkTemp, i,temp;
	NorFlash_read(startAdd + codeLength,(U32)&checkSum);
	
	for(i=0; i<codeLength; i++)
	{
		NorFlash_read(startAdd + i*2,(U32)&temp);
		checkTemp ^= temp;
	}
	if(checkSum != checkTemp) return 0;
	else return 1;
	#endif
}

int flashTest(unsigned int startAdd, unsigned int codeLength, unsigned int memSize)
{
	#ifdef	EN_CHECK
	int i;
	if(!flashCheck(startAdd, codeLength)) return 0;
	
	//erease here
	for(i=startAdd+codeLength; i<memSize; i = i + 2000) NorFlash_bolckerase(i);
	
//	NorFlash_bolckerase()
	
	for(i = startAdd + codeLength + 1; i<memSize; i++){
		NorFlash_write(i, 0xface);
		if(*(RP)i != 0xface) return 0;
	}
	#endif
	return 1;	
}
/*
**********PG0~PG4(OUT0~OUT4)*************
*(volatile unsigned long *)PORTG_SEL |= 0x1f;//for common use
*(volatile unsigned long *)PORTG_DIR &= 0x00;//direction as output
*(volatile unsigned long *)PORTG_DATA &= ~0x1f;//输出低电平
*(volatile unsigned long *)PORTG_DATA |= 0x01;
	
**********PF0~PF7(OUT5~OUT12)*************	*OUT5 跳闸,OUT7合闸*
*(volatile unsigned long *)PORTF_SEL |= 0xff;//for common use
*(volatile unsigned long *)PORTF_DIR &= 0x00;//direction as output
*(volatile unsigned long *)PORTF_DATA &= ~0xff;//输出低电平
	 
**********PB5(OUT13)**************** 
*(volatile unsigned long *)PORTB_SEL |= 0x20;
*(volatile unsigned long *)PORTB_DIR &= 0x00; 
*(volatile unsigned long *)PORTB_DATA &= ~0x20;
**********PB4(OUT14)**************** 
*(volatile unsigned long *)PORTB_SEL |= 0x10; 
*(volatile unsigned long *)PORTB_DIR &= 0x00; 
*(volatile unsigned long *)PORTB_DATA &= ~0x10;		
**********PB0~PB3(OUT_EN0~OUT_EN3)*************	 
*(volatile unsigned long *)PORTB_SEL |= 0x0f; 
*(volatile unsigned long *)PORTB_DIR &= 0x00; 
*(volatile unsigned long *)PORTB_DATA |= 0x0f;//默认为高 
*/

int GPIOTest()
{
	#ifdef	EN_CHECK
	int i, temp;
	unsigned long PBSave;
	
	*(volatile unsigned long *)0x1fff060c = 0x1;
	SaveGPIO();
	*(volatile unsigned long *)PORTB_SEL |= 0x17f;
	*(volatile unsigned long *)PORTB_DIR |= 0x100;

	
	*(volatile unsigned long *)PORTG_DATA = 0x00000000;
	*(volatile unsigned long *)PORTF_DATA = 0x00000000;
	*(volatile unsigned long *)PORTB_DATA = 0x00000000;
	
	delay(1);

//test PG0~PG4	
	for(i=0; i<3; i++)
	{
		temp = 0x1 << i;
		*(volatile unsigned long *)PORTG_DATA = temp;       //置1,PB8应该为0
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x0)
		{
			RecoverGPIO();
			return 0;
		}
		
		*(volatile unsigned long *)PORTG_DATA = 0x0;	     //置0,PB8应该为1
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x100)
		{
			RecoverGPIO();
			return 0;
		}
	}
	
		temp = 0x1 << 4;
		*(volatile unsigned long *)PORTG_DATA = temp;       //置1
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x0)
		{
			RecoverGPIO();
			return 0;
		}
		*(volatile unsigned long *)PORTG_DATA = 0x0;	     //置0
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x100)
		{
			RecoverGPIO();
			return 0;
		}		
//test PF0~PF7
	for(i=0; i<8; i++)
	{
		temp = 0x1 << i;
		*(volatile unsigned long *)PORTF_DATA = temp;       //置1
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x0)
		{
			RecoverGPIO();
			return 0;
		}
		*(volatile unsigned long *)PORTF_DATA = 0x0;	     //置0
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x100)
		{
			RecoverGPIO();
			return 0;
		}
	}
//test PB0~PB5	
	for(i=4; i<6; i++)
	{
		temp =  0x1 << i;
		*(volatile unsigned long *)PORTB_DATA = temp;       //置1
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x0)
		{
			RecoverGPIO();
			return 0;
		}
		*(volatile unsigned long *)PORTB_DATA = 0x0;	     //置0
		delay(1);
		PBSave = *(volatile unsigned long *)PORTB_DATA;
		if((PBSave & 0x100) != 0x100)
		{
			RecoverGPIO();
			return 0;
		}
	}
	RecoverGPIO();
	*(volatile unsigned long *)0x1fff060c = 0x0;	
	#endif
	return 1;
}

VOID Timer_Self_Check(UNSIGNED id)
{
	unsigned int startAdd, codeLength;
	flashCheck(startAdd, codeLength);
	GPIOTest();
}

⌨️ 快捷键说明

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