CH579 OTA一个很奇怪的问题

目的是将程序跳转到放在地址 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 ******************************/




更奇怪的,那些打印循环,可以让它打印一次,也能正确运行


只有登录才能回复,可以选择微信账号登录