?? self_check.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 + -