查看: 1482|回复: 0

[分享] LPC51u68 SDKv2.8.2使用Reinvoke ISP 命令注意事项

[复制链接]

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20038
最后登录
2024-4-26
发表于 2020-12-14 11:19:05 | 显示全部楼层 |阅读模式
本帖最后由 小恩GG 于 2021-1-5 16:23 编辑


本文主要讲述在SDKv2.8.2中,使用Reinvoke ISP命令时的一些问题以及解决办法

Reinvoke ISP是一个IAP 命令,在用户代码中调用,可以从用户模式直接跳转到ISP模式。尤其当ISP引脚配置成了其它功能,此时可以调用这个IAP命令进入ISP模式。
1111.jpg

在LPC51u68 SDKv2.8.2中(SDK_2.8.2_LPCXpresso51U68\devices\LPC51U68\drivers\fsl_iap.c,
已经实现了Reinvoke ISP 命令,如下:
*!
*@brief Reinvoke ISP.
*
*This function is used to invoke the boot loader in ISP mode. It maps bootvectors and configures the peripherals for
*ISP.
*
*@param ispTyoe ISP type selection.
*@param status store the possible status.
*
*@retval kStatus_IAP_ReinvokeISPConfig reinvoke configuration error.
*
*note The error response will be returned when IAP is disabled or an invalid ISPtype selection appears. The call
*won't return unless an error occurs, so there can be no status code.
*/
voidIAP_ReinvokeISP(uint8_t ispType, uint32_t *status)
{
    uint32_t command[5] = {0x00U};
    uint32_t result[5]  = {0x00U};
    uint8_t ispParameterArray[8];

    command[0] =(uint32_t)kIapCmd_IAP_ReinvokeISP;
    (void)memset(ispParameterArray, 0,sizeof(uint8_t) * 8U);
    ispParameterArray[1]= ispType;
   ispParameterArray[7] = ispParameterArray[0] ^ ispParameterArray[1] ^ispParameterArray[2] ^ ispParameterArray[3] ^
                           ispParameterArray[4]^ ispParameterArray[5] ^ ispParameterArray[6];
   command[1] = (uint32_t)ispParameterArray;
   iap_entry(command, result);
   *status = (uint32_t)translate_iap_status(result[0]);
}

但是,
1.当直接使用这个函数时,却无法进入ISP模式,需要修改为如下形式:
void IAP_ReinvokeISP(uint8_tispType, uint32_t *status)
{
   uint32_tcommand[2]= {0x00U};
   uint32_t result[2]={0x00U};

   command[0] =(uint32_t)kIapCmd_IAP_ReinvokeISP;
   command[1]=(uint32_t)ispType;

   iap_entry_no_irq(command, result);
   *status = (uint32_t)translate_iap_status(result[0]);
}

2. 经实践,如果想进入USB ISP模式,iap_entry也需要修改。
static inline void iap_entry(uint32_t *cmd_param,uint32_t *status_result)
{
   __disable_irq();
   ((IAP_ENTRY_T)FSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION)(cmd_param,status_result);
   __enable_irq();
}

改为:
static inline void iap_entry(uint32_t *cmd_param,uint32_t *status_result)
{
  //  __disable_irq();
   ((IAP_ENTRY_T)FSL_FEATURE_SYSCON_IAP_ENTRY_LOCATION)(cmd_param,status_result);
//   __enable_irq();

经过这两步修改,调用 IAP_ReinvokeISP(2, &status);就可以进入USB ISP 模式。

在SDK例程“”lpcxpresso51u68_iap_flash”下进行了修改和测试,并且将测试程序贴到了附件中。


ReinvokeISP_lpc51u68_sdk2_8_2.zip

2.43 MB, 下载次数: 1, 下载积分: 威望 1

Reinvoke ISP demo

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /4 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2024-4-27 10:15 , Processed in 0.109401 second(s), 20 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表