zoukankan      html  css  js  c++  java
  • LPC43xx系列使用IAP的注意事项

    LPC43xx系列使用IAP的注意事项

    Tags: LPC43xx IAP 单片机


    LPC43xx IAP函数的调用

    一般MCU的IAP是,厂商固化一段代码在芯片的某个区域,然后告诉你这个代码的入口地址。
    我们一般可以这么做:

    typedef void (*IAP_ENTRY_T)(参数列表)
    #define IAP_ADDR    (0xdeadbeef)    // 假设的地址
    IAP_ENTRY_T const iap_entry = (IAP_ENTRY_T)IAP_ADDR;
    

    这样我们便可以通过iap_entry来调用芯片里的固化代码了。

    然而,LPC43xx系列内部的布局却不是这样。

    LPC43xx ROM API结构

    上面是LPC43xx内部固化代码的结构,可以看出:NXP把固化的函数的入口地址放到了一个数组里,然后告诉我们数组的起始地址,IAP函数排在第0位。
    那么我们可以这样调用IAP函数:

    /* 定义IAP入口函数的类型别名 */
    typedef void (*IAP_ENTRY_T)(unsigned int[5], unsigned int[4]);
    
    // ROM Driver Table的起始地址 
    #define LPC_ROM_API_BASE_LOC 		(0x10400100)
    
    // 因为Cortex-M4是32位的,所以用uint32_t类型把IAP入口函数的地址提取出来
    #define IAP_ENTRY_LOCATION 			(*((uint32_t *)LPC_ROM_API_BASE_LOC))
    
    static inline void iap_entry(unsigned int cmd_param[5], unsigned int status_result[4])
    {   // 强制转换为函数指针,然后调用
    	((IAP_ENTRY_T)IAP_ENTRY_LOCATION)(cmd_param, status_result);
    }
    

    内部FLASH操作是的注意事项

    1. 关全局中断
    2. 一定要先调用 Init 命令,再调用其他命令
    3. 擦除或写FLASH区块前,要先调用Prepare sectors for write operation命令

    LPC43xx命令总览

  • 相关阅读:
    python BUGGGGGGGGGG
    Golang channel底层原理及 select 和range 操作channel用法
    Go reflect包用法和理解
    Golang 之sync包应用
    Golang 之 sync.Pool揭秘
    深入理解字节码文件
    java中的回调,监听器,观察者
    范式
    BIO,NIO,AIO总结(二)
    anaconda命令行运行过程中出现的错误
  • 原文地址:https://www.cnblogs.com/electron/p/5444605.html
Copyright © 2011-2022 走看看