目的是将程序跳转到放在地址 0x34800的IAP程序。但在擦除地址 0 段的过程中会死在擦除函数中。
但将flash例程中的代码,移植到程序前面,这个过程就不会死机。
奇怪的问题在于即便删除flash例程中的不相关代码,例如,打印,也会导致仍然会死在擦除函数中。
具体卡死位置为 ch57x_flash.c L115 行之后, 即: R8_FLASH_COMMAND=ROM_CMD_ERASE;
附件上传说服务器返回失败,,只能贴代码,如下。
/********************************** (C) COPYRIGHT ******************************* * File Name : main.c * Author : JFM * Version : V1.0 * Date : 2018/11/12 * Description : 本程序通过2.4G接收程序的IAP,并将之更新到APP ********************************************************************************* * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd. * Attention: This software (modified or not) and binary are used for * microcontroller manufactured by Nanjing Qinheng Microelectronics. *******************************************************************************/ /******************************************************************************/ /* 头文件包含 */ #include "CONFIG.h" #include "CH57x_common.h" #include "HAL.h" #include "OTA.h" #include "RF_PHY.h" /********************************************************************* * GLOBAL TYPEDEFS */ __align(4) u32 MEM_BUF[BLE_MEMHEAP_SIZE/4]; __align(4) u8 Vector_BUF[512]; #define IMAGE_A_ADDR 0 #define IMAGE_B_ADDR 0x0001A400 #define IMAGE_IAP_ADDR 0x00034800 #define TEST_CODEADDR 0x24800 #define TEST_CODESIZE 128 /******************************************************************************* * Function Name : main * Description : 主函数 * Input : None * Output : None * Return : None *******************************************************************************/ UINT32 TestBuf[ TEST_CODESIZE ]; int main( void ) { UINT8 key_tmp=0; UINT16 i=0; PUINT32 p_flash,p32; UINT32 TEST_ADD=0x24800; #if (defined (HAL_SLEEP)) && (HAL_SLEEP == TRUE) GPIOA_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU ); GPIOB_ModeCfg( GPIO_Pin_All, GPIO_ModeIN_PU ); #endif #ifdef DEBUG GPIOA_SetBits( bTXD1 ); GPIOA_ModeCfg( bTXD1, GPIO_ModeOut_PP_5mA ); UART1_DefInit( ); #endif GPIOB_ModeCfg( GPIO_Pin_6, GPIO_ModeIN_PU ); PRINT("OLD A start.\n"); { PRINT("%s\n",VER_LIB); } CH57X_BLEInit( ); HAL_Init( ); RF_RoleInit( ); RF_Init( ); while(1){ if(GPIOB_ReadPortPin(GPIO_Pin_6)==0){ if(key_tmp==0){ PRINT("JUMP IAP.\n"); key_tmp=1; /* p32 = (PUINT32)TEST_CODEADDR; PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); for(i=0; i<TEST_CODESIZE; i++) { PRINT("%08lx ",*p32++); }PRINT("\n"); p32 = (PUINT32)TEST_CODEADDR; PRINT( "Earse addr=0x%08lx : ", (UINT32)p32 ); i = FlashBlockErase( (UINT32)p32 ); if( i == SUCCESS ) PRINT("success..\n"); else PRINT("failed..\n"); */ ////////////////////////////以下这段代码删掉任何一块,都会导致卡死在擦除过程/////////////////////////////////// p32 = (PUINT32)TEST_CODEADDR; PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); for(i=0; i<TEST_CODESIZE; i++) { PRINT("%08lx ",*p32++); }PRINT("\n"); for(i=0; i<TEST_CODESIZE; i++) { TestBuf[i] = i; TestBuf[i] = (TestBuf[i]<<8) | i; TestBuf[i] = (TestBuf[i]<<8) | i; TestBuf[i] = (TestBuf[i]<<8) | i; } p32 = (PUINT32)TEST_CODEADDR; PRINT( "Write addr=0x%08lx : ", (UINT32)p32 ); i = FlashWriteBuf( (UINT32)p32, TestBuf, TEST_CODESIZE*4 ); if( i == SUCCESS ) PRINT("success..\n"); else PRINT("failed..\n"); p32 = (PUINT32)TEST_CODEADDR; PRINT( "Read addr=0x%08lx :\n", (UINT32)p32 ); for(i=0; i<TEST_CODESIZE; i++) { PRINT("%08lx ",*p32++); } PRINT("\n"); //DelayMs( 5000 ); /* 编程ImageA第一块 */ PRINT("ORG.\n"); FlashBlockErase(TEST_ADD); p_flash = (PUINT32)IMAGE_IAP_START_ADD; for(i=0;i<FLASH_BLOCK_SIZE/sizeof(UINT32);i++){ TestBuf[i]=*(p_flash+i); PRINT(" %08lx ",*(p_flash+i)); if(((i+1)%8)==0){ PRINT("-----%03d\n",i); } } i = (UINT32)FlashWriteBuf(TEST_ADD,TestBuf, FLASH_BLOCK_SIZE); // p_flash = (PUINT32)TEST_ADD; // if( i == SUCCESS ) PRINT("success..\n"); // else PRINT("failed..\n"); //PRINT("CPY.\n"); // for(i=0;i<FLASH_BLOCK_SIZE/sizeof(UINT32);i++){ // PRINT(" %x ",*(p_flash+i)); // if(((i+1)%8)==0){ // PRINT("-----%03d\n",i); // } // } //////////////////////////以上这段代码删掉任何一块,例如上面注释,就会导致卡死在擦除过程////////////////////////////////////////////////////////////// PRINT("UPD.\n"); p_flash = (PUINT32)IMAGE_IAP_START_ADD; /* 关闭当前所有使用中断,或者方便一点直接全部关闭 */ DisableAllIRQ(); PRINT("ERA.\n"); FlashBlockErase(IMAGE_A_START_ADD); //清除芯片的第一块 PRINT("WRI.\n"); FlashWriteBuf(IMAGE_A_START_ADD, p_flash, FLASH_BLOCK_SIZE); PRINT("JUMP .\n"); /* 保证打印结束 */ DelayMs( 10 );// /* 复位,进用户程序运行,跳转到IAP程序 */ SYS_ResetExecute( ); } }else{ key_tmp=0; } TMOS_SystemProcess( ); } } /******************************** endfile @ main ******************************/
热门产品 :
CH32L103: 32位PDUSB低功耗单片机