![]() |
|
||||||||||||||
| | 首页 | 新闻 | 文库 | 方案 | 技术 | 独家 | 座谈 | 下载 | 图库 | 开发板 | 仿真器 | 邮购 | VIP会员 | 芯片代购 | 客户评价 | | ||
|
||
|
|||||
| ADSP-21XX对FLASH编程的例子程序 | |||||
作者:佚名 文章来源:Internet 点击数: 更新时间:2006-12-19 ![]() |
|||||
|
#include <Def2181.h> #include "constant.h" .global FLASH_ByteWrite; .global FLASH_ByteRead; .global FLASH_Erase; .global BDMA_BootLoader; .GLOBAL BDMA_Addr_Hi; .GLOBAL BDMA_Addr_Lo; .GLOBAL BDMA_ControlMask; .GLOBAL BDMA_ReadControlMask; .GLOBAL FLASH_XferWord; .GLOBAL BDMA_XferLength; .section/data seg_data1; .GLOBAL BDMA_XferSpace; .VAR/CIRC BDMA_XferSpace[0x0800]; { 2048 16 bit locations } .VAR BDMA_Addr_Hi; .VAR BDMA_Addr_Lo; .VAR BDMA_ReadControlMask = 0x0001; .VAR BDMA_ControlMask = 0x0001; {16 bit DM load from BM run during BDMA} .VAR FLASH_XferWord; .VAR BDMA_XferLength; .VAR BDMA_Ready = 1; {1=transfer complete, 0=transfer incomplete} .VAR BDMA_TempStorage; .section/pm seg_code; FLASH_ByteRead: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR; AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; imask = 0x0008; ena ints; { send 0x00XX to address 0xXXXXXX } ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = dm(BDMA_Addr_Lo); dm(BDMA_External_Address) = ar; { mask off the top 8 bits } ar = DM(BDMA_Control); Ay0 = 0x00FF; ar = ar and ay0; DM(BDMA_Control) = AR; ar = dm(BDMA_Addr_Hi); /* ay0 = 0x0003; */ ay0 = dm(BDMA_ReadControlMask); SE = 8; SR = LSHIFT AR(LO); AR = SR0; ar = ar or ay0; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; imask = 0x001; ena ints; rts; {****************************************************************************** * FLASH_ByteWrite * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; FLASH_ByteWrite: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR; AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; imask = 0x0008; ena ints; { save the transfer word } ax0 = dm(FLASH_XferWord); { send 0x00AA to address 0x5555} { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } {send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } { send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55; {send 0x00A0 to address 0x5555} ar = FLASH_00A0; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; { send 0x00XX to address 0xXXXXXX } dm(FLASH_XferWord) = ax0; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = dm(BDMA_Addr_Lo); dm(BDMA_External_Address) = ar; ar = dm(BDMA_Addr_Hi); ay0 = 0x0007; SE = 8; SR = LSHIFT AR (LO); AR = SR0; ar = ar or ay0; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; cntr = 0x00FF; do FLASH_CommandWrite0 until ce; nop; cntr = 0x00FF; do FLASH_CommandWrite1 until ce; nop; nop; FLASH_CommandWrite1: nop; nop; FLASH_CommandWrite0: nop; imask = 0x001; ena ints; rts; {****************************************************************************** * BDMA_Resolve * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: AX0, AY0, AR * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; FLASH_Erase: { set the BMWAIT value to 7 } AR = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = AR; AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; imask = 0x0008; ena ints; { send 0x00AA to address 0x5555} { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } {send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle;} { send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55; {send 0x0080 to address 0x5555} ar = 0x0080; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; { send 0x00AA to address 0x5555 } { ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } {send 0x0055 to address 0x2AAA} { ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_2AAA_LO; dm(BDMA_External_Address) = ar; ar = FLASH_2AAA_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; } { send 0x00AA to address 0x5555 } { send 0x0055 to addresss 0x2AAA } call FLASH_Begin555_AA_2AAA_55; { send 0x0010 to address 0x5555} ar = 0x0010; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; dm(BDMA_Internal_Address) = ar; ar = FLASH_5555_LO; dm(BDMA_External_Address) = ar; ar = FLASH_5555_HI; dm(BDMA_Control) = ar; ar = 0x0001; dm(BDMA_Word_Count) = ar; idle; { about 10 seconds of delay here } cntr = 0x3FFF; do FLASH_EraseDelay0 until ce; nop; cntr = 0x2FFF; do FLASH_EraseDelay1 until ce; nop; nop; FLASH_EraseDelay1: nop; nop; FLASH_EraseDelay0: nop; imask = 0x001; ena ints; rts; {****************************************************************************** * BDMA_BootLoader: * * REGISTER USAGE SUMMARY: * input : none * update : none * output : none * destroy: ALL * keep : none * memory : none * calls : none * ******************************************************************************} .section/pm seg_code; BDMA_BootLoader: { enter not pressed start BDMA load } { by loading 32 words starting from 0x0400 } { the begining of the unprotected flash space } { if the EZ-KIT is default from the factory...} { there will be a monitor program located here } { if the user has overwritten it, there will be a } { user program located here. } { disable all interrupts } IMASK = 0x0000; { clear all pending interrupts } IFC = 0x00FF; AR = 0xFFFF; DM(0x3FFE) = AR; { CHANGE WAIT STATE TO MAX WAITS } NOP; { set BWCOUNT to 32 } { BDIR, BMPAGE, BEAD, BIAD, BTYPE = 0 } { BCR = 1 } { BMWAIT = 7 } ax0 = 0x0000; dm(BDMA_Internal_Address) = ax0; { load to PM 0x000000 } ax0 = 0x0000; dm(BDMA_External_Address) = ax0; { load from 0x01000 holds bits 0 - 13 } {ax0 = 0x0100;} {ax0 = b#0000010001000;} ax0 = b#0000000100001000; dm(BDMA_Control) = ax0; { load from 0x04000 upper byte is bits 14 - 21 } { set the BMWAIT value to 7 } ax0 = 0xFFFF; dm(Prog_Flag_Comp_Sel_Ctrl) = ax0; { load BDMA count which will start the transfer } ax0 = 32; dm(BDMA_Word_Count) = ax0; {enable BDMA interrupt } IMASK = 0x008; nop; idle; nop; {should never get this far } jump 0x000000; {jump and start executing the loader } rts; .global BDMA_DoIt; .section/pm seg_code; BDMA_DoIt: dm(BDMA_Internal_Address) = ar; dm(BDMA_External_Address) = ax1; dm(BDMA_Control) = ay0; dm(BDMA_Word_Count) = ay1; idle; rts; .global FLASH_Begin555_AA_2AAA_55; .section/pm seg_code; FLASH_Begin555_AA_2AAA_55: { send 0x00AA to address 0x5555} ar = FLASH_00AA; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; ax1 = FLASH_5555_LO; ay0 = FLASH_5555_HI; ay1 = 0x0001; call BDMA_DoIt; {send 0x0055 to address 0x2AAA} ar = FLASH_0055; dm(FLASH_XferWord) = ar; ar = FLASH_XferWord; ax1 = FLASH_2AAA_LO; ay0 = FLASH_2AAA_HI; ay1 = 0x0001; call BDMA_DoIt; rts; |
|||||
| 文章录入:admin 责任编辑:admin | |||||
| 【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口】 | |||||
| 最新热点 | 最新推荐 | 相关文章 | ||
| uclinux-2008R1-RC8(bf561)到 基于DDS芯片AD9851的精密跳频 基于Blackfin DSP的函数_任意 DSP芯片外围电路典型设计 放大器输入保护的利与弊 隔离式电压/电流传感器1B21的 仪表放大器:怎样构建与何时 AD8369,10,7M 两级AD8369做1 请教一个关于AD8310功耗的问 差错和不足:ADI《仪表放大器 |
| 网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!) |
| | 本站介绍 | 合作联络 | 欢迎投稿 | 广告业务 | 网站地图 | 设为首页 | 加入收藏 | 友情链接 | 网站公告 | 联系我们 | | |||
|