CX32L003 IAP应用编程

一、什么是IAP编程?

  • IAP是 In Application Programming 的首字母缩写,IAP是用户自己的程序在运行过程中对User Flash的部分区域进行烧写,目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。
  • CX32L003F8具有64K Flash ROM,完全具备了IAP应用编程的内存大小,且透传模块会将UART进行引出,故可以选择添加此功能,实现固件更新。

二、软件及其硬件的准备

1. 内存结构介绍

  • CX32L003F8 用户可编程内存空间为 64K ,其内存结构如下所示:
  • 对于不包含 IAP 应用编程的工程,开发者通常会从0x0000 0000开始编写程序,即未包含 IAP boot 区域;
  • 对于包含 IAP 应用编程的工程,开发者则会预留一个 IAP boot 的区域,该部分代码主要用于引导程序进入User Program 或者修改 User Program。

2. UART 接口

  • IAP Boot 也需要用户根据自己的需求进行编写程序,用户需要在 IAP Boot 中指明数据接口(例如I2C、SPI 或 UART 等接口),此文将重点以 UART接口 进行编写。
  • UART 主要有以下几个重要的参数:
    波特率会直接影响数据的传输速度,建议使用较高的波特率,避免下载速度缓慢。
UART参数参考设定值
波特率115200 bps
数据位8 bit
校验位无校验
停止位1 bit
  • 但是 UART 无法跟 PC 直接建立连接,需要将 UART 虚拟化为 COM 口,才能和 PC 进行通讯。此处建议使用 CP2102CH341进行虚拟化为 COM 口,可打开 PC 的 设备管理器端口 进行查询。
    设备管理器

3. 为何使用 .bin 文件进行固件升级?

  • 通常下 CX32L003 会使用 .hex 文件进行代码烧录,但 IAP 应用编程中却不是使用 .hex 而选择了 .bin文件,其主要原因是:

.bin文件下载时传输效率高,其次因起始地址和长度在已知,所以只需要擦除实际代码大小的Flash,缩短了擦除 Flash的时间,同时也减小了 Flash损耗。
.hex文件传输的是ASCII码,ASCII码传输效率低,其次 .hex文件无法得知文件大小,需要进行全部擦除。

4. 为何要使用 Ymodem 协议?

  • Ymodem 是 Xmodem 的改进版协议,具有传输快速稳定的优点,能自动校验数据。它可以一次传输1024字节的信息块,同时还支持传输多个文件。
  • YModem-1K 用 1024 字节信息块传输取代标准的 128 字节传输,数据的发送回使用 CRC 校验,保证数据传输的正确性。它每传输一个信息块数据时,就会等待接收端回应 ACK 信号,接收到回应后,才会继续传输下一个信息块,保证数据已经全部接收。

5. APP的编译设置

  • 设置中断向量位置偏移:
    system_cx32l003.c文件中的宏定义 VECT_TAB_OFFSET 设置如下
    #define VECT_TAB_OFFSET 0x00002000U
    中断偏移)

6. IAR环境下的编译设定

  • IAR option 设置:Option -> Linker -> Edit -> .intvec start : 0x0000 2000
    IAR option

  • 设置编译输出格式:
    AR option 设置:Option -> Output Converter -> Output format : Raw binary -> project.bin
    输出格式修改

  • 设置完以上操作后,需要进行编译,并找到相应的 .bin 文件,位置和与之前的 .hex 相同。

7. Keil5 环境下的编译设定

  • Keil5 设置:option -> Target -> IROM1: 0x2000
    在这里插入图片描述
  • Keil5 设置:option -> Linker -> R/O base: 0x0000 2000
    R/O base
  • Keil5 设置:option -> Debug-> Flash Download -> start:0x0000 2000
    下载起始地址
  • Keil5设置编译输出格式:option -> User -> Run #2 修改为下列所示:
    fromelf --bin --output .\Project\project.bin .\Project\project.axf
    参考链接:MDK(KEIL5)如何生成.bin文件
    bin文件
  • 设置完以上操作后,需要进行编译,并找到相应的 .bin 文件,位置和与之前的 .hex 相同。

三、安装secure CRT

  • 之前有提及的 Ymodem 协议需要在secure CRT 下才能进行传输任务,故需要安装Secure CRT。
  • 下载地址:百度云下载链接
  • 提取码:40xe
  • 破解教程:secure CRT破解教程
  • 下载完成后目录:
    下载完成

四、IAP 下载

  • 打开 secure CRT,新建一个会话 session,会话接口选择 Serial(串口),点击下一步;
    在这里插入图片描述

  • 选中需要连接的串口设备,并补全 UART 参数,点击下一步,点击完成。
    在这里插入图片描述

  • 将 CX32L003 MCU 预先烧录 IAP 程序,并连接电源,串口会输出如图所示数据:

  • 开发板上电后打印如下,在5秒内按回车则可进入IAP下载模式,否则直接跳转到APP执行;
    在这里插入图片描述

  • 5秒内按回车后打印如下,当打印出字符“C”时可以下载APP文件;
    在这里插入图片描述

  • 选择工具栏中Transfer->Send Ymodem,如下图;
    在这里插入图片描述

  • 按下图选择要下载的 APP 的 .bin 格式的生成文件,注意一定要在红色“A”处看到你选择的文件,然后点击OK;
    在这里插入图片描述

  • 可以看到如下图的下载结果并跳转到APP并运行。
    在这里插入图片描述

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的N76E003 IAP编程代码示例,实现了通过串口接收数据并将其写入EEPROM的功能。需要根据实际应用情况进行修改和优化。 ```c #include "N76E003.h" #include "SFR_Macro.h" #include "Function_define.h" #include "IAP.h" #define UART_RX_BUF_SIZE 16 unsigned char uart_rx_buf[UART_RX_BUF_SIZE]; unsigned char uart_rx_buf_idx; void uart_init() { PCON |= 0x80; SCON = 0x50; TMOD = 0x20; TH1 = 0xFD; TL1 = 0xFD; TR1 = 1; ES = 1; EA = 1; } void uart_send_byte(unsigned char data) { SBUF = data; while(!TI); TI = 0; } void uart_send_str(unsigned char *str) { while(*str) { uart_send_byte(*str++); } } void uart_isr() interrupt 4 { unsigned char data; if(RI) { data = SBUF; RI = 0; if(uart_rx_buf_idx < UART_RX_BUF_SIZE) { uart_rx_buf[uart_rx_buf_idx++] = data; } } } void main() { unsigned int addr, len; uart_init(); while(1) { if(uart_rx_buf_idx >= 2 && uart_rx_buf[0] == 0x55 && uart_rx_buf[1] == 0xAA) { addr = uart_rx_buf[2] | (uart_rx_buf[3] << 8); len = uart_rx_buf[4] | (uart_rx_buf[5] << 8); if(addr < 0x1000 && len > 0 && len <= UART_RX_BUF_SIZE - 6) { IAP_Enable(); IAP_Erase(addr, len); IAP_Write(addr, uart_rx_buf + 6, len); IAP_Disable(); uart_send_str("Write OK!\r\n"); } else { uart_send_str("Invalid parameters!\r\n"); } uart_rx_buf_idx = 0; } } } ``` 该代码实现了通过串口接收0x55AA开头的数据包,并将其中的地址和数据长度信息提取出来,然后调用IAP函数库实现数据写入EEPROM中。其中,IAP_Enable和IAP_Disable函数用于打开和关闭IAP功能,IAP_Erase和IAP_Write函数用于擦除和写入数据。在实际应用中,需要根据具体情况进行修改和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值