CH552G使用IAP下载

常见下载中的方式ISP,IAP,ICP

参考,CH552G中文手册,参考1
ISP:In System Programing,在系统编程。是常见的,使用软件,先将某个引脚(例如boot)连接到合适的电平,然后使用烧录软件选择下载程序进行烧录
如下图

ICP(In Circuit Programing)目前主流的有Jtag(Joint Test Action Group)以及SWD(Serial Wire Debug)接口。而ICP编程就是以SWD接口进行的。实际上是使用特殊的烧录器把程序文件直接写入存储用户程序文件的地址、下面图中若
正确连接J-Link
,可以直接点击Load图标下载

IAP:In applicating Programing,在应用编程。APP启动后,接口外面接口(如UART)发送来的 BIN数据,写入 另一片 Flash地址,并在指定位置记录新的 APP执行起始地址。重启系统,BootLoader 读入APP起始地址,执行新的APP。这种情况,Flash足够大,能放得下两片APP地址空间。

bootload引导程序,运行程序和厂家bootload

bootload引导程序 可以看作是一种特殊的用户运行程序 ,使用ISP下载进flash后,这个bootload引导程序 会将程序最后运行到厂家编写的bootload程序

首先明白程序的存储位置

IAP使用的寄存器和程序代码


程序代码,

c 复制代码
sbit EnableIAP  = P1^4;        //  P1^6;  
sbit LED  = P1^5; 
#define BOOT_ADDR  0x3800
#pragma NOAREGS  //告诉Keil编译器在生成汇编代码时,不要生成AREGS(累加器寄存器)列表

typedef void( *pTaskFn)( void );//定义一个函数指针

pTaskFn tasksArr[1];  
 
void main( void ) 
{
	UINT16 i=0;
    while(1){
    SCK = ~SCK;     //  P17闪烁        CH552的TX1引脚   
    mDelaymS(50);
    if(EnableIAP == 0){                          //P14引脚检测到低电平跳转
      break;
    }
  }
	LED = ~LED;
  	EA = 0;                                             //关闭总中断,必加
	tasksArr[0] = BOOT_ADDR;
  mDelaymS( 100 ); 				
  (tasksArr[0])( );                   //跳至BOOT升级程序,使用ISP工具升级	
  while(1); 
}


代码功能和使用方法解释 :使用上面代码,编译后得到hex文件,和正常的下载流程一样,就当是正常的运行代码。然后在运行后打开沁恒官方下载软件(不需要提前拉高P3.6 ),然后把P1.4引脚拉低(代码中跳出循环的条件) ,发现USB设备识别到了,和拉高P3.6后上电的效果一样 。

对上面程序进行改进调用

若程序中只有bootload的引导程序,那么每次下载运行程序前先下载bootload的引导程序!!!!?那这个bootload的引导程序只是为了增加下载的步骤,这样就有些画蛇添足了。可以把这个引导程序放在所有运行程序中 ,作为运行程序的一部分,在某种条件下触发 进入bootload程序中,那么bootload的引导程序 就作为一个运行程序的一个下载功能 就行了。

就像参考视频中,使用串口发送一个字符或字符串,然后就可以下载程序了。下面是修改了的程序,

IAP程序

c 复制代码
#include "CH554.H"     
#include "delay.h"

sbit EnableIAP  = P1^4;        //  P1^6;  
sbit LED  = P1^5; 
#define BOOT_ADDR  0x3800   //bootload的最初地址
#define RUN_ADDR 0x0000

#pragma NOAREGS  //告诉Keil编译器在生成汇编代码时,不要生成AREGS

typedef void( *pTaskFn)( void );//定义一个函数指针
//pTaskFn tasksArr[2];  

void boot_load()
{
	pTaskFn boot_load_func;  //定义一个指向函数的指针变量
	
	//while(EnableIAP != 0);  //使能引脚若不拉低就一直暂停,不按照手册中的,使用这个发现也可以正常运行
	EA = 0; //关闭总中断
	
	boot_load_func = BOOT_ADDR;  //把厂家的bootload函数地址赋值
	mDelaymS(100);   //
	boot_load_func();     //执行厂家的bootload函数
	while(1);  //在使用中发现,bootload程序进入一段时间,没有烧录程序后会自动跳出
}

调用了IAP的主程序

程序和硬件操作正常流程

满足上面情况后,两种下载方式

第一种使用usb下载

这很方便,在串口发送字符A后 ,进入bootload不需要拉高P3.6的电平

第二种方式,使用串口发送

在串口发送字符A后 ,进入boot load程序,然后使用另一个串口下载程序。但两个串口千万不能一样 。而且接线位置也不同

相关推荐
1024奇点3 小时前
【仓颉语言入门 · 第二篇 第 22 课】
开发语言·ide·开源
Warren2Lynch4 小时前
C4 模型详解:利用 Visual Paradigm 可视化软件架构的综合指南
开发语言·uml
Knight_AL5 小时前
Java 文件下载时文件名中的 `#` 被转换成 `%23`?一次 URL 编码与解码问题排查
java·开发语言
FRing035 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
蹊黎5 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
by209996 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
砚底藏山河6 小时前
python量化自定义周期 K 线合成
java·开发语言·数据库·python·金融
IT召唤狮6 小时前
开源企业级零信任项目Pangolin,零信任能挡住PHP核弹漏洞吗?
开发语言·开源·php
知已难寻6 小时前
03 · OpenStack的计算管理 Nova
运维·服务器·开发语言·云原生·云计算·openstack·开源软件
Rover Ramble6 小时前
C++ 用互斥锁实现读写锁
开发语言·c++