赞
踩
应公司需求,自制一个简易的脱机下载器,下载器配合上位机将需要烧录的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下载到下载器展示
下载器烧录程序到目标MCU
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。