亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? isp.c

?? 關于LPC23**的FLASH的ISP程序
?? C
字號:
/* execute update code,the address is maybe 0xe000 */

#include "LPC23xx.h"                       
#include "type.h"
#include "target.h"
#include "irq.h"
#include "uart.h"

#define IAP_LOCATION 0x7FFFFFF1  //IAP入口地址定義

//IAP命令
								 //指令           	參數
#define IAP_CMD_PREPARE 	50   //選擇扇區       	【起始扇區號、結束扇區號】
#define IAP_CMD_COPY 		51	 //拷貝數據			【FLASH目標地址、RAM源地址、寫入字節數、系統時鐘頻率】
#define IAP_CMD_ERASE 		52	 //擦出扇區			【起始扇區號、結束扇區號、系統時鐘頻率】
#define IAP_CMD_CHECK 		53	 //查空扇區			【起始扇區號、結束扇區號】
#define IAP_CMD_ID 			54	 //讀器件ID			【無】
#define IAP_CMD_VERSION 	55	 //讀BOOT版本號		【無】
#define IAP_CMD_COMPARE 	56	 //比較命令			【FLASH起始地址、RAM起始地址、需要比較的字節數】
#define ISP_PC_NOUPDATE 0x20
#define ISP_PC_UPDATE 0x21
#define ISP_PC_DOWNLOAD 0x22
#define ISP_PC_FILE_LEN 0x23
#define ISP_MCU_UPDATE_OK 0x24
#define ISP_MCU_UPDATE_FAIL 0x25

//IAP返回狀態字
#define IAP_RET_CMD_SUCCESS          						0
#define IAP_RET_INVALID_COMMAND      						1
#define IAP_RET_SRC_ADDR_ERROR       						2 
#define IAP_RET_DST_ADDR_ERROR       						3
#define IAP_RET_SRC_ADDR_NOT_MAPPED  						4
#define IAP_RET_DST_ADDR_NOT_MAPPED  						5
#define IAP_RET_COUNT_ERROR          						6
#define IAP_RET_INVALID_SECTOR       						7
#define IAP_RET_SECTOR_NOT_BLANK     						8
#define IAP_RET_SECTOR_NOT_PREPARED_FOR_WRITE_OPERATION 	9
#define IAP_RET_COMPARE_ERROR        						10
#define IAP_RET_BUSY                 						11

// 定義CCLK值大小,單位為KHz 
#define  IAP_FCCLK            12000

volatile DWORD UART0Status, UART1Status;
volatile BYTE UART0TxEmpty = 1; 
volatile BYTE *UART0Buffer;
volatile DWORD UART0Count = 0;

// 定義函數指針 
void (*IAP_Entry)(DWORD param_tab[], DWORD result_tab[]);

DWORD  command[8];                         // IAP入口參數緩沖區
DWORD  result[8];                        // IAP出口參數緩沖區 

void LedPort(char state)
{
	PINSEL7  &= 0xFF00FFFF;	//config P3.24-P3.27 as GPIO
	FIO3DIR  |= 0x0F000000;	//make P3.24-P3.27 as output
	FIO3MASK &= ~(0xF << 24);
	FIO3PIN   = (FIO3PIN & 0xF0FFFFFF)|(state &0x0F)<<24 ;
	FIO3MASK |= 0xF << 24;
}

/*
*********************************************************************************************************
** 函數名稱:SelSector()
** 函數功能:IAP操作扇區選擇,命令代碼50。
** 入口參數:sec1        起始扇區
**           sec2        終止扇區
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  SelSector(BYTE sec1, BYTE sec2)
{  
    command[0] = IAP_CMD_PREPARE;               // 設置命令字
    command[1] = sec1;                       // 設置參數
    command[2] = sec2;
    (*IAP_Entry)(command, result);         // 調用IAP服務程序
   
    return(result[0]);                     // 返回狀態碼
}

/*
*******************************************************************************************************
** 函數名稱:RamToFlash()
** 函數功能:復制RAM的數據到FLASH,命令代碼51。
** 入口參數:dst        目標地址,即FLASH起始地址。以512字節為分界
**           src        源地址,即RAM地址。地址必須字對齊
**           no         復制字節個數,為512/1024/4096/8192
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  RamToFlash(DWORD dst, DWORD src, DWORD no)
{  
    command[0] = IAP_CMD_COPY;             // 設置命令字
    command[1] = dst;                        // 設置參數
    command[2] = src;
    command[3] = no;
    command[4] = IAP_FCCLK;
    (*IAP_Entry)(command, result);         // 調用IAP服務程序
    
    return(result[0]);                     // 返回狀態碼
}

/*
*******************************************************************************************************
** 函數名稱:EraseSector()
** 函數功能:扇區擦除,命令代碼52。
** 入口參數:sec1       起始扇區
**           sec2       終止扇區
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  EraseSector(BYTE sec1, BYTE sec2)
{  
    command[0] = IAP_CMD_ERASE;            // 設置命令字
    command[1] = sec1;                       // 設置參數
    command[2] = sec2;
    command[3] = IAP_FCCLK;
    (*IAP_Entry)(command, result);         // 調用IAP服務程序
   
    return(result[0]);                     // 返回狀態碼
}

/*
*******************************************************************************************************
** 函數名稱:BlankCHK()
** 函數功能:扇區查空,命令代碼53。
** 入口參數:sec1       起始扇區
**           sec2       終止扇區
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  BlankCHK(BYTE sec1, BYTE sec2)
{  
    command[0] = IAP_CMD_CHECK;               // 設置命令字
    command[1] = sec1;                       // 設置參數
    command[2] = sec2;
    (*IAP_Entry)(command, result);         // 調用IAP服務程序

    return(result[0]);                     // 返回狀態碼
}

/*
*******************************************************************************************************
** 函數名稱:ReadParID()
** 函數功能:扇區查空,命令代碼53。
** 入口參數:無
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  ReadParID(void)
{  
    command[0] = IAP_CMD_ID;             // 設置命令字
    (*IAP_Entry)(command, result);         // 調用IAP服務程序

    return(result[0]);                     // 返回狀態碼
}

/*
*******************************************************************************************************
** 函數名稱:Compare()
** 函數功能:校驗數據,命令代碼56。
** 入口參數:dst        目標地址,即RAM/FLASH起始地址。地址必須字對齊
**           src        源地址,即FLASH/RAM地址。地址必須字對齊
**           no         復制字節個數,必須能被4整除
** 出口參數:IAP操作狀態碼
**           IAP返回值(result緩沖區)
*******************************************************************************************************
*/
DWORD  Compare(DWORD dst, DWORD src, DWORD no)
{  
    command[0] = IAP_CMD_COMPARE;                // 設置命令字
    command[1] = dst;                            // 設置參數
    command[2] = src;
    command[3] = no;
    (*IAP_Entry)(command, result);         		 // 調用IAP服務程序

    return(result[0]);                     		 // 返回狀態碼
}
int main(void)
{
	DWORD err;
	BYTE fileCount0;
	BYTE fileCount1;
	BYTE fileCount2;
	BYTE fileCount3;
	DWORD fileCount;
														//1. 確定更新的情況下,擦除對應代碼區域
	IAP_Entry = (void(*)())IAP_LOCATION; 				//初始化函數指針

	SelSector(0x1,0x1);                                 // 選擇扇區1
    EraseSector(0x1,0x1);                               // 擦除扇區1 (4k)
    BlankCHK(0x1,0x1) ;                       			// 查空扇區
														 
														//2. 發送0x22準備字節給PC
	U0IER = IER_THRE | IER_RLS;							// 發送時disable RBR
	while(!(UART0TxEmpty & 0x01));
	U0THR = ISP_PC_DOWNLOAD;							// 0x22 means bootloader is ready to update 
	UART0Count = 0;
	U0IER = IER_THRE | IER_RLS | IER_RBR;				//	REenable RBR
														
														//3. 發送0x23表示請求PC發送文件的長度,DWORD
	U0IER = IER_THRE | IER_RLS;							// 發送時disable RBR
	while(!(UART0TxEmpty & 0x01));
	U0THR = ISP_PC_FILE_LEN;							// 0x23 means order PC to confirm the fileLen
	UART0Count = 0;
	U0IER = IER_THRE | IER_RLS | IER_RBR;				//	REenable RBR

														//4. 接收文件長度
	while(UART0Count < 5)
	{
		if(UART0Count == 4)
		{
			fileCount0 = *(volatile BYTE*)(DWORD)(&UART0Buffer);
			fileCount1 = *(volatile BYTE*)((DWORD)(&UART0Buffer)+1);
			fileCount2 = *(volatile BYTE*)((DWORD)(&UART0Buffer)+2);
			fileCount3 = *(volatile BYTE*)((DWORD)(&UART0Buffer)+3);
			
			UART0Count = 5;		
		}			
	}
	UART0Count = 0;
	
	fileCount = (fileCount0 << 24) + (fileCount1 << 16) + (fileCount2 << 8) + (fileCount3);				 //fileCount is the the length of the HEX file

														 		//5.等待PC發送的文件到on-chip RAM
	while(UART0Count < fileCount)						 		//等待數據傳輸完畢
	{
		if(UART0Count != 0)
		{
			U0IER = IER_THRE | IER_RLS;
			while(!(UART0TxEmpty & 0x01));		   		
			U0IER = IER_THRE | IER_RLS | IER_RBR;
		}
	}
	UART0Count = 0;
														 		//6.從RAM寫入FLASH的指定扇區
	SelSector(0x1,0x1);                                  		// 選擇扇區1
   	RamToFlash(0x00001000, (DWORD)&UART0Buffer, (UART0Count/512)*512+512); 
			
	err = Compare(0x00001000,(DWORD)&UART0Buffer,(UART0Count/512)*512+512);
														 		//7.想串口發送更新操作結果,0x24表示成功,0x25表示失敗
	if(err == IAP_RET_CMD_SUCCESS)
	{
		U0IER = IER_THRE | IER_RLS;								// 發送時disable RBR
		while(!(UART0TxEmpty & 0x01));
		U0THR = ISP_MCU_UPDATE_OK;							 	// 0x24 means bootloader has finished the update process
		UART0Count = 0;
		U0IER = IER_THRE | IER_RLS | IER_RBR;	
	}
	else
	{
		U0IER = IER_THRE | IER_RLS;							 	// 發送時disable RBR
		while(!(UART0TxEmpty & 0x01));
		U0THR = ISP_MCU_UPDATE_OK;							 	// 0x25 means bootloader is failed to update
		UART0Count = 0;
		U0IER = IER_THRE | IER_RLS | IER_RBR;
	}
		
	

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品视频在线免费观看| 美女任你摸久久| 在线播放中文字幕一区| 国产精品综合久久| 亚洲午夜久久久| 国产成人综合自拍| 香港成人在线视频| 中文乱码免费一区二区| 日韩精品一区二区三区在线播放 | 在线成人午夜影院| 不卡的av在线播放| 亚洲高清在线视频| 18涩涩午夜精品.www| 欧美成人三级电影在线| 欧美午夜宅男影院| 国产+成+人+亚洲欧洲自线| 麻豆精品视频在线| 亚洲成a人在线观看| 国产精品久久久久精k8| 亚洲成年人影院| 91伊人久久大香线蕉| 国产成人夜色高潮福利影视| 日本成人在线不卡视频| 亚洲成人黄色小说| 一区二区三区影院| 欧美在线视频日韩| 91猫先生在线| 91天堂素人约啪| 99久久综合精品| 成人教育av在线| 丁香婷婷综合色啪| 国产成人无遮挡在线视频| 9191久久久久久久久久久| 美腿丝袜亚洲一区| 男女性色大片免费观看一区二区| 亚洲精品免费在线| 一区二区三区精品在线观看| 中文字幕日本乱码精品影院| 国产精品你懂的| 自拍偷在线精品自拍偷无码专区| 中文乱码免费一区二区| 自拍偷拍亚洲综合| 亚洲自拍偷拍麻豆| 亚洲va欧美va天堂v国产综合| 亚洲国产一区二区a毛片| 亚洲高清不卡在线观看| 日韩制服丝袜av| 老司机免费视频一区二区| 韩国视频一区二区| 国产精品妹子av| 亚洲欧美国产77777| 亚洲一区欧美一区| 国产成人精品三级麻豆| 中文字幕一区二区三区精华液| 中文字幕免费在线观看视频一区| 国产精品美女久久久久久久久久久| 国产精品嫩草影院com| 一区二区三区四区不卡在线| 亚洲色图在线播放| 亚洲地区一二三色| 奇米影视在线99精品| 久久97超碰色| 福利一区福利二区| 色88888久久久久久影院野外| 91福利精品视频| 欧美二区乱c少妇| 久久精品综合网| 亚洲欧美日韩国产成人精品影院| 一区二区三区精密机械公司| 日韩制服丝袜av| 丁香一区二区三区| 欧美日韩一二三区| 久久理论电影网| 一区二区三区精品在线| 久久看人人爽人人| 亚洲免费高清视频在线| 免费在线观看日韩欧美| 国产激情偷乱视频一区二区三区| 97se亚洲国产综合自在线不卡 | 国产一区视频网站| 久久九九国产精品| 亚洲精品一区二区三区蜜桃下载 | 色美美综合视频| 欧美一级理论片| 亚洲国产精品av| 天天综合网天天综合色| 国产精品亚洲视频| 欧美日韩亚洲综合| 欧美激情资源网| 午夜精品久久久久影视| 风间由美中文字幕在线看视频国产欧美 | 欧美一级欧美三级| 国产精品三级av| 九色综合狠狠综合久久| 在线日韩一区二区| 国产亚洲精品福利| 日韩电影在线观看电影| 99精品偷自拍| 久久蜜桃一区二区| 免费人成黄页网站在线一区二区| 欧美日韩一级二级| 中文字幕精品一区二区三区精品| 午夜一区二区三区视频| av毛片久久久久**hd| 精品国产乱码久久久久久浪潮| 亚洲免费av高清| 国产成人aaa| 精品久久久久99| 婷婷亚洲久悠悠色悠在线播放| av激情成人网| 国产精品私人影院| 加勒比av一区二区| 日韩一区二区三免费高清| 亚洲午夜久久久久久久久久久| 99久久精品久久久久久清纯| 久久久美女毛片| 激情成人午夜视频| 日韩精品一区二区三区蜜臀 | 国产精品国产三级国产aⅴ入口 | 国产成人午夜高潮毛片| 91精品国产色综合久久不卡蜜臀| 亚洲综合在线视频| 国产日韩精品久久久| 亚洲啪啪综合av一区二区三区| 国产成人99久久亚洲综合精品| 久久综合九色综合97婷婷| 免费高清在线一区| 欧美一区二区三区在线电影 | 成人午夜碰碰视频| 国产无人区一区二区三区| 看电视剧不卡顿的网站| 欧美一区二区网站| 麻豆国产91在线播放| 91精品国产91久久久久久一区二区 | 国产999精品久久| 99久久99久久精品国产片果冻 | 久久综合九色综合欧美亚洲| 日本欧美在线看| 日韩丝袜美女视频| 精品一区二区在线看| 精品久久久久香蕉网| 国产一区二区精品久久99| 石原莉奈一区二区三区在线观看| 欧美日韩国产一区二区三区地区| 亚洲大片在线观看| 欧美一级日韩一级| 黄色小说综合网站| 欧美极品美女视频| av网站一区二区三区| 一二三区精品视频| 欧美丰满少妇xxxbbb| 久久99久久精品| 国产蜜臀97一区二区三区| 成人永久免费视频| 亚洲免费在线电影| 欧美日韩国产一级| 精东粉嫩av免费一区二区三区| 国产偷国产偷精品高清尤物| av网站一区二区三区| 亚洲国产精品精华液网站 | 99热99精品| 亚洲国产精品欧美一二99| 日韩欧美卡一卡二| 国产69精品久久777的优势| 曰韩精品一区二区| 欧美一区二区日韩一区二区| 黑人精品欧美一区二区蜜桃| 亚洲天堂免费在线观看视频| 在线视频一区二区三| 欧美日韩国产一区二区三区地区| 国产精品久久久久久久久久免费看 | 免费国产亚洲视频| 欧美国产日产图区| 欧美日韩一区小说| 精品一区二区影视| 一区二区在线看| 日韩精品一区在线| 7777精品伊人久久久大香线蕉完整版| 国产视频一区在线观看| 在线国产电影不卡| 九一九一国产精品| 一区二区三区日韩精品视频| 91精品国产全国免费观看| 成人中文字幕在线| 欧美精品一区二区三区蜜桃 | av电影天堂一区二区在线观看| 亚洲成av人片一区二区三区| 水蜜桃久久夜色精品一区的特点 | 国产午夜精品一区二区三区视频 | 亚洲女厕所小便bbb| 正在播放一区二区| 国产成人免费视频| 午夜精品久久久久久久久久 | 91精品国产综合久久久久久漫画| 国产二区国产一区在线观看| 亚洲va欧美va人人爽午夜| 国产精品国产三级国产专播品爱网| 日韩欧美国产一区在线观看| 91啪九色porn原创视频在线观看| 久久精品国产一区二区|