M4FP 芯片 IAP程序和APP程序互相跳转

IAP(In Application Programming)
,指用户程序在运行过程时能对用户Flash区域进行烧写,目的是为了用户可以方便地通过用户自己预留的通信接口,对用户产品中的固件程序进行更新升级。本方案中采用后台式DFU双区升级模式进行用户APP程序的升级。DFU(DeviceFirmwareUpdate)也就是设备固件升级的意思。

跳转出现问题:
1.IAP跳APP,app跳回IAP时出现串口中断无用?
判断为中断遗失,无法触发接收中断导致,在APP程序跳转时无清除中断标志,将跳转函数移出中断回调函数解决。

IAP起始地址:0x0

APP起始地址:0x44000
在这里插入图片描述

IAP跳转APP:

void jump_to_app(void)
{
    pfun __jump;
   
    __set_PRIMASK(1);           //关闭总中断
	SCB->VTOR =APP_START_ADDR;  //中断向量重新映射
    __set_PRIMASK(0);           //开启总中断

    if(((*(volatile uint32_t*)APP_START_ADDR) & 0x2FFD0000 ) == 0x20000000)     /* 栈顶地址:0x20000000 ~ 0x20002000 */
    {
        __jump = (pfun)(*(volatile uint32_t*)(APP_START_ADDR + 4));	/* 用户代码区第二个字为复位向量 */
        __set_MSP(*(volatile uint32_t*)(APP_START_ADDR));           /* 初始化APP堆栈指针,用户代码区的第一个字为栈顶地址 */
        __jump();                                                   /* 跳转到应用代码 */
    }
    else
    {
        printf("栈顶地址不合法!\r\n");
    }
}

APP跳转IAP:

void jump_to_iap(void)
{
    pfun __jump;
       
    __set_PRIMASK(1);               //关闭总中断
    
    for(int i=0;i<8;i++)
    {
       NVIC->ICER[i] =0xffffffff;
    }

	SCB->VTOR =IAP_START_ADDR;      //中断向量重新映射
    __set_PRIMASK(0);               //开启总中断
    __set_CONTROL(0);
    if(((*(volatile uint32_t*)IAP_START_ADDR) & 0x2FFD8000 ) == 0x20000000)     /* 栈顶地址:0x20000000 ~ 0x20002000 */
    {
        __jump = (pfun)(*(volatile uint32_t*)(IAP_START_ADDR + 4));	/* 用户代码区第二个字为复位向量 */
        __set_MSP(*(volatile uint32_t*)(IAP_START_ADDR));           /* 初始化APP堆栈指针,用户代码区的第一个字为栈顶地址 */
        __jump();                                                   /* 跳转到应用代码 */
    }
    else
    {
        printf("栈顶地址不合法!\r\n");
    }
}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
IAP(In-App Purchase)是指应用内购买,是一种应用商店的商业模式,允许用户在应用内购买虚拟物品或增值服务。在 iOS 开发中,通常使用 StoreKit 框架实现应用内购买。下面是 IAP 跳转 APP 的具体流程和示例代码: 1. 在开发者中心创建应用并配置 IAP 商品 2. 在 Xcode 中创建应用,并添加 StoreKit 框架 3. 首先需要检查用户是否可以进行 IAP,可以使用以下代码: ```swift if SKPaymentQueue.canMakePayments() { // 用户可以进行 IAP } else { // 用户无法进行 IAP } ``` 4. 创建一个 SKProductRequest 对象,并查询 IAP 商品信息 ```swift let productIdentifiers: Set<String> = ["com.example.product1", "com.example.product2"] let request = SKProductsRequest(productIdentifiers: productIdentifiers) request.delegate = self request.start() ``` 5. 实现 SKProductsRequestDelegate 协议方法,处理查询结果 ```swift func productsRequest(_ request: SKProductsRequest, didReceive response: SKProductsResponse) { let products = response.products for product in products { print("\(product.localizedTitle) - \(product.price)") } } func request(_ request: SKRequest, didFailWithError error: Error) { print("查询 IAP 商品信息失败:\(error.localizedDescription)") } ``` 6. 用户选择购买商品后,创建一个 SKMutablePayment 对象,并添加到 SKPaymentQueue 中 ```swift let payment = SKMutablePayment(product: product) payment.quantity = 1 SKPaymentQueue.default().add(payment) ``` 7. 监听交易队列 SKPaymentQueue 的购买状态,处理购买完成后跳转 APP ```swift func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) { for transaction in transactions { switch transaction.transactionState { case .purchased: // 购买成功,跳转 APP SKPaymentQueue.default().finishTransaction(transaction) case .failed: // 购买失败 SKPaymentQueue.default().finishTransaction(transaction) case .restored: // 恢复购买 SKPaymentQueue.default().finishTransaction(transaction) case .deferred: // 交易处于等待状态 break case .purchasing: // 正在购买中 break } } } ``` 以上就是 IAP 跳转 APP 的具体流程和示例代码。需要注意的是,在进行应用内购买时,应该保证用户能够清晰地知道所购买的商品或服务的实际价格和内容,并且购买过程应该简单明了,避免误导或误操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值