MAXQ7665ã®ããŒãžæ¶å»å¯èœãª(PE)ããã°ã©ã /ããŒã¿ãã©ãã·ã¥ã®ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)
MAXQ7665ã®ããŒãžæ¶å»å¯èœãª(PE)ããã°ã©ã /ããŒã¿ãã©ãã·ã¥ã®ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)
èŠçŽ
ãã®ã¢ããªã±ãŒã·ã§ã³ããŒãã§ã¯ãå èµã®ãŠãŒãã£ãªãã£ROMã䜿çšããŠMAXQ7665ãã€ã¯ãã³ã³ãããŒã©(µC)ã®ããã°ã©ã ãšããŒã¿ãã©ãã·ã¥ã®æ¶å»/æžèŸŒã¿ãè¡ãæ¹æ³ã«ã€ããŠèª¬æããŸãããã®æ å ±ã¯ãããŒãžæ¶å»å¯èœãª(PE)ãã©ãã·ã¥ãåããMAXQ7665ãã©ãã·ã¥ããŒã¹ã®ÂµCã«é©çšãããŸãã
ã¯ããã«
ãã®ã¢ããªã±ãŒã·ã§ã³ããŒãã§ã¯ãããŒãžæ¶å»å¯èœãª(PE)ãã©ãã·ã¥ã¡ã¢ãªãåããMAXQ7665ãã©ãã·ã¥ããŒã¹ã®ãã€ã¯ãã³ã³ãããŒã©(µC)ã«ãããå éšããŒã¿ãšããã°ã©ã ãã©ãã·ã¥ã®ç®¡çæ¹æ³ã«ã€ããŠèª¬æããŸãããã®èª¬æã«ã¯ãããã°ã©ã ãã©ãã·ã¥ã®ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)ãå®è¡ããããã®äžè¬çãªæ å ±ãå«ãŸããŸãã
ã¡ã¢ãªããã
ãã®é ã§ã¯ãäžè¬çãªãã©ãã·ã¥ã®æ å ±ãããã³MAXQ7665µCãã¡ããªã®ããŸããŸãªã¡ã¢ãªãµã€ãºã«ã€ããŠã®ã¡ã¢ãªæ§æã«ã€ããŠè©³ãã説æããŸããMAX7665ããã€ã¹ã§ã¯ã3çš®é¡ã®ãã©ãã·ã¥ã¡ã¢ãªãå©çšå¯èœã§ããããªãã¡ãã»ã¯ã¿æ¶å»ãåäžã¯ãŒãæ¶å»ãããã³2ããŒãžæ¶å»ã§ãããã®ã¢ããªã±ãŒã·ã§ã³ããŒãã§ã¯ã2ããŒãžæ¶å»ã®ããŒã¿ãã©ãã·ã¥ã®PEãã©ãã·ã¥ãåããMAXQ7665ããã€ã¹ã®ã¿ã説æããŠããŸãããã®èª¬æã¯ãã»ã¯ã¿æ¶å»ã®ã¿ã®ããã€ã¹ãåäžã¯ãŒãã®æ¶å»ãå¯èœãªããŒã¿ãã©ãã·ã¥ãåããããã€ã¹ã«ã¯é©çšãããŸãããMAXQ7665ã»ã¯ã¿æ¶å»å¯èœãª(SE)ããã€ã¹ã®æ å ±ã«ã€ããŠã¯ãã¢ããªã±ãŒã·ã§ã³ããŒã3575MAXQ7665ã®ã»ã¯ã¿æ¶å»å¯èœãªããã°ã©ã /ããŒã¿ãã©ãã·ã¥ã®ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)ãåç §ããŠãã ãããåäžã¯ãŒãæ¶å»ã®ããŒã¿ãã©ãã·ã¥ãåããMAXQ7665 PEããã€ã¹ã®æ å ±ã«ã€ããŠã¯ãã¢ããªã±ãŒã·ã§ã³ããŒã3579åäžã¯ãŒãæ¶å»ã®ããŒã¿ãã©ãã·ã¥ãåããMAXQ7665ã®ããŒãžæ¶å»å¯èœãª(PE)ãã©ãã·ã¥ã®ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)ãåç §ããŠãã ããã
衚1ïœè¡š3ã¯ãããã°ã©ã ãã©ãã·ã¥ããŠãŒãã£ãªãã£ROMãããã³ããŒã¿SRAMããã³ãŒããããããå®è¡ãããšãã®16KBããã€ã¹ã®ã¡ã¢ãªãããã瀺ããŸããå³1ãšå³2ã¯ã16KBãš256Bã®ããã°ã©ã ãã©ãã·ã¥ã®ã»ã¯ã¿ãšããŒãžã®æ§é ãå³è¡šã«ãããã®ã§ãããã以å€ã®ãã©ãã·ã¥ãªãã·ã§ã³ãå©çšå¯èœã§ããå šãªã¹ãã«ã€ããŠã¯ãMAXQ7665ã®ããŒã¿ã·ãŒããåç §ããŠãã ããã
衚1. 16KBã¡ã¢ãªç©ºéâããã°ã©ã ãã©ãã·ã¥ããã®å®è¡
衚2. 16KBã¡ã¢ãªç©ºéâãŠãŒãã£ãªãã£ROMããã®å®è¡
衚3. 16KBã¡ã¢ãªç©ºéâããŒã¿SRAMããã®å®è¡
å³1. 16KBããã°ã©ã ãã©ãã·ã¥ã®ã»ã¯ã¿/ããŒãžæ§é
å³2. 256BããŒã¿ãã©ãã·ã¥ã®ã»ã¯ã¿/ããŒãžæ§é
ããŒã¿ãã©ãã·ã¥ã䜿çšããŠããŒã¿ãä¿å
ãã©ãã·ã¥ã䜿çšãããšãã·ã¹ãã ã®åäœäžã«äžåºŠã ãããŸãã¯å®æçã«ããã°ã©ã ããå¿ èŠã®ããã·ã¹ãã ããŒã¿ã確å®ã«ä¿åããããšãã§ããŸããEEPROMãšã¯ç°ãªããMAXQ7665ã®PEãã©ãã·ã¥ã¯ãã€ã/ã¯ãŒãæ¶å»ããããšãã§ããŸãããäžåºŠã«2ããŒãžãæ¶å»ããå¿ èŠããããŸããããã«ã¯éåžžã10msããããŸãããã¯ãŒã¹ãã±ãŒã¹ã®ç¶æ ã§ã¯ããã«é·ããããããšããããŸãããã®éããŠãŒã¶ã³ãŒãã¯åæ¢ç¶æ ãšãªãããããã®ä»ã®åŠçãè¡ãããšã¯ã§ããŸããã
ããŒã¿ããã©ãã·ã¥ã«ä¿åããã«ã¯è€æ°ã®ææ³ããããã¢ããªã±ãŒã·ã§ã³ã«é©åãªæ¹æ³ãéžæãããšãã«ã¯ãããã€ãã®èŠå ãèæ ®ããå¿ èŠããããŸããæ°ããããŒã¿ãå®å šã«æžã蟌ãŸãããŸã§ãçŸåšã®ããŒã¿ã倿Žãããªãããšãã¢ããªã±ãŒã·ã§ã³ãä¿èšŒããå¿ èŠããããŸãã? ãã®å¿ èŠãããå Žåãæ°ããããŒã¿ãæžã蟌ãŸãããšãã«çŸåšã®ããŒã¿ã倱ãããªãããã«ãããããäœããã®ãã³ã¯ã¹ã€ããã³ã°ææ³ãå¿ èŠãšãªããŸãã補å寿åœã®éã«æ¶å»/æžèŸŒã¿ãäœãµã€ã¯ã«çºçããŸãã? æ¶å»/æžèŸŒã¿ã®ãµã€ã¯ã«æ°ãããŒã¿ã·ãŒãã«èŠå®ãããæå€§å€ãè¶ ããå Žåãå¶éãã¥ãŒææ³ã䜿çšããããŒã¿ãã©ãã·ã¥ã®è€æ°ããŒãžã«ããã£ãŠãããã®ãµã€ã¯ã«ã忣ãããããšã«ãã£ãŠãæ¶å»/æžèŸŒã¿ã®ç·ãµã€ã¯ã«æ°ãå€§å¹ ã«å¢å€§ãããããšãã§ããŸãã宿çã«ããŒã¿ã®ä¿åãå¿ èŠãªããŒãºã§ã¯ãã»ãšãã©ã®å Žåããã³ã¯ã¹ã€ããã³ã°ãå¶éãã¥ãŒã®ææ³ã«ãã£ãŠã·ã¹ãã ã®ä¿¡é Œæ§èŠä»¶ãšèŠæ±ãæºããããšãã§ããŸããåææ³ã®ç°¡åãªäŸã以äžã«ç€ºããŸãã
ãã³ã¯ã¹ã€ããã³ã°
ãã³ã¯ã¹ã€ããã³ã°ã¯ãæ¶å»/æžèŸŒã¿ãµã€ã¯ã«ã®éã®ãããŒã¿ã®æ¶å€±ãç Žæã鲿¢ãã广çãªæ¹æ³ã§ãããã®æ¹æ³ã¯ãå°ãªããšã1ã€ã®ããŒã¿ã³ããŒãåžžã«ä¿æããããšã«ãã£ãŠæå¹ã«æ©èœããŸãããã³ã¯ã¹ã€ããã³ã°ã®ãã€ãã¹ç¹ã¯ãå¶éãã¥ãŒææ³ã«æ¯ã¹ãŠ2åã®ããŒã¿ãã©ãã·ã¥ãå¿ èŠãšãããšããç¹ã§ããã€ãŸãããã³ã¯ã¹ã€ããã³ã°ã¯ãå®éã«ã¯ãã¥ãŒãµã€ãºã2ã®å¶éãã¥ãŒææ³ã«ãªããŸãããããã£ãŠã詳现ã«ã€ããŠã¯ãå¶éãã¥ãŒã®å®è£ æ¹æ³ã«é¢ããæ¬¡é ãåç §ããŠãã ããã
å¶éãã¥ãŒ
å¶éãã¥ãŒã¯ãäžå®ã®é ç®æ°ã«ãã£ãŠå¶éããããã¥ãŒã§ãããéåžžã宿çã«ããŒã¿ãåŠçãããšãã«å¿ ã䜿çšãããŸããå¶éãã¥ãŒã¯ãææã®ããŒã¿ãããã¯ãµã€ãºã«çããããšã³ããªïœ£ã®åºå®é·ãã¥ãŒãäœæããããšã«ãã£ãŠæ§æãããŸãããšã³ããªãµã€ãºã¯ã¢ããªã±ãŒã·ã§ã³ã«åºæãªå€ã§ãããŸããæãè¿ãããŒãžæ¶å»ã®å¢çã«åãäžããå¿ èŠããããŸããæ³šïŒæ¶å»ããããšã®ã§ããæå°ãµã€ãºã¯2ããŒãž/ã¯ãŒãã§ããããŒã¿ãã©ãã·ã¥ã¯ãã¢ããªã±ãŒã·ã§ã³ã®èŠä»¶ã«å¿ããŠãããŸããŸãªæ¹æ³ã§åå²ããããšãå¯èœã§ãããããŒã¿ãã©ãã·ã¥ã«ã¯2ããŒãžæ¶å»ã®å¶éãããããããšã³ããªã¯2ããŒãžã®åæ°ã«éå®ãããŸããããšãã°ã512 x 16ã®ããŒã¿ãã©ãã·ã¥ã¯16ã¯ãŒãã®32ãšã³ããªã«åããããšãå¯èœã§ãããçµæãšããŠã衚4ã®ãããªã¡ã¢ãªãããã«ãªããŸãã
åæååŸãèµ·åã«ãŒãã³ã§ãã¥ãŒãšã³ããªãã¹ãã£ã³ããããšã§ã次ã«å©çšå¯èœãªãã¥ãŒå ã®ãšã³ããªãç¥ãããšãã§ããŸãããã¥ãŒããã£ã±ãã«ãªããšãå é ã«æ»ãããšãå¯èœã§ããããŒã¿ãã©ãã·ã¥ã®ãšã³ããªã®æ¶å»ãå®äºããã°ãæ°ãããšã³ããªãæžã蟌ãããšãã§ããŸããå³3ã¯ãå¶éãã¥ãŒå ã®ãšã³ããªã®ãããŒã瀺ããŠããŸãã
ç°¡åãªCã®ãœãŒã¹ã³ãŒãäŸã«ã€ããŠã¯ãä»é²Aãåç §ããŠãã ããã
衚4. å¶éãã¥ãŒã®ã¡ã¢ãªãããã®äŸ
FLASHQueue[ ] | |
Queue Index | Data Flash Address |
31 | 0xC1F0-0xC1FF |
30 | 0xC1E0-0xC1EF |
29 | 0xC1D0-0xC1DF |
. . . . | . . . . |
2 | 0xC020-0xC05F |
1 | 0xC010-0xC03F |
0 | 0xC000-0xC00F |

å³3. å¶éãã¥ãŒã®ãããŒå³
ãŠãŒãã£ãªãã£ROMã®ãã©ãã·ã¥ã«ãŒãã³
MAXQ7665ãã€ã¯ãã³ã³ãããŒã©ã«ã¯ããã©ãã·ã¥ã®ããã°ã©ãã³ã°ãæ¶å»ãããã³æ€èšŒã®ãããROM (èªåãå°çšã¡ã¢ãª)å ã«ãªã³ããããã©ãã·ã¥ã®ãµããŒãã«ãŒãã³ãçšæãããŠããŸãããããã®ã«ãŒãã³ã«ã¢ã¯ã»ã¹ããã«ã¯ã2ã€ã®æ¹æ³ããããŸããçŽæ¥ã¢ã¯ã»ã¹ãšã«ãã¯ã¢ããããŒãã«ã«ãã鿥ã¢ã¯ã»ã¹ã§ããæéã®æ¹æ³ã¯çŽæ¥ã¢ã¯ã»ã¹ã§ãããã«ãŒãã³ãããã«åŒã³åºããŸãããããå®è¡ããã«ã¯ã以äžã«ç€ºãè¡ã«ããããã¡ã€ã«ãèšããŸãã
u16 flashErasePage(void *); u16 flashEraseSector(void *); u16 flashEraseAll(void); u16 dataFlashWrite(u16 *pAddress, u16 iData); u16 dataFlashErasePage(void *); u16 dataFlashEraseSector(void *); u16 dataFlashEraseAll(void);次ã«ããªã³ã«å®çŸ©ã远å ããŠãåã«ãŒãã³ã«é©åãªã¢ãã¬ã¹ãå²ãåœãŠãŸãIARãªã³ã«ã®ãã¡ã€ã«ã®å Žåã远å ãããè¡ã¯ã次ã®ããã«ãªããŸãã
-DflashEraseSector=0x8XXX -DflashErasePage=0x8XXX -DflashEraseAll=0x8XXXã«ãŒãã³ããšã«0x8XXXãé©åãªã¡ã¢ãªã¢ãã¬ã¹ã«çœ®ãæããŸããä»ã®ã³ã³ãã€ã©ã¯ããããã®ãªãã¡ã¬ã³ã¹ã远å ããã®ã«å¥ã®ææ³ã䜿çšããå ŽåããããŸãã
flashWrite()ãŠãŒãã£ãªãã£ã«ãŒãã³ã¯ãåŒæ°ã®åŒæž¡ããCèšèªã«é©ããŠããªããããCããããã«åŒã³åºãããšã¯ã§ããŸããã以äžã«ç€ºããããªå°ããªã¢ã»ã³ããªã«ãŒãã³ãèšè¿°ããå¿ èŠããããŸãã
泚ïŒçŽæ¥ã¢ã¯ã»ã¹ææ³ã§ã¯ãä»åŸã®ROMããŒãžã§ã³ãšã®äžäœäºææ§ã¯ç¢ºä¿ãããŸããã
第2ã®æ¹æ³ã¯ãããŒãã«åç §ãçšãã鿥ã¢ã¯ã»ã¹ã§ãããã®ææ³ã¯ãä»åŸã®ROMããŒãžã§ã³ãšã®äºææ§ã«åªããŠããŸãããå®è¡æéãé·ããªããŸãã以äžã«ç€ºãåã«ãŒãã³ã®åŸãã¢ã»ã³ããªã«ãŒãã³ã¯ãããŒãã«åç §æ¹æ³ã䜿çšããŠãROMãŠãŒãã£ãªãã£ã«ãŒãã³ã®ã¢ãã¬ã¹ãååŸããŸãã衚5ã¯ããŠãŒãã£ãªãã£ROMãäŸçµŠãããã©ãã·ã¥ã«ãŒãã³ã瀺ããŸãããŠãŒãã£ãªãã£ã®ROMã«ãŒãã³ã®å šäœãªã¹ãã«ã€ããŠã¯ãMAXQ7665ã®ãŠãŒã¶ã¬ã€ããåç §ããŠãã ããã
衚5. ãã©ãã·ã¥ãŠãŒãã£ãªãã£ã®ROMã«ãŒãã³
Routine Number | Routine Name | Entry Point ROMTable = ROM[800Dh] | Entry Point Physical Address |
1 | flashWrite | ROM[ROMTable] | 0x8XXX |
2 | flashErasePage | ROM[ROMTable + 1] | 0x8XXX |
3 | flashEraseAll | ROM[ROMTable + 2] | 0x8XXX |
4 | moveDP0 | ROM[ROMTable + 3] | 0x8XXX |
16 | flashEraseSector | ROM[ROMTable + 15] | 0x8XXX |
17 | dataFlashWrite | ROM[ROMTable + 16] | 0x8XXX |
19 | dataFlashErasePage | ROM[ROMTable + 18] | 0x8XXX |
20 | dataFlashEraseSector | ROM[ROMTable + 19] | 0x8XXX |
21 | dataFlashEraseAll | ROM[ROMTable + 20] | 0x8XXX |
FlashWrite()
ã«ãŒãã³ïŒ | u16 flashWrite(u16 *pDest, u16 *pSrc) |
èŠçŽïŒ | ããã°ã©ã ãã©ãã·ã¥ã¡ã¢ãªã®åäžããŒãž(32ã¯ãŒã)ãããã°ã©ã ããŸãã |
å ¥åïŒ | DP[0]âãã©ãã·ã¥ã¡ã¢ãªå
ã®ãã£ã¹ãã£ããŒã·ã§ã³ã¢ãã¬ã¹ DP[1]âæžã蟌ã32ã¯ãŒãã®ããŒã¿ãä¿æããSRAMå ã®ãœãŒã¹ã¢ãã¬ã¹ |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
以äžã®ã¢ã»ã³ããªã³ãŒãã®äŸã§ã¯ã鿥ã¢ãã¬ã¹æå®ã®ææ³(ã«ãã¯ã¢ããããŒãã«)ã䜿çšããŠflashWrite()ãŠãŒãã£ãªãã£ã«ãŒãã³ãåŒã³åºããŠããŸãããã®ã«ãŒãã³ã¯Cã³ãŒãã§åŒã³åºãããŸãã
; This routine is callable by C code using the following prototype ; u16 flashWrite(u16 *pDest, u16 *pSrc); ; flashWrite: move APC, #0 ; No auto inc/dec of accumulator. move AP, #2 ; Set ACC to A[2]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #14 ; Add the index to the flashWrite routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. push DP[1] ; Save Frame Pointer on the stack. move DP[0],A[0] ; Move argument 0(dest address) to DP[0]. move DP[1],A[1] ; Move argument 1(src address) to DP[1]. call ACC ; Execute the routine. pop DP[1] ; Restore Frame Pointer. ret ; Status returned in A[0].FlashErasePage()
ã«ãŒãã³ïŒ | u16 flashErasePage(void *pAddress) |
èŠçŽïŒ | ããã°ã©ã ãã©ãã·ã¥ã¡ã¢ãªã®2ããŒãžãããã¯ãæ¶å»ããŸãã |
å ¥åïŒ | A[0]âæ¶å»ãã2ããŒãžãããã¯(ããªãã¡ããŒãž0ãšããŒãž1)ã«äœçœ®ä»ããããã¢ãã¬ã¹ãA[0]ã«ã¯ã0x0000ïœ0x001Fã®ä»»æã®ã¢ãã¬ã¹ãèšå ¥ããããšãã§ããŸãã |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; u16 flashErasePage(void *pAddress); ; flashErasePage: move APC, #0 ; No auto inc/dec of accumulator. move AP, #1 ; Set ACC to A[1]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #1 ; Add the index to the flashEraseSector routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret ; Status returned in A[0].FlashEraseAll()
ã«ãŒãã³ïŒ | Void flashEraseAll(void) |
èŠçŽïŒ | ããã°ã©ã ãšããŒã¿ã®ãã©ãã·ã¥ã¡ã¢ãªå šäœãæ¶å»ããŸãããã®ã«ãŒãã³ã¯RAMããã®ã¿åŒã³åºãããšãã§ããŸãã |
å ¥åïŒ | ãªã |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; void flashEraseAll(void); ; flashEraseAll: move APC, #0 ; No auto inc/dec of accumulator. move AP, #0 ; Set ACC to A[0]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #2 ; Add the index to the flashEraseAll routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. retmoveDP0
ã«ãŒãã³ïŒ | moveDP0 |
èŠçŽïŒ | ãã©ãã·ã¥ã¡ã¢ãªã®åäžã¯ãŒããèªã¿åºããŸãã |
å ¥åïŒ | DP[0]âãã©ãã·ã¥ã¡ã¢ãªå ã®ãœãŒã¹ã¢ãã¬ã¹ãããã°ã©ã ãã©ãã·ã¥ãåŒã³åºã0x8000ã远å |
åºåïŒ | GRã¯ãæå®ããã¢ãã¬ã¹ã«ããŒã¿ãå«ãŸããŸãã |
æ³šïŒ | ãã®é¢æ°ã¯ãåŒæ°ãšæ»ãã®ã¬ãžã¹ã¿ãCã®åŒåºã仿§ã«é©åããŠããªããããCããããã«åŒã³åºãããšã¯ã§ããŸããã |
以äžã®ã¢ã»ã³ããªã³ãŒãã®äŸã§ã¯ãmoveDP0ãCã§åŒåºãå¯èœãªã«ãŒãã³ã«å€æããŠããŸããã¢ããªã±ãŒã·ã§ã³ã§é床ãå¿ é ãšãªãå Žåã¯ãç¹å®ã®ã¿ã¹ã¯ã«åãããŠãã«ã¹ã¿ã ã®ã¢ã»ã³ããªèšèªã«ãŒãã³ãèšè¿°ããå¿ èŠããããŸãããã®ãããªãŠãŒãã£ãªãã£ROMã«ãŒãã³ãããã€ãããããã©ãã·ã¥ããã®å¹ççãªããŒã¿è»¢éãèšè¿°ããå Žåã«åœ¹ç«ã¡ãŸãã
; This routine is callable by C code using the following prototype ; u16 flashRead(u16 *pAddress); ; flashRead: move APC, #0 ; No auto inc/dec of accumulator. move AP, #1 ; Set ACC to A[1]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #3 ; Add the index to the moveDP0 routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. push DP[1] ; Save Frame Pointer on the stack. move DP[0],A[0] ; Move argument 0(src address) to DP[0]. call ACC ; Execute the routine. pop DP[1] ; Restore Frame Pointer. move A[0],GR ret ; Data word returned in A[0].FlashEraseSector()
ã«ãŒãã³ïŒ | u16 flashEraseSector(void *pAddress) |
èŠçŽïŒ | ããã°ã©ã ãã©ãã·ã¥ã¡ã¢ãªã®åäžã»ã¯ã¿ãæ¶å»ããŸãã |
å ¥åïŒ | A[0]âæ¶å»ããã»ã¯ã¿ã«äœçœ®ä»ããããã¢ãã¬ã¹ |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; u16 flashEraseSector(void *pAddress); ; flashEraseSector: move APC, #0 ; No auto inc/dec of accumulator. move AP, #1 ; Set ACC to A[1]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #15 ; Add the index to the flashEraseSector routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret ; Status returned in A[0].DataFlashWrite()
ã«ãŒãã³ïŒ | u16 dataFlashWrite(void *pAddress, u16 *pData) |
èŠçŽïŒ | ããŒã¿ãã©ãã·ã¥ã¡ã¢ãªã®åäžã¯ãŒããããã°ã©ã ããŸãã |
å ¥åïŒ | A[0]âæžã蟌ããã©ãã·ã¥ã¡ã¢ãªã®ã¯ãŒãã¢ãã¬ã¹ A[1]âãã©ãã·ã¥ã¡ã¢ãªã«æžã蟌ãã¯ãŒãå€ |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
以äžã®ã¢ã»ã³ããªã³ãŒãã®äŸã§ã¯ã鿥ã¢ãã¬ã¹æå®ã®ææ³(ã«ãã¯ã¢ããããŒãã«)ã䜿çšããŠdataFlashWrite()ãŠãŒãã£ãªãã£ã«ãŒãã³ãåŒã³åºããŠããŸãããã®ã«ãŒãã³ã¯Cã³ãŒãã§åŒã³åºãããŸãã
; This routine is callable by C code using the following prototype ; u16 dataFlashWrite(void *pAddress, u16 iData); ; dataFlashWrite: move APC, #0 ; No auto inc/dec of accumulator. move AP, #2 ; Set ACC to A[2]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #16 ; Add the index to the flashWrite routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret ; Status returned in A[0].DataFlashErasePage()
ã«ãŒãã³ïŒ | u16 dataFlashErasePage(void *pAddress) |
èŠçŽïŒ | ããŒã¿ãã©ãã·ã¥ã¡ã¢ãªã®2ããŒãžãæ¶å»ããŸãã |
å ¥åïŒ | A[0]âæ¶å»ãã2ããŒãžãããã¯(ããªãã¡ããŒãž0ãšããŒãž1)ã«äœçœ®ä»ããããã¢ãã¬ã¹ãA[0]ã«ã¯ã0x4000ãããã¯0x4001ã®ã¢ãã¬ã¹ãèšå ¥ããããšãã§ããŸãã |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; u16 dataFlashErasePage(void *pAddress); ; dataFlashErasePage: move APC, #0 ; No auto inc/dec of accumulator. move AP, #1 ; Set ACC to A[1]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #18 ; Add the index to the dataFlashErasePage routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret ; Status returned in A[0].DataFlashEraseSector()
ã«ãŒãã³ïŒ | u16 dataFlashEraseSector(void *pAddress) |
èŠçŽïŒ | ããŒã¿ãã©ãã·ã¥ã¡ã¢ãªã®åäžã»ã¯ã¿ãæ¶å»ããŸãã |
å ¥åïŒ | A[0]âæ¶å»ããã»ã¯ã¿ã«äœçœ®ä»ããããã¢ãã¬ã¹ |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸããã»ãããããå ŽåãA[0]ã«ã¯ã以äžã®ãšã©ãŒã³ãŒãã®1ã€ãå«ãŸããŸãã 1: ãœãããŠã§ã¢ã®ã¿ã€ã ã¢ãŠãã«ãã倱æ 2: ããŒããŠã§ã¢ã«ãã£ãŠå ±åããã倱æ(DQ5/FERR) 4: ãµããŒããããŠããªãã³ãã³ã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; u16 dataFlashEraseSector(void *pAddress); ; dataFlashEraseSector: move APC, #0 ; No auto inc/dec of accumulator. move AP, #1 ; Set ACC to A[1]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #19 ; Add the index to the dataFlashEraseSector routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret ; Status returned in A[0].dataFlashEraseAll
ã«ãŒãã³ïŒ | void dataFlashEraseAll(void) |
èŠçŽïŒ | ããŒã¿ãã©ãã·ã¥ã¡ã¢ãªå šäœãæ¶å»ããŸãã |
å ¥åïŒ | ãªã |
åºåïŒ | ãã£ãªãŒïŒãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã SW_FERRâãšã©ãŒæã«ã»ãããããæåæã«ã¯ãªã¢ãããŸãã |
æ³šïŒ | ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ããã |
; This routine is callable by C code using the following prototype ; void dataFlashEraseAll(void); ; dataFlashEraseAll: move APC, #0 ; No auto inc/dec of accumulator. move AP, #0 ; Set ACC to A[0]. move DP[0], #0800Dh ; This is where the address of the table is stored. move ACC, @DP[0] ; Get the location of the routine table. add #20 ; Add the index to the flashEraseAll routine. move DP[0], ACC move ACC, @DP[0] ; Retrieve the address of the routine. call ACC ; Execute the routine. ret
ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°ïŒIAPïŒ
ãã©ãã·ã¥ãçšããã»ãšãã©ã®ã·ã¹ãã ã§éèŠãšãªãèŠä»¶ã¯ãã·ã¹ãã ãæçµè£œåã«ã€ã³ã¹ããŒã«ãããŠããéã«ãã¡ãŒã ãŠã§ã¢ãã¢ããããŒãããæ©èœã§ãããã®ããã»ã¹ã¯ãã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ãã³ã°(IAP)ãšåŒã°ããŸãããã®é ã§ã¯ãIAPã¢ããªã±ãŒã·ã§ã³ãäœæããããã®äžè¬çãªã¬ã€ãã©ã€ã³ã®æŠèŠã説æããŸãã
äžè¿°ã®ãŠãŒãã£ãªãã£ROMãã©ãã·ã¥ã®ã«ãŒãã³ããã©ãã·ã¥ROMã®æ¶å»ãšæžèŸŒã¿ã«å¿ èŠãªãã¹ãŠã®åäœãå®è¡ããŸããããã«ãã£ãŠããšã³ããŠãŒã¶ã®ã¢ããªã±ãŒã·ã§ã³ããã©ãã·ã¥ã¡ã¢ãªã«å¯Ÿããæäœãè¡ããããã«ãªããŸããä»ã®ãµãã«ãŒãã³ã®åŒåºããšåæ§ãã«ãŒãã³ãå®äºãããšå¶åŸ¡ã¯ãšã³ããŠãŒã¶ã®ã³ãŒãã«æ»ããŸãã
ä¿¡é Œæ§ã®é«ãIAPãå®çŸããã«ã¯ãããŒãããŒãã¢ããªã±ãŒã·ã§ã³ãã¡ã€ã³ã®ã¢ããªã±ãŒã·ã§ã³ããåé¢ããå¿ èŠããããŸããããããããšã§ãåããã°ã©ãã³ã°ã·ãŒã±ã³ã¹ãå®äºããªãã£ãå Žåã«åããã°ã©ãã³ã°æé ã確å®ã«å詊è¡ããããšãå¯èœã«ãªããŸãã
ããŒãããŒã
ROMã¯åæååŸãã¢ãã¬ã¹0x0000ã«ãžã£ã³ãããŸãããããã£ãŠãããŒãããŒãã¢ããªã±ãŒã·ã§ã³ã®ãšã³ããªãã€ã³ãã¯0x0000ã«é 眮ããå¿ èŠããããŸããããŒãããŒãã¢ããªã±ãŒã·ã§ã³ã¯ããã©ãã·ã¥ã®ã»ã¯ã¿/ããŒãžãå¿ èŠãªæ°ã«ãŸã§æ¡åŒµããããšãå¯èœã§ãããäœ¿çšæžã¿ã®ãããã®ããŒãžãããŠãŒã¶ã®ã¢ããªã±ãŒã·ã§ã³ã³ãŒãã§å©çšããããšã¯ã§ããŸããããã©ãã·ã¥ã®æ¶å»ãšæžèŸŒã¿ãè¡ããšãã«æºãããªããã°ãªããªãç¹å®ã®èŠä»¶ã衚6ã«ç€ºããŸãã
衚6. ãã©ãã·ã¥ãŠãŒãã£ãªãã£ROMã®ã«ãŒãã³ãåŒã³åºãå Žåã®èŠä»¶
ã³ãŒããå®è¡ããŠãããã©ãã·ã¥ããŒãžãšåããã©ãã·ã¥ããŒãžããæ¶å»ãŸãã¯ããã°ã©ã ããããšã¯ã§ããŸãããããã¯éåžžãåé¡ã«ã¯ãªããŸããããã©ãã·ã¥ã®ããŒãããŒãã¢ããªã±ãŒã·ã§ã³ã¯IAPã®éã«æ±ºããŠæ¶å»ããŠã¯ãªããªãããã§ãã |
ãŠã©ããããã°ãæå¹ã«ããªãã§ãã ããããããã¯ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããååã«é·ãèšå®ããããšã«ãã£ãŠãflashEraseSector()ãŸãã¯flashErasePage()ã®ã«ãŒãã³ãåŒã³åºãåã«ããªã»ãããèµ·åãããããšãªããã®ã«ãŒãã³ãå®äºããããã«ããŠãã ãããæ¶å»ãå®äºããåã«ãŠã©ããããã°ã®ã¿ã€ã ã¢ãŠããçºçãããšã補åããªã»ãããããŸãã |
ãŠãŒãã£ãªãã£ROMã«ã¢ã¯ã»ã¹ããããã«ã¯ãã·ã¹ãã å¶åŸ¡ã¬ãžã¹ã¿ãããSC.UPAã0ã«èšå®ããå¿ èŠãããããã0x8000ãããã¯ãããããäžäœã®ããã°ã©ã ã¡ã¢ãªããããã«ãŠãŒãã£ãªãã£ROMã«ãŒãã³ãåŒã³åºãããšã¯ã§ããŸãããäžäœã®ã¡ã¢ãª(â§ 0x8000)ã®ããã°ã©ã ãããŠãŒãã£ãªãã£ROMã«ãŒãã³ã«ã¢ã¯ã»ã¹ããå¿ èŠãããå Žåãäžäœã®ã¡ã¢ãª(< 0x8000)ã«çœ®ãããã«ãŒãã³ãéããŠROMã«ãŒãã³ã鿥çã«åŒã³åºãå¿ èŠããããŸãããã®å¶çŽããããããå®è³ªçã«ããŒãããŒãã¯64KB (32KB x 16)ã«å¶éãããŸãã |
å³4ã®ãããŒãã£ãŒãã¯ããªã»ããç¶æ ããæãåºãããšãã®MAXQ7665ã®åäœã瀺ããŠããŸããROMãã®ãã®ã蚺æãããã©ãã·ã¥ã®æºåãå®äºããŠããããšã確èªããåŸãROMåæåã³ãŒãã¯ãçŽã¡ã«ã¢ãã¬ã¹0x0000ã«ãžã£ã³ãããŸãã
å³4. ç°¡æROMåæåã®ãããŒãã£ãŒã
å³5ã®ãããŒãã£ãŒãã¯ãç°¡æããŒãããŒãã¢ããªã±ãŒã·ã§ã³ã®æ©èœã瀺ããŠããŸããç°¡æã¢ããªã±ãŒã·ã§ã³ã®ãããã¯ã次ã®ããã«ãªããŸãã
typedef struct { u16 iSize; // The size of the application in words u32 iCRC; // The CRC of the application u8 ID[8]; // ID string for current application } APPLICATION_HEADER;ãã®ãããã®æ å ±ã䜿çšããããšã«ãã£ãŠãããŒãããŒãã¯ãèŠæ±ãããå Žåã«ãã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ããã°ã©ã ã®åŠ¥åœæ§ãæ€æ»ããããŒãžã§ã³ã®èå¥çªå·ãå ±åããããšãã§ããŸãã
å³5. ç°¡æãã©ãã·ã¥ããŒãããŒãã®ãããŒãã£ãŒã
ããã°ã©ãã³ã°ã®ã·ãŒã±ã³ã¹ãã®ãã®ã¯éåžžã«ç°¡åã§ããflashEraseSector()ãflashErasePage()ã®åŒåºããéããŠã¡ã€ã³ã¢ããªã±ãŒã·ã§ã³ã³ãŒããå«ãåã»ã¯ã¿/ããŒãžãæ¶å»ããŸããæ¬¡ã«ãããã°ã©ã ããå¿ èŠã®ãã32ã¯ãŒãããšã«flashWrite()ãåŒã³åºãããšã«ãã£ãŠãäžåºŠã«1ããŒãžãæžã蟌ã¿ãŸããCRCç §åã®èª€ãå¯èœæ§ãæå°éã«ãããããã¢ããªã±ãŒã·ã§ã³ããããæ ŒçŽããããŒãžãæåã«æ¶å»ããCRCããŒã¿ãæåŸã«ããã°ã©ã ããããã«ããŠãã ãããã·ãªã¢ã«ããŒããçµç±ããŠããŒã¿ãååŸãããã€ã¯ãã³ã³ãããŒã©ããªãã©ãã·ã¥ããããã®æ¥µããŠç°¡æãªã«ãŒãã³ã¯ã次ã®ããã«ãªããŸãã
/* // VerySimpleReFlash() // As simple as it gets. // Step 1. Wait for erase command, then erase flash. // Step 2. Wait for program command, program flash one word at a time. */ void VerySimpleReFlash() { u16 iStatus; // The status returned from flash utility ROM calls s32 iSize; // The size of the main code to program u16 *pAddress = 0x2000; // The starting address of the main application u16 i; InitializeCOMM(); // Can be CAN or UART. WaitForEraseCommand(); // Assume that application starts at the beginning of a sector. for (i=C_START_SECTOR;i0) { u16 iData[32]; Get32WordsFromCOMM(iData); iStatus = flashWrite(pAddress, iData); if (iStatus) break; pAddress += 32; iSize -= 32; UpdateWatchdog(); // Prevent timeout } SendFlashWriteResponse(iStatus); ResetMicro(); }