自制简易STM32脱机下载器

前言

应公司需求,自制一个简易的脱机下载器,下载器配合上位机将需要烧录的hex文件下载到下载器的flash里面保存,即可通过下载器脱机给STM32下载程序,支持STM32大部分型号。
下载器是通过SWD协议给目标STM32下载,操作傻瓜。
下载器有两个存储区,可以保存两个程序,可以分别对两种MCU下载程序。

下载器外观

脱机下载器
配上淘宝的通用外壳,感觉还不错

脱机下载器

硬件实现

原理图很简单,器件需要w25q64,CH340,以及STM32F103C8T6芯片。
在这里插入图片描述

软件设计

下载器与上位机连接通过串口方式,首先写好串口程序,串口程序可以移植正点原子的程序,这里不多说明。其次需要的移植CMSIS-DAP文件。这个我参照其他博主移植,移植后的列表如下。
移植
SWD下载过程

	if( !swd_init_debug()) return 1;	
	if (target_opt_init() != ERROR_SUCCESS) return 2;	
	if (target_opt_erase_chip() != ERROR_SUCCESS) return 3;	
	target_opt_uninit();
	if (!swd_init_debug())	return 4;
	if (target_flash_init(0x08000000) != ERROR_SUCCESS)		return 5;
	if (target_flash_erase_chip() != ERROR_SUCCESS) return 6;	
	while(1)	{
		if(ss>1024) {
			W25QXX_Read(hexbuf,codenum*CODE2ROM+5+times*1024,1024); 
			if (target_flash_program_page(0x08000000+times*1024, hexbuf, 1024) != ERROR_SUCCESS) {
				LED = 1;	
				return 7;
			}
			times++;
			ss = ss-1024;	
		}
		else if(ss>0&&ss<=1024){
			W25QXX_Read(hexbuf,codenum*CODE2ROM+5+times*1024,ss); 
			if (target_flash_program_page(0x08000000+times*1024, hexbuf, ss) != ERROR_SUCCESS) {
				LED = 1;	
				return 8;
			}
			ss=0;
		}
		else {
			break;
		}
		LED = !LED;		
	}	
	if(!swd_init_debug()) return 8;
	swd_set_target_reset(0);//复位运行
	delay_ms(100);
	target_flash_uninit();	
	LED = 0;

主函数实现

int main(void)
{	
  delay_init();
	gpio_Init();
	YH_USART1_Init(115200);
	W25QXX_Init();
	LED = 0;
	delay_ms(100);
	LED = 1;
	while(1)
	{
		len = YH_USART1_GetData(buf);
		if(len>0) {
			buf[len] = 0;
			if(strcmp((char*)buf,"YHSWDDOWN") == 0) {
				YH_USART1_SendArray(buf,len);
			}
			else if(strcmp((char*)(&buf[3]),"coderam,1") == 0) {
				binlen=0;
				romnum=0;
				W25Q64_BUFF_LS_P=0;
				YH_USART1_SendString("recok");	
				buf[3] = 0;
				chip_num = (uint8_t)atoi((char*)buf);
				W25QXX_Write(&chip_num,romnum*CODE2ROM+4,1);
			}
			else if(strcmp((char*)(&buf[3]),"coderam,2") == 0) {
				binlen=0;
				romnum=1;
				W25Q64_BUFF_LS_P=0;
				YH_USART1_SendString("recok");	
				buf[3] = 0;
				chip_num = (uint8_t)atoi((char*)buf);
				W25QXX_Write(&chip_num,romnum*CODE2ROM+4,1);
			}
			else if(len == buf[0]+1) {
				if(buf[0] == BAONUM) {		
					copyArray(&buf[1],buf[0]);
					YH_USART1_SendString("recok");
				}
				else {
					copyArray(&buf[1],buf[0]);
					W25QXX_Write(W25Q64_BUFF_LS,romnum*CODE2ROM+5+binlen,W25Q64_BUFF_LS_P);
					binlen+=W25Q64_BUFF_LS_P;
					W25QXX_Write((uint8_t*)&binlen,romnum*CODE2ROM,4);
					printf("downok:%d",binlen);
				}	
			}
		}
		if(KEY1 == 0) {
			delay_ms(20);
			if(KEY1 == 0) {
				FLASH_SWD(0);
			}
		}
		if(KEY2 == 0) {
			delay_ms(20);
			if(KEY2 == 0) {
				FLASH_SWD(1);
			}
		}
	}	
}

效果展示

程序hex下载到下载器展示
下载hex到下载器
下载器烧录程序到目标MCU

下载器烧录程序到目标MCU

stm32f103c8芯片制作的J-Link和ST-Link调试器,功能和成品模块几乎一样,同时外观也十分小巧,便于携带和使用。 搜集了相关制作资料,画PCB板,焊接制作,烧固件,分别做了J-Link和ST-Link,都可以用,效果。成本虽然低不了多少,但对于一个电子爱好者,谁不想自己亲手做个下载器和调试器。 烧录固件: 焊接好实物后,是不能用keil软件烧程序的,因为固件只是一个hex文件,必须要用到其他工具烧录,这里有两种 1.使用J-Link烧录工具下载,这个工具在电脑J-Link软件SEGGE里有,可以使用JTAG和SWD方式下载,具体步骤可以百度搜下。 2.采用串口下载,将C8单片机BOOT0置高,配置成串口烧录程序,工具为flymcu,具体步骤可以百度搜下。 关于烧录固件后,插上USB没反应(情况比较多),或者与开发工具通信不正常下载不了程序(笔者做ST-Link时遇到过): 前者笔者遇到过的情况为,USB与单片机间的限流电阻太大或者上拉电阻过大过小,使得USB与单片机通信不正常;还有一个就是晶振焊接时外壳与焊盘短接,晶振短路了,没反应;另外就是没有焊接晶振起振电容,晶振无法起振,单片机没工作。当然还有可能就是单片机烧坏了(这种情况比较少)。 对于后者通信不正常,一般是由于烧录进去的固件版本低了,这可以升级固件,当然这个时候就不是用下载工具像烧固件那样升级了,而是利用电脑USB口给升级,制作的J-Link keil会自动检测和升级,而制作的ST-Link则需要其他工具,如STM32 ST-LINK Utility,网上都有例程。 J-Link下载器 ST-Link调试器 电路城语:免费分享设计资料,不提供技术支持,请大家使用前验证资料的正确性! PCB工程、固件库、工具资料至附件下载
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值