当前位置:   article > 正文

自制简易STM32脱机下载器_diy单片机swd下载器

diy单片机swd下载器

前言

应公司需求,自制一个简易的脱机下载器,下载器配合上位机将需要烧录的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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35

主函数实现

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);
			}
		}
	}	
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63

效果展示

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

下载器烧录程序到目标MCU

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/905358
推荐阅读
相关标签
  

闽ICP备14008679号