時間:2011-02-28 09:27:04來æºï¼šboulifairy
AT91SAM7xx 系列是Atmel å…¬å¸æŽ¨å‡ºçš„åŸºäºŽARM7å…§(nèi)æ ¸çš„32ä½MCU。用戶代碼編è¯åœ¨Thumb 模å¼ä¸‹å¯ç²å¾—16使Œ‡ä»¤å¯¬åº¦ï¼Œå¾žè€Œç¯€(jié)ç´„å…§(nèi)部程åºç©ºé–“。目å‰é€™å€‹ç³»åˆ—芯片的內(nèi)部Flash空間范åœå¾ž32KB到256KB, RAMç©ºé–“èŒƒåœæ˜¯8KB 到 6?KB。除了SAM7S32外,這個系列的芯片都內(nèi)嵌有USB2.0全速通訊模塊。本文介紹的就是基于USB接å£çš„用戶程åºå‡ç´šå·¥å…·ã€‚
æˆ‘å€‘çŸ¥é“ Atmel å…¬å¸ç‚ºé€™å€‹ç³»åˆ—芯片æä¾›äº† SAM-BA 下載工具。這個工具在產(chÇŽn)å“階段的應用有一定的局é™ï¼Œå°±æ˜¯ç‚ºäº†å•Ÿå‹•芯片內(nèi)部的 SAM-BA 程åºï¼Œç”¨æˆ¶éœ€è¦çŸæŽ¥èŠ¯ç‰‡çš„TST引腳到電æºç«¯ï¼Œç„¶åŽä¸Šé›»10ç§’é˜ï¼Œå†é‡æ–°ä¸Šé›»ï¼Žæœ¬æ–‡ä»‹ç´¹çš„Boot-loader 程åºå¸¸é§åœ¨èŠ¯ç‰‡å…§(nèi)部Flash空間,啟動方法是用戶按ä½ç”¢(chÇŽn)å“的一個特定的按éµç„¶åŽä¸Šé›»ã€‚這樣大大簡化了產(chÇŽn)å“固件的å‡ç´šéŽç¨‹ã€‚
1 Boot-loader 在Flashä¸çš„ä½ç½®
為了在整個SAM7Sxx系列ä¸é€šç”¨åŒä¸€å€‹Boot-Loader程åºï¼Œæˆ‘們把它定ä½åœ¨Flash的低端ä½ç½®åç§»é‡ç‚º0x800至0x15ffä½ç½®ï¼Œå…±å 用3584個å—節(jié)空間。相應的用戶程åºåœ¨éˆæŽ¥æ™‚è¦é¿é–‹ä½¿ç”¨é€™æ®µåœ°å€ã€‚ç†è€…采用的是IARç·¨è¯ç’°(huán)境,需è¦ä¿®æ”¹éˆæŽ¥ç›®æ¨™å®šä½æŽ§åˆ¶æ–‡ä»¶é”到定ä½ç›®æ¨™æ–‡ä»¶çš„目的。以S256為例,需è¦ä¿®æ”¹at91SAM7S256_NoRemap.xcl 文件
Boot-loader çš„éˆæŽ¥æŽ§åˆ¶æ–‡ä»¶ä¸éœ€è¦ä¿®æ”¹çš„é …ç›®æœ‰:
-DROMSTART1=00 䏿–·å‘é‡è¡¨èµ·å§‹ä½ç½®
-DROMEND1=3F 䏿–·å‘é‡è¡¨çµ(jié)æŸä½ç½®
-DROMSTART2=800 目標程åºèµ·å§‹ä½ç½®
-DROMEND2=15FF 目標程åºçµ(jié)æŸä½ç½®
CODE, ICODE CONST 的定ä½åŒæ¨£éœ€è¦ç›¸æ‡‰çš„修改。
Boot-loader 啟動文件為Atmelæä¾›(Cstartup.s79),但需è¦ä½œä¸€å®šä¿®æ”¹:
RSEG ICODE:CODE:ROOT(2) 改為RSEG INTVEC:CODE:ROOT(2) 把異常å‘é‡è¡¨å®šä½åœ¨0x00至0x3f.
異常å‘é‡è¡¨çš„æœ«ç«¯æ·»åŠ èªžå¥RSEG ICODE:CODE:ROOT(2) 把啟動代碼定ä½åœ¨CODE段.
ç”¨æˆ¶æ‡‰ç”¨é …ç›®éœ€è¦ä¿®æ”¹at91SAM7S256_NoRemap.xcl文件ä¸
-DROMSTART1=00 䏿–·å‘é‡è¡¨åŠå•Ÿå‹•代碼起始ä½ç½®
-DROMEND1=7FF 䏿–·å‘é‡è¡¨åŠå•Ÿå‹•代碼çµ(jié)æŸä½ç½®
-DROMSTART2=1600 目標程åºèµ·å§‹ä½ç½®
-DROMEND2=3FFFF 目標程åºçµ(jié)æŸä½ç½®
CODE, ICODE CONST 的定ä½åŒæ¨£éœ€è¦ç›¸æ‡‰çš„修改。以é¿å…å’ŒBoot-Loader 地å€é‡ç–Šã€‚
2 Boot-Loader 的實ç¾(xià n)
2.1 Boot-Loader 的啟動
上電復ä½åŽï¼ŒPC指é‡é¦–先指å‘Boot-Loader,Boot-Loader首先åˆå§‹åŒ–IOå£ï¼Œç„¶åŽåˆ¤æ–·ç”¨æˆ¶æœ‰ç„¡æŒ‰ä¸‹å•Ÿå‹•Boot-Loader的按éµã€‚å¦‚æžœè©²éµæ²’æœ‰è¢«æŒ‰ä¸‹ï¼ŒåŒæ™‚Flashå…§(nèi)有用戶代碼,則跳到用戶程åºå…¥å£ã€‚下é¢ä»£ç¢¼æ˜¯ç”¨åŒ¯ç·¨å¯«ç”¨æˆ¶å…¥å£å程åºã€‚
PUBLIC EnterUser
CODE16
EnterUser:
ldr r1, = 0x15fc ; 0x15fc ä¿å˜ç”¨æˆ¶å…¥å£åœ°å€
ldr r0, [r1,#0]
bx r0
如果用戶在上電時有按下該éµï¼Œå‰‡é‹è¡ŒBoot-Loader 的主循環(huán)。
2.2 USB 驅(qū)動
USBé©…(qÅ«)動采用HID類以çœä¸‹é–‹ç™¼(fÄ)é©…(qÅ«)動程åºçš„需è¦ï¼ŽHIDçš„å ±è¡¨é‡‡ç”¨å¦‚ä¸‹çµ(jié)æ§‹(gòu):
const char LoaderDescriptor[] = {
0x06, 0xA0, 0xFF, // å» å®¶å®šç¾©ç”¨é€”
0x09, 0x01, // å» å®¶å®šç¾©ç”¨é€”
0xA1, 0x01, // å ±è¡¨é›†åˆï¼šæ‡‰ç”¨
// The Input report
0x09, 0x03, // å» å®¶å®šç¾©çš„å ±è¡¨ID
0x15, 0x00, // é‚輯最å°å€¼ (0)
0x26, 0xFF, 0x00, // é‚輯最大值(255)
0x75, 0x08, // å ±è¡¨ä½å¯¬(8 ä½)
0x95, 0x03, // å ±è¡¨é•·åº¦(3 )
0x81, 0x02, // è¼¸å…¥å ±è¡¨
// The Output report
0x09, 0x04, // å» å®¶å®šç¾©çš„å ±è¡¨ID
0x15, 0x00, // é‚輯最å°å€¼ (0)
0x26, 0xFF, 0x00, // é‚輯最大值 (255)
0x75, 0x08, // å ±è¡¨ä½å¯¬
0x96, 0x04, 0x01, // å ±è¡¨é•·åº¦(260 å—節(jié))
0x91, 0x02, // è¼¸å‡ºå ±è¡¨
0xC0}; // 集åˆçµ(jié)æŸ
這樣PC下傳的數(shù)據(jù)å ±å¤§å°æ˜¯260B,其ä¸ç¬¬ä¸€å—節(jié)為寫命令,第二,第三å—節(jié)是用戶固件的é 地å€ï¼ˆç”¨æˆ¶å›ºä»¶éœ€ç·¨è¯ç‚ºäºŒé€²åˆ¶æ–‡ä»¶*.bin).接下來是256å—節(jié)的固件數(shù)據(jù)。
2.3 Flash çš„æ“作
把所有æ“作Flash的函數(shù)定義在RAM空間,例如:
__ramfunc int CFlash::Erase_All(void)
å› ç‚ºSAM7Sxx系列的Flash采用單層çµ(jié)æ§‹(gòu),ä¸å…許程åºåœ¨Flash上é‹è¡Œçš„åŒæ™‚改寫Flash的內(nèi)容, 所以è¦å°‡æ“作Flashçš„ç¨‹åºæ”¾åœ¨RAMä¸é‹è¡Œ.
2.4 數(shù)據(jù)包的處ç†
第一個數(shù)據(jù)包包å«ç”¨æˆ¶å•Ÿå‹•代碼和異常å‘é‡è¡¨ã€‚Boot-Loader需è¦ä¿®æ”¹å¾©ä½å‘é‡ï¼Œå¹¶ä¿å˜ç”¨æˆ¶å…¥å£åœ°å€ï¼ˆå½ä»£ç¢¼å¦‚下)
if (Page == 0) {
Get User Entrance Address
Replace User Entrance Address with Boot-Loader Entrance Address
Program first page into Flash
Set flag to indicate an unfinished task
Calculate checksum and return to PC
}
收到çµ(jié)æŸæŒ‡ä»¤åŽéœ€è¦è¨ç½®å®Œæˆæ¨™å¿—(å½ä»£ç¢¼å¦‚下):
if (Command == END_OF_TASK) {
Write last page into Flash
Reset unfinished flag
Calculate checksum and return to PC
}
如果é 地å€èˆ‡boot-loader é‡ç–Šï¼Œå‰‡ä¸é€²è¡Œå¯«æ“作,僅返æˆåŠŸæ¨™å¿—çµ¦PC:
if ( (Page >= BL_START_PAGE) && (Page <= BL_END_PAGE) ) {
ret = true ;
break ;
}
3 PC端下載軟件的實ç¾(xià n)簡介
䏋颿˜¯æ¨™æº–çš„PC端æ“作æµç¨‹ï¼š
- ç²å¾—USB HID 類GUID
- ç²å¾—所有HIDè¨å‚™çµ(jié)æ§‹(gòu)數(shù)組
- æ ¹æ“š(jù)VID PID ç²å¾—è¨å‚™ä¿¡æ¯
- 打開è¨å‚™å¥æŸ„
- 與Boot-Loader 進行通訊
以上æ“作æ¥é©Ÿåœ¨Windows, MacOS, Linux ä¸éƒ½æ˜¯é€šç”¨çš„,讀者å¯ä»¥åœ¨åƒè€ƒæ–‡ç»3找到關于PC端程åº?qÅ«)å´¿F(xià n)的具體方法。
4 çµ(jié)è«–
本文介紹的實ç¾(xià n)方法簡化了AT91SAM7Sxx系列用戶程åºå‡ç´šéŽç¨‹ã€‚HID類的USB接å£å¢žåŠ äº†ç”¢(chÇŽn)å“è·¨å¹³è‡ºæ‡‰ç”¨çš„éˆæ´»æ€§ã€‚ç†è€…測試下載25K代碼約2ç§’é˜ï¼Œå…·æœ‰ä¸€å®šå¯¦ç”¨åƒ¹å€¼ã€‚
åƒè€ƒæ–‡ç»
[1] at91sam7s_full.pdf. Http://www.at91.com
[2] HID1_11.pdf. Http://www.usb.org
[3] Stuart Allman Using the HID class eases the job of writing USB device drivers. Http://www.edn.com
æŽéš†æ…¶
希爾æ€å„€è¡¨ï¼ˆæ·±åœ³ï¼‰æœ‰é™å…¬å¸
標簽:
上一篇:基于CPLD的編碼器解碼接å£ã€P...
下一篇:微能WIN-V63çŸ¢é‡æŽ§åˆ¶è®Šé »å™¨åœ¨...
ä¸åœ‹å‚³å‹•ç¶²(wÇŽng)版權(quán)與å…è²¬è²æ˜Žï¼šå‡¡æœ¬ç¶²(wÇŽng)注明[來æºï¼šä¸åœ‹å‚³å‹•ç¶²(wÇŽng)]的所有文å—ã€åœ–片ã€éŸ³è¦–å’Œè¦–é »æ–‡ä»¶ï¼Œç‰ˆæ¬Š(quán)å‡ç‚ºä¸åœ‹å‚³å‹•ç¶²(wÇŽng)(www.siyutn.com)ç¨å®¶æ‰€æœ‰ã€‚如需轉(zhuÇŽn)載請與0755-82949061è¯(lián)系。任何媒體ã€ç¶²(wÇŽng)站或個人轉(zhuÇŽn)è¼‰ä½¿ç”¨æ™‚é ˆæ³¨æ˜Žä¾†æºâ€œä¸åœ‹å‚³å‹•ç¶²(wÇŽng)â€ï¼Œé•å者本網(wÇŽng)將追究其法律責任。
本網(wÇŽng)轉(zhuÇŽn)載并注明其他來æºçš„稿件,å‡ä¾†è‡ªäº’è¯(lián)ç¶²(wÇŽng)或æ¥(yè)å…§(nèi)投稿人士,版權(quán)屬于原版權(quán)人。轉(zhuÇŽn)載請ä¿ç•™ç¨¿ä»¶ä¾†æºåŠä½œè€…ï¼Œç¦æ¢æ“…自篡改,é•è€…è‡ªè² ç‰ˆæ¬Š(quán)法律責任。
相關資訊