共2条
1/1 1 跳转至页
问
我在IAP例子上如下修改为何不行:
void main(void)
{
uint32 i1;
uint32 *ramp;
uint32 *flashp;
IAP_Entry = (void(*)())IAP_ENTER_ADR; // 初始化函数指针IAP_Entry
flashp=(uint32*)0x0001c000; //使用LPC2104 序号14的扇区
ramp=(uint32*)0x40000200;
for(i1=0;i1<8;i1++)
{*ramp=i1;++ramp;}
ReadParID();
BootCodeID();
SelSector(14,14); // 选择扇区14
EraseSector(14,14); // 擦除扇区14
BlankCHK(14,14) ; // 查空扇区14
SelSector(14,14);
RamToFlash(0x0001c000,0x40000200,8); // 写数据到扇区14
BlankCHK(14,14) ;
Compare(0x0001c000,0x40000200,512); // 比较数据
while(1);
return(0);
}
问题1:为何执行 RamToFlash(0x0001c000,0x40000200,8); 就死机
问题2: 这么写 RamToFlash(flashp,ramp,8); 为何错误
答 1: 第一问知道了 答 2: 写入字节数不对RamToFlash(flashp,ramp,8);
不能是8个,必须是512的2的N次方倍,请查看红皮书 答 3: 老兄解决了吗?我也碰到同样问题了 答 4: 我的程序中用IAP就死将iap加到我的程序中,一运行到写FLash就死掉。
int main(void)
{
uint32 cnt,cnt1;
uint8 last;
uint8 i;
uint8 temp[512];
uint8 *p;
uint8 Flash_Var[512];//系统变量在内存中的位置
p=(uint8 *)0x1C000;
Serial_Init(); //串口调试的初始化
Output_Init(); //led和继电器的初始化
LCD_Init(); //lcd的初始化
Eeprom_Init(); //i2c以及eeprom的初始化
RTCinter_Init(); //内部时钟的初始化
RTCinter_Set();
// Watchdog_Init(); //看门狗初始化
Key_Init(); //按键输入的初始化
Feed_Dog();
DelayNS(10);
Feed_Dog();
LCD_Clear();
FlagKeyPressed=1;
KeyValue=RUN;
LCD_Clear();
LCD_Send_Data( 7,8); //在第7个字符处显示站号
LCD_Send_Data( 6,8); //在第7个字符处显示站号
for(i=0;i<512;i++)
Flash_Var[i]=1; //将系统变量读出来
MAMCR = 0; // 关闭MAM
PLLCON = 0; // 关闭PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
SelSector(14,14); // 选择扇区1
EraseSector(14,14); // 擦除扇区1
SelSector(14,14);
RamToFlash(0x0001C000, (uint32)Flash_Var, 512); // 写数据到扇区1
TargetResetInit();
while(1)
{
Display_Inter_Time(); //显示内部时钟的时间数值
Output_Driver(); //驱动继电器和led
Key_Process(); //按键处理程序
}
return(0);
}
答 5: iap没有问题,是有个变量弄错了程序中的变量应该定义为 uint32,如果定义成uint8就永远出不了循环了。
void main(void)
{
uint32 i1;
uint32 *ramp;
uint32 *flashp;
IAP_Entry = (void(*)())IAP_ENTER_ADR; // 初始化函数指针IAP_Entry
flashp=(uint32*)0x0001c000; //使用LPC2104 序号14的扇区
ramp=(uint32*)0x40000200;
for(i1=0;i1<8;i1++)
{*ramp=i1;++ramp;}
ReadParID();
BootCodeID();
SelSector(14,14); // 选择扇区14
EraseSector(14,14); // 擦除扇区14
BlankCHK(14,14) ; // 查空扇区14
SelSector(14,14);
RamToFlash(0x0001c000,0x40000200,8); // 写数据到扇区14
BlankCHK(14,14) ;
Compare(0x0001c000,0x40000200,512); // 比较数据
while(1);
return(0);
}
问题1:为何执行 RamToFlash(0x0001c000,0x40000200,8); 就死机
问题2: 这么写 RamToFlash(flashp,ramp,8); 为何错误
答 1: 第一问知道了 答 2: 写入字节数不对RamToFlash(flashp,ramp,8);
不能是8个,必须是512的2的N次方倍,请查看红皮书 答 3: 老兄解决了吗?我也碰到同样问题了 答 4: 我的程序中用IAP就死将iap加到我的程序中,一运行到写FLash就死掉。
int main(void)
{
uint32 cnt,cnt1;
uint8 last;
uint8 i;
uint8 temp[512];
uint8 *p;
uint8 Flash_Var[512];//系统变量在内存中的位置
p=(uint8 *)0x1C000;
Serial_Init(); //串口调试的初始化
Output_Init(); //led和继电器的初始化
LCD_Init(); //lcd的初始化
Eeprom_Init(); //i2c以及eeprom的初始化
RTCinter_Init(); //内部时钟的初始化
RTCinter_Set();
// Watchdog_Init(); //看门狗初始化
Key_Init(); //按键输入的初始化
Feed_Dog();
DelayNS(10);
Feed_Dog();
LCD_Clear();
FlagKeyPressed=1;
KeyValue=RUN;
LCD_Clear();
LCD_Send_Data( 7,8); //在第7个字符处显示站号
LCD_Send_Data( 6,8); //在第7个字符处显示站号
for(i=0;i<512;i++)
Flash_Var[i]=1; //将系统变量读出来
MAMCR = 0; // 关闭MAM
PLLCON = 0; // 关闭PLL
PLLFEED = 0xAA;
PLLFEED = 0x55;
SelSector(14,14); // 选择扇区1
EraseSector(14,14); // 擦除扇区1
SelSector(14,14);
RamToFlash(0x0001C000, (uint32)Flash_Var, 512); // 写数据到扇区1
TargetResetInit();
while(1)
{
Display_Inter_Time(); //显示内部时钟的时间数值
Output_Driver(); //驱动继电器和led
Key_Process(); //按键处理程序
}
return(0);
}
答 5: iap没有问题,是有个变量弄错了程序中的变量应该定义为 uint32,如果定义成uint8就永远出不了循环了。
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 | |
【FRDM-MCXN947评测】核间通信MUTEX被打赏50分 |