
不过我用的是LPC2214芯片,解决办法应该类似,
在调用IAP程序之前,要保证所有的中断是关闭状态,然绝唯后
uint8 a[10]
uchar i
for(i=0i<10i++)
{
a[i]=0x0B
}
SelSector(START_SECTOR,END_SECTOR)
//选择扇区 将要保存的数据放在,第十扇区,
EraseSector(START_SECTOR,END_SECTOR)
//擦除扇区
BlankCHK(START_SECTOR,END_SECTOR)
//型宏亮查空扇区
SelSector(START_SECTOR,END_SECTOR)
//选择扇区 将要保存的数据放在,第十扇区,
RamToFlash(START_ADDR,(uint32)p_Config_Init,BYTE_NUM_1)
SelSector(START_SECTOR,END_SECTOR)
//选择扇区 将要保存卜宽的数据放在,第十扇区,
RamToFlash(BAK_ONE_START_ADDR,(uint32)p_Config_Bak,BYTE_NUM_1)
前面定义一个数组并进行初始化没有什么实质意义,但是却能够使程序正常运行,我想应该是在 *** 作时RAM地址出现冲突,以至于使SelSector(START_SECTOR,END_SECTOR)会进入“取指令中断错误”。加上前面对数组定义可能会对RAM地址有所影响,从而使对IAP的 *** 作能够正常进行。
我所用的是LPC2214,可能和你的问题不太一样,试试吧!
支持。实现IAP技术的核心是一段预先烧写在单片机内部的IAP程序。这段程序主要负责与外部胡吵的上位机软件进行握手同步,然后将通过外设通信接陆做仿口将来自于上位机软件的程序数据接收后写入单片机内部指定的闪存区早纤域,然后再跳转执行新写入的程序,最终就达到了程序更新的目的。
IAP的方式是写入到程序Flash区保持数据不丢失
写之前要保证区域内没有会被执行到的程序。否则写入数据后会导致程序死机会不断重启。
支持IAP的单片机类型比较多,请提供具体型号
以IAP15F2K61S2为例(STC官方代码)
//IAP特殊功能寄存器:sfr IAP_DATA = 0xC2 //IAP数据寄存器
sfr IAP_ADDRH = 0xC3 //IAP地址寄存器高字节
sfr IAP_ADDRL = 0xC4 //IAP地址寄存器低字节
sfr IAP_CMD = 0xC5 //IAP命令寄存器
sfr IAP_TRIG = 0xC6 //IAP命令触发寄存器
sfr IAP_CONTR = 0xC7 //IAP控制寄存器
//IAP工作模式
#define CMD_IDLE 0 //空闲模式
#define CMD_READ 1 //IAP字节读命令
#define CMD_PROGRAM 2 //IAP字节编程命令
#define CMD_ERASE 3 //IAP扇区擦除命令
//单片机运行频率
//#define ENABLE_IAP 0x80 //if SYSCLK<30MHz
//#define ENABLE_IAP 0x81 //if SYSCLK<24MHz
#define ENABLE_IAP 0x82 //if SYSCLK<20MHz
//#define ENABLE_IAP 0x83 //if SYSCLK<12MHz
//#define ENABLE_IAP 0x84 //if SYSCLK<6MHz
//#define ENABLE_IAP 0x85 //if SYSCLK<3MHz
//#define ENABLE_IAP 0x86 //if SYSCLK<2MHz
//#define ENABLE_IAP 0x87 //if SYSCLK<1MHz
//测试地址
#define IAP_ADDRESS 0x0400
/*----------------------------
扇区擦除
----------------------------*/
void IapEraseSector(WORD addr)//擦除扇区是以512字节为单位
{
IAP_CONTR = ENABLE_IAP //使能IAP
IAP_CMD = CMD_ERASE //设置IAP命令
IAP_ADDRL = addr //设置IAP低地址
IAP_ADDRH = addr >> 8 困扒滚 //设置IAP高地址
IAP_TRIG = 0x5a //写触发命令(0x5a)
IAP_TRIG = 0xa5 //写触发命令(0xa5)
_nop_() //等待ISP/IAP/EEPROM *** 作完成
IapIdle()
}
/*----------------------------
写一字节数据到ISP/IAP区域
----------------------------*/
void IapProgramByte(WORD addr, BYTE dat)
{
IAP_CONTR = ENABLE_IAP //使能IAP
IAP_CMD = CMD_PROGRAM 汪余 //设置IAP命令
IAP_ADDRL = addr //设置IAP低地址
IAP_ADDRH = addr >> 8 //设置IAP高地址
IAP_DATA = dat //写ISP/IAP/EEPROM数据
IAP_TRIG = 0x5a //写触发命令(0x5a)
IAP_TRIG = 0xa5 //写触发命令(0xa5)
_nop_() //等待ISP/IAP/EEPROM *** 作完成
IapIdle()
}
/*----------------------------
从ISP/IAP/EEPROM区域读取一字节
----------------------------*/
BYTE IapReadByte(WORD addr)//由于在程序储存区内也可以用MOVC指令读取
{
BYTE dat //数此丛据缓冲区
IAP_CONTR = ENABLE_IAP //使能IAP
IAP_CMD = CMD_READ //设置IAP命令
IAP_ADDRL = addr //设置IAP低地址
IAP_ADDRH = addr >> 8 //设置IAP高地址
IAP_TRIG = 0x5a //写触发命令(0x5a)
IAP_TRIG = 0xa5 //写触发命令(0xa5)
_nop_() //等待ISP/IAP/EEPROM *** 作完成
dat = IAP_DATA //读ISP/IAP/EEPROM数据
IapIdle() //关闭IAP功能
return dat //返回
}
/*----------------------------
关闭IAP
----------------------------*/
void IapIdle()
{
IAP_CONTR = 0 //关闭IAP功能
IAP_CMD = 0 //清除命令寄存器
IAP_TRIG = 0 //清除触发寄存器
IAP_ADDRH = 0x80 //将地址设置到非IAP区域
IAP_ADDRL = 0
}
通过以上代码即可对Flash区进行写入 *** 作
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)