自制简易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

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值