DAPLink工程中drag-and-drop programming (MSC)功能配置
- 📍相关篇《DAPLink源码固件编译与制作》
- 🌿DAPLink开源项目地址:
https://github.com/ARMmbed/DAPLink - DAPLink接口固件为开发者提供:
拖放编程(MSC)
虚拟串行端口(CDC)
基于CMSIS-DAP的调试(HID)
- USB磁盘拖放编程
DAPLink调试探针在主机上也会显示为一个USB磁盘。二进制(.bin)和十六进制(.hex)格式的程序文件可以复制到该USB磁盘上,然后这些文件会被编程到目标系统的存储器中。这是通过将闪存编程算法嵌入到接口固件中来实现的。因此,为了使拖放编程能够正常工作,所使用的DAPLink固件版本必须是专门为目标MCU型号构建的,这一点非常重要。
- daplink工程除了后缀
_bl:Bootloader程序外,_MCUMODE_if代表所支持拖放编程(MSC)的MCU型号。

📗创建新的拖放编程(MSC)支持型号的MCU工程
- 🌾参考
https://zhuanlan.zhihu.com/p/483819564
- 修改根目录下
projects.yaml文件内容,补充如下
c
stm32f103xb_stm32f401rc_if:
- *module_if
- *module_hic_stm32f103xb
- records/board/stm32f401rc.yaml
- ⚡这里注意,格式一定要对齐,否则执行生成工程脚本时,会报错:
- 在daplink项目的
records/board文件夹下,增加新MCU型号信息配置文件
c
stm32f401rc.yaml

- 在daplink项目的
source/board文件夹下,新建文件stm32f401rc.c,文件内容为
c
#include "target_family.h"
#include "target_board.h"
const board_info_t g_board_info = {
.info_version = kBoardInfoVersion,
.board_id = "0720",
.family_id = kStub_HWReset_FamilyID,
.target_cfg = &target_device,
.board_vendor = "STMicroelectronics",
.board_name = "STM32F401RC",
};

-
在
\source\family\st目录下,创建对应MCU型号的文件夹:

-
从daplink项目的根目录下
tools文件夹内,拷贝generate_flash_algo.py文件拷贝到上面新建的MCU型号文件夹内

-
再从Keil_v5\ARM\Flash内找到对应的下载算法文件也拷贝到上面新建的MCU型号文件夹内

- 5 - 6步骤结果:

- 在新建的MCU型号文件夹内,打开命令提示符窗口或者bash终端都行,执行下面的命令(前提是已经安装了python):
c
python generate_flash_algo.py STM32F4xx_256.FLM

- 将所生成的文件
target_blob.c修改名为flash_blob.c,并修改里面的内容。
- 🌟✨🌟 脚本生成的flash 扇区大小和划分是有问题的,会导致使用MSC功能时出错,具体的修改,查看对应的MCU型号的参考手册
Embedded flash memory interface章节。
参考手册,对于相关型号MCU的扇区描述截图参考:
MCU型号STM32F401RC,flash是256KB为例,前4个扇区是16KB,第五个扇区是64KB,第六个扇区是128KB,总共加起来就是256KB,具体的填写如下:
c
static const sector_info_t sectors_info[] = {
{0x08000000, 0x00004000}, //16KB
{0x08004000, 0x00004000},//16KB
{0x08008000, 0x00004000},//16KB
{0x0800c000, 0x00004000},//16KB
{0x08010000, 0x00010000}, //64KB
{0x08020000, 0x00020000}, //128KB
};
- 手动添加
target.c文件,可以参考其它型号的,并补充flash和ram的容量结尾地址内容:
c
#include "target_config.h"
// The file flash_blob.c must only be included in target.c
#include "flash_blob.c"
// target information
target_cfg_t target_device = {
.version = kTargetConfigVersion,
.sectors_info = sectors_info,
.sector_info_length = (sizeof(sectors_info))/(sizeof(sector_info_t)),
.flash_regions[0].start = 0x08000000,
.flash_regions[0].end = 0x08040000,
.flash_regions[0].flags = kRegionIsDefault,
.flash_regions[0].flash_algo = (program_target_t *) &flash,
.ram_regions[0].start = 0x20000000,
.ram_regions[0].end = 0x20010000,
.target_vendor = "STMicroelectronics",
.target_part_number = "STM32F401RCTx",
};
不知道大小,可以参考Keil工程的Option for Target...标签页:

- 以上步骤工作完成之后,即可在daplink根目录下,生成对应的Keil工程了。
在daplink项目的根目录,命令提示符窗口或bash窗口内执行以下命令,即可生成对应的工程:
c
progen generate -f projects.yaml -p stm32f103xb_stm32f401rc_if -t uvision

📙MSC编程方式(drag-and-drop programming)实现说明
✨ 将要烧录的.hex或者.bin文件,通过拖拽或者虚拟U盘烧录目标芯片,这个功能是自带的,使用时需要注意,默认是需要使用DAP-link的RESET复位引脚(默认PB0)连接到的目标MCU的NRST复位引脚上,如果没有连接,只能在拖拽或拷入虚拟盘符后,手动去复位目标芯片,才能完成下载烧录工作,另外一种方法是,在daplink源码工程中的复位函数中,使用
ID_DAP_SWJ_Pins命令,复位目标MCU,从而实现SWD,在4线模式下,实现真正的MSC编程。
- 📌函数位置:
\source\hic_hal\stm32\stm32f103xb\DAP_config.h中:
c
extern uint8_t swd_write_word(uint32_t addr, uint32_t val);//引入外部函数
__STATIC_FORCEINLINE void PIN_nRESET_OUT(uint32_t bit)
{
if (bit & 1)
nRESET_PIN_PORT->BSRR = nRESET_PIN;
else {
swd_write_word((uint32_t)&SCB->AIRCR, ((0x5FA << SCB_AIRCR_VECTKEY_Pos) | SCB_AIRCR_SYSRESETREQ_Msk));//补充这一句
nRESET_PIN_PORT->BRR = nRESET_PIN;
}
}


