如何设计一个在线烧录方案?

如何设计一个在线烧录方案?

[导读]在线烧录,芯片先贴在PCB板上后,再对其进行烧录。由于在线烧写的灵活性(产品先生产出来后,可根据用户订单,临时烧录不同的固件)、易返工性(直接在板重新烧录),越来越多的工厂选择了在线烧录的方案。由于每款目标板

在线烧录,芯片先贴在PCB板上后,再对其进行烧录。由于在线烧写的灵活性(产品先生产出来后,可根据用户订单,临时烧录不同的固件)、易返工性(直接在板重新烧录),越来越多的工厂选择了在线烧录的方案。

由于每款目标板存在各种差异性,烧录环境参数不统一,导致烧录出现异常以及达不到需求效果。那么,如何设计一个更合理的在线烧录放案?以下罗列了几个注意事项。

1、选择合适的烧录通讯协议

一款芯片,可能同时支持几种烧录通信协议,基于每种协议的特点,根据需求,在目标板预留一个或多个烧录通讯协议接口。以LPC1517为例,可以支持SWD、UART烧录通讯协议。其中,SWD通信速率能达到6M以上,而UART模式只能支持115200 的波特率(相比之下,SWD速率大约是UART的52倍)。更快的通讯速度,将减少烧录时间,提高烧录生产效率,如果追求烧录速度,首选SWD。但当芯片加密后,芯片杜绝编程器通过SWD访问芯片,这时只能通过UART模式擦除解密。一般产品出产后,芯片都配置成加密模式,后续产品升级、维修需要重新烧录固件时,由于芯片已处于加密模式,故不能再用SWD模式烧录,只能采用UART模式。因此,应根据具体情况,预留对应的SWD或UART烧录接口。或者两种都预留,SWD模式接口用于量产烧录,UART用于维修、升级时单次烧录。


2、预留禁能看门狗的接口

为了避免芯片程序跑飞或进入死循环状态,目标板一般都会放置外部看门狗,有效保证整个系统稳定运行。但是,如果芯片正处于烧录状态,由于没有喂狗,看门狗将计数溢出并复位目标芯片,意外中断了当前的烧录工作。为了避免以上异常情况,目标板应预留禁能看门狗的接口。当芯片烧录的时候,通过一个跳线,禁能看门狗,杜绝烧录时芯片被看门狗复位。如图1所示,目标板预留了禁能看门狗接口。


图1 禁能看门狗接口

3、烧录接口是焊盘测试点还是接线座

图2为焊盘测试点和普通烧录接线座的对比。如果生产烧录量很大,为了提高烧录效率,可以配合夹具和自动机,进行自动化的烧录。夹具一般都是配合顶针一起使用的,故需要在目标板预留焊盘测试点,以便烧录信号线的顶针与目标板接触;而如果生产烧录量偏小,则可以人工手动拔插烧录接口。

 

图2 焊盘测试点和普通烧录接线座的对比

4、引出芯片复位管脚

有时候,出于节省PCB空间考虑,设计烧录接口时会省掉复位管脚,但这有可能导致烧录不稳定。烧录前,先复位芯片,可以给芯片烧录提供一个纯净的初始化环境,避免芯片已跑有代码时,影响后续的烧录。此外,烧录前先复位芯片,还可以避免上电瞬间烧录信号线电平的抖动,使得芯片误采集到握手信号,导致烧录通信握手失败。因此,为了保证烧录的稳定性,烧录接口需引出复位管脚。烧录器烧录芯片前,利用复位管脚先复位芯片,使芯片处于一个纯净的初始化状态,有效保证芯片烧录的稳定性和有效性。

 

图3 引出复位管脚

以上只是罗列了常见的几种情况,但由于在线烧写目标板的差异性,设计PCB板时应该根据具体的芯片,配合你选择的烧录器特性,设计一个合理的方案。

 

/**********************wdt fuction**********************************************************************/
#define  WDT_OPEN		1
#define IS_DEBUG	(0)//NOTE:1)在线debug程序,须先禁掉看门狗,否则超时复位重启;2)keil在线烧录,烧录期间未能及时喂狗则会复位重启,导致烧录失败
void wdt_init(void)
{
		uint8_t u8Lock;
	
		/************在线debug,禁掉看门狗***************/
		#if(IS_DEBUG)
		u8Lock = SYS_Unlock();
		WDT_Close();
		CLK_DisableModuleClock(WDT_MODULE);
		SYS_Lock(u8Lock);
		#endif
	
		
	
		#if(1 != IS_DEBUG)  //test wdt timeout reset function 
		u8Lock = SYS_Unlock();
		CLK_EnableXtalRC(CLK_PWRCTL_LXTEN_Msk);//使能无源晶振(无源晶振记得要使能啊,有源晶振则上电自动起振)
		CLK_EnableModuleClock(WDT_MODULE);
		//CLK->CLKSEL1 = (CLK->CLKSEL1 & ~(3<<0)) | (1<<0);//clk source 32k  ==
		CLK_SetModuleClock(WDT_MODULE, CLK_CLKSEL1_WDTSEL_LXT, MODULE_NoMsk);//32k  CLK_CLKSEL1_WDTSEL_HCLK_DIV2048
		SYS_Lock(u8Lock);
			
		WDT_RESET_COUNTER();
		WDT_CLEAR_RESET_FLAG();
	
		u8Lock = SYS_Unlock();
	/*
		WDT->CTL = (WDT->CTL & ~(7 << 8)) | (7 << 8);//8224 ms
    WDT->CTL |= 1 << 1;//enable rst
		WDT->CTL |= 1 << 7;//enable wdt
		*/
		WDT_Open(WDT_TIMEOUT_2POW18,TRUE);//8224 ms
		SYS_Lock(u8Lock);
		#endif
}

void wdt_clear(void)
{
		WDT_RESET_COUNTER();
		WDT_CLEAR_RESET_FLAG();
}

餐考:http://www.21ic.com/app/analog/201605/676150.htm?_t_t_t=0.20653475700134421

<think>嗯,用户想设计一个基于SWD协议的通用烧录器。首先,我需要理解SWD协议的基本原理和结构。SWD是Serial Wire Debug的缩写,主要用于ARM Cortex处理器的调试和编程。它比传统的JTAG接口更节省引脚,只需要两根线:SWDIO和SWCLK。SWDIO是双向数据线,负责传输命令和数据,而SWCLK是时钟信号线,同步数据传输。 接下来,硬件设计部分需要考虑SWD接口的物理连接。通常,烧录器需要通过SWD接口与目标设备连接,所以需要设计一个可靠的硬件电路,包括电平转换电路,因为目标设备和烧录器可能使用不同的电压。例如,如果目标设备是3.3V而烧录器是5V系统,就需要电平转换器来确保信号兼容性。此外,还需要考虑ESD保护,防止静电损坏设备。 然后是固件开发。烧录器的微控制器需要实现SWD协议的状态机。SWD通信包括初始化、发送命令、读取响应、数据传输等步骤。初始化过程可能需要发送特定的序列来切换从JTAG到SWD模式。接着,需要处理不同的SWD命令,如读取IDCODE、访问DP/AP寄存器等。此外,还需要处理错误检测和恢复机制,比如超时和校验失败的情况。 软件部分,上位机需要提供用户界面,允许用户选择固件文件、配置烧录参数,并监控烧录过程。上位机与烧录器之间的通信可以使用USB、串口或以太网等接口。通信协议需要定义命令帧结构,例如起始标志、命令类型、数据长度、校验和等。例如,发送烧录命令时,上位机将固件数据分块传输到烧录器,烧录器再通过SWD接口写入目标设备的Flash存储器。 在实现过程中,可能会遇到时序问题。SWD协议对时钟频率有要求,特别是在高速传输时,需要确保信号稳定。此外,不同厂商的MCU可能有不同的SWD实现细节,例如特定的寄存器地址或操作序列,这需要烧录器具备一定的灵活性,能够通过配置文件或固件更新来支持多种设备。 测试和验证也是关键步骤。需要确保烧录器能够正确识别目标设备,可靠地擦除Flash、编程和校验数据。可以使用不同型号的ARM Cortex芯片进行测试,验证兼容性和稳定性。同时,要处理异常情况,如连接断开、数据损坏等,确保烧录器的鲁棒性。 最后,参考现有的开源项目或商业方案可能会有帮助。例如,HwLib.Automation框架展示了如何与多台设备高效通信,可以借鉴其设计思路。此外,ST-Link和J-Link等烧录器的实现文档和社区讨论也能提供宝贵的经验。</think>### 基于SWD协议的通用烧录设计与实现 #### 1. 硬件设计 **核心组件** - **主控MCU**: 选择支持USB或UART通信的ARM Cortex-M系列芯片(如STM32F4系列),需实现SWD协议解析与数据转发功能 - **SWD接口电路**: 包含SWDIO(数据线)和SWCLK(时钟线),需设计电平转换电路(例如3.3V<->5V) - **保护电路**: ESD保护二极管和滤波电容,确保信号稳定性 - **通信接口**: USB转串口芯片(如CH340)或以太网模块,用于与上位机交互 $$ V_{IH} \geq 0.7V_{DD}, V_{IL} \leq 0.3V_{DD} $$ [^2] #### 2. 固件开发 **SWD协议实现** 1. **初始化序列**: 发送至少50个SWCLK脉冲,随后发送切换序列`0xE79E`(JTAG转SWD模式) 2. **AP/DP访问**: 通过DPIDR读取设备ID,验证目标芯片合法性 3. **Flash编程**: - 发送`MEM-AP`命令访问Flash控制器 - 擦除操作需发送特定密钥序列 - 数据写入采用字对齐模式 ```c // SWD写操作示例 void SWD_Write(uint8_t addr, uint32_t data) { SWDIO_SetOutput(); SendPacket(SWD_START | SWD_WRITE | (addr & 0x0F)); SendData(data); WaitACK(); } ``` #### 3. 上位机软件 **功能模块** - **协议栈**: 基于HwLib.Automation框架实现分层架构(物理层/数据链路层/应用层) - **文件解析**: 支持HEX/BIN/ELF格式固件解析,自动提取有效代码段 - **通信协议**: 自定义帧结构(示例): ``` [STX][CMD][LEN][DATA][CRC][ETX] 0x55 0xA1 0x04 ... 0xXX 0xAA ``` **性能优化** - 采用DMA双缓冲技术提升数据传输速率 - 实现异步编程模型,支持多设备并行烧录[^2] #### 4. 关键问题解决 - **时序同步**: 使用硬件定时器生成精确的SWCLK信号(典型频率1-4MHz) - **错误恢复**: 设计三级重试机制(包级/操作级/会话级) - **兼容性**: 通过XML配置文件定义不同MCU的SWD寄存器映射表 #### 5. 测试验证 - **电气测试**: 使用示波器验证信号完整性(上升时间<10ns) - **协议测试**: 通过SWD协议分析仪捕获数据流 - **压力测试**: 连续烧录100次验证稳定性
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值