我们的例程中选用的是USB与串口的升级方式,用户可以定义自己的接收APP数据的通信方式,需要注意的是,在跳转到APP前,需要先确定关闭了IAP程序中用到的所有中断,防止在APP中开启外设的时候进入中断,而APP中可能并没有编写中断服务函数而导致程序卡在启动文件中弱定义的中断函数中,从而导致APP无法正常运行。
Flash编程,接受的数据在RecData_Deal(void),函数中处理。首先是解锁Flash,为了防止编程过程中被其他中断打断,可以加上关闭全局中断,变成完成之再开启。
X035每页Flash为256字节,仅快速编程:此方式采用页操作方式(推荐)。经过特定序列解锁后,执行单次 256 字节的编程及
256 字节擦除、1K 字节擦除、整片擦除。可以参考EVT例程中的flash编程代码。
printf("16K Erase Suc\r\n");
for (vu8 j = 0; j < 16*4; j++) {
FLASH_Unlock_Fast();
FLASH_ErasePage_Fast(0x08002000+j*256 );
FLASH_BufReset();
for(i=0; i<64; i++){
FLASH_BufLoad(0x08002000+4*i+256*j, buf[i]);
}
FLASH_ProgramPage_Fast(0x08002000+j*256);
}
// printf("256Byte Page Program Suc\r\n");
printf("16k Page Program Suc\r\n");
FLASH_Lock_Fast();
FLASH_Lock();
X035flash快速编程不同之处是,其先将数据加载到缓冲区内,然后调用快速编程函数。二者必须结合使用,每一页都要调用一次,地址也要对应。
确定APP在ld地址没有偏移的情况下调试成功,再进行偏移编译bin文件,IAP升级或者与IAP合并之后用烧录软件一起下载。跳转步骤必须要机器模式下进行。中断函数下是处于机器模式的,例程中flash编程校验之后使能一个软件中断,在中断中跳转,如用其他中断函数跳转须在跳转前清除中断标志位,否则会异常。
void SW_Handler(void) {
__asm("li a6, 0x5000");
__asm("jr a6");
while(1);
}
void TIM1_UP_IRQHandler(void){
//先清除中断标志位
TIM_ClearITPendingBit(TIM1, TIM_IT_Update);
if(TIM_GetITStatus(TIM1, TIM_IT_Update)
{
if(Jump_judgment_value){
__asm("li a6, 0x5000");
__asm("jr a6");
while(1);
}
}
}
标签:编程,中断,APP,FLASH,注意事项,CH32X035,跳转,256,IAP From: https://www.cnblogs.com/wchmcu/p/17683003.html