共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 跳转至页
回复
打赏帖 | |
---|---|
【STM32F769】AI之与本地deepseek对接被打赏50分 | |
Buck电路工作在CCM模式下电感电流的计算公式是什么?被打赏5分 | |
buck电路工作原理被打赏5分 | |
基于MSPM0L1306的MODBUS-RTU协议通讯实验被打赏100分 | |
我想要一部加热台+多合一调试工具被打赏18分 | |
每周了解几个硬件知识+485硬件知识分享被打赏10分 | |
【换取手持数字示波器】树莓派PICO调试器官方固件本地化部署实践被打赏24分 | |
【换取手持数字示波器】分享一个KEIL无法识别CMSIS-DAP调试器的解决办法被打赏20分 | |
【换取手持数字示波器】分享一个自制的ArduinoNano扩展板底板被打赏23分 | |
【换取手持示波器】树莓派PICOW网页烟花被打赏18分 |