在計算機科學中,子程序(英語:Subroutine, procedure, function, routine, method, subprogram, callable unit),是一個大型程序中的某部份代碼,由一個或多個語句塊組成。它負責完成某項特定任務,而且相較于其他代碼,具備相對的獨立性。接下來我們就來看看關于FM25L256的操作子程序。
#include\;
//FM25L256數據讀取子程序;
//參數:*pDestination要讀入數據的;
//參數條件:uiSourceAddress+(;voidReadFM25L256(unsigne;unsignedcharucHighAddres;EnableFM25256;//CS變低SPDR;
SPDR=0;//為了讀取數據,需要寫入數據,發;wh
#include \
//FM25L256數據讀取子程序
//參數: *pDestination要讀入數據的主機內存地址指針; uiSourceAddress要讀取的數據在FM25L256中的地址(整形); uiNum數據個數(整形)
//參數條件: uiSourceAddress+(uiNum-1)不能大于器件的最高地址; uiNum必須》0;
void ReadFM25L256(unsigned char *pDestination, unsigned int uiSourceAddress, unsigned int uiNum) {
unsigned char ucHighAddress = uiSourceAddress 》》 8; //高位地址 SPCR = (1《
EnableFM25256; //CS變低 SPDR = 0x03; //寫入讀命令字 while((SPSR&(1《 0;uiNum--) {
SPDR = 0; //為了讀取數據,需要寫入數據,發送SCK,故寫入0
while((SPSR&(1《
pDestination++; }
DisableFM25256; //CS變高 }
//FM25L256數據讀取并發送至串口子程序
//參數: uiSourceAddress要讀取的數據在FM25L256中的地址(整形); uiNum數據個數(整形) //參數條件: uiSourceAddress+(uiNum-1)不能大于器件的最高地址; uiNum必須》0; //返回值:所發送數據的檢驗和
unsigned char ReadFM25L256SendToUsart(unsigned int uiSourceAddress, unsigned int uiNum) {
unsigned char ucHighAddress = uiSourceAddress 》》 8; //高位地址 unsigned char ucTemp;
EnableFM25256; //CS變低 SPCR = (1《
while((SPSR&(1《 0;uiNum--) {
SPDR = 0; //為了讀取數據,需要寫入數據,發送SCK,故寫入0
while((SPSR&(1《
DisableFM25256; //CS變高 return (1); }
//FM25L256數據寫入子程序
//參數: *pSource要寫入數據的主機內存地址指針; uiDestinationAddress要寫入的數據在FM25L256中的地址(整形); uiNum數據個數(整形)
void WriteFM25L256(unsigned char *pSource, unsigned int uiDestinationAddress, unsigned int uiNum) {
unsigned char ucHighAddress = uiDestinationAddress 》》 8; //高位地址 EnableFM25256; //CS變低 SPCR = (1《
while((SPSR&(1《
DisableFM25256; //CS變高 _delay_us(50);
EnableFM25256; //CS變低 SPDR = 0x02; //寫入寫命令字
while((SPSR&(1《
SPDR = ucHighAddress; //寫入高位地址CI-FM25H20-DG
while((SPSR&(1《
SPDR = (unsigned char) (uiDestinationAddress & 0x00FF); //寫入低位地址 while((SPSR&(1《
for(;uiNum 》 0;uiNum--) {
SPDR = *pSource; //發送要寫入的數據
while((SPSR&(1《
pSource++; }
DisableFM25256; //CS變高 }
//FM25L256自檢子程序
//返回值:0:自檢成功,1:自檢失敗 unsigned char FM25L256SelfTest(void) {
unsigned int uiTemp;
uiTemp = ReadInt(FM25L256_CHECK_ADDRESS);
if (uiTemp == 0xA55A) //判斷是否存儲器是否能讀 return (0); else
{ //存儲器不能讀或未進行出廠設置 SetDefault(); //出廠設置,函數定義在System.c WriteInt (0xA55A,FM25L256_CHECK_ADDRESS); //設置已出廠設置標志 uiTemp = ReadInt(FM25L256_CHECK_ADDRESS);
if (uiTemp == 0xA55A) //若讀取正確返回0 return (0); else
return (1); //若仍讀取錯誤則返回1 } } /*
//測試FM25L256子程序 void VerifyFM25L256(void) {
unsigned int uiCheckAddress = 0;
unsigned int uiMemoryNum = ReadInt(MEMORY_ADDRESS); unsigned int uiOldData; unsigned char ucError = 0; unsigned char ucSendChkSum; unsigned char i;
union tagSTOREINT siUsartDataInt; //整型共用體,將整形分解為字節型存取,在DataStore.h中定義
for (;uiCheckAddress 《 uiMemoryNum;uiCheckAddress += 2) {
uiOldData = ReadInt(uiCheckAddress); //保存原有數據 WriteInt (0xA55A,uiCheckAddress); //寫入測試字 // __delay_cycles(10);
if (ReadInt(uiCheckAddress) != 0xA55A) {
WriteInt (uiOldData,uiCheckAddress); //寫回原有數據
SendChar(COMM_FRAME_START); //發送反饋幀頭
ucSendChkSum = COMM_FRAME_START; //計算反饋幀的校驗和 SendChar(VERIFY_FRAM_COMMAND); //發送命令字
ucSendChkSum += VERIFY_FRAM_COMMAND; //計算反饋幀的校驗和 siUsartDataInt.uiStoreInt = uiMemoryNum; //發送地址總長 for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
siUsartDataInt.uiStoreInt = uiCheckAddress; //發送測試地址 for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
SendChar(FINISHED_SEND);
ucSendChkSum += FINISHED_SEND; //發送結束上傳標志 SendChar(ucSendChkSum); //發送檢驗和 SendChar(COMM_FRAME_END); //發送幀尾 ucError = 1; //置錯誤標志 break; //退出循環 }
else if ((((uiCheckAddress + 2) % 1024) == 0) && ((uiCheckAddress + 2) 《 uiMemoryNum)) {
WriteInt (uiOldData,uiCheckAddress); //寫回原有數據
SendChar(COMM_FRAME_START); //發送反饋幀頭
ucSendChkSum = COMM_FRAME_START; //計算反饋幀的校驗和 SendChar(VERIFY_FRAM_COMMAND); //發送命令字
ucSendChkSum += VERIFY_FRAM_COMMAND; //計算反饋幀的校驗和 siUsartDataInt.uiStoreInt = uiMemoryNum; //發送地址總長 for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
siUsartDataInt.uiStoreInt = uiCheckAddress + 2; //發送測試完成地址
for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
SendChar(GO_ON_SEND);
ucSendChkSum += GO_ON_SEND; //發送結束上傳標志 SendChar(ucSendChkSum); //發送檢驗和 SendChar(COMM_FRAME_END); //發送幀尾 // __watchdog_reset(); //復位看門狗 }
WriteInt (uiOldData,uiCheckAddress); //寫回原有數據 }
if (ucError == 0) {
SendChar(COMM_FRAME_START); //發送反饋幀頭
ucSendChkSum = COMM_FRAME_START; //計算反饋幀的校驗和 SendChar(VERIFY_FRAM_COMMAND); //發送命令字
ucSendChkSum += VERIFY_FRAM_COMMAND; //計算反饋幀的校驗和 siUsartDataInt.uiStoreInt = uiMemoryNum; //發送地址總長 for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
siUsartDataInt.uiStoreInt = uiCheckAddress; //發送測試完成地址 for (i = 0;i 《= 1;i++) {
SendChar(siUsartDataInt.ucStoreBuff[i]);
ucSendChkSum += siUsartDataInt.ucStoreBuff[i]; }
SendChar(FINISHED_SEND);
ucSendChkSum += FINISHED_SEND; //發送結束上傳標志 SendChar(ucSendChkSum); //發送檢驗和 SendChar(COMM_FRAME_END); //發送幀尾 } } */
評論
查看更多