为了能方便的使用JLINK把大量数据烧写到MCU外围spiflash中,我走了很多弯路,下面说说过程,
jlink只是一个硬件,要想通过jlink烧写外部存储器,你还需要软件、下载算法等。
1,一开始我在网上看到了,有人搞定了自定义MDK下的XXXXXX.FLM算法文件,可以实现MDK通过JLINK直接烧写stm32外挂的SPIFLASH,我没有仔细研究需求,以为就是这了,于是费了很大的劲、花了1天半的时间,搞定了, 但是突然发现不是我要东西,我的目的很明确,通过JFLASH直接烧写MCU的外挂FLASH,但是这个方法只能实现能过MDK烧写, 因为生产线上是不会使用MDK KEIL这种工具的, 只会使用jflash, 或者串口flashmagic烧写。
2. 于是我又寻找JFLASH下烧写外部FLASH的方法,果然又是一套截然不同的路径。其实原理是一样的,也是一个下载算法,这个算法是XXXX.elf格式,而这个算法是由Embedded Studio 生成的, 真不好
又在网上下载了个例程, 说是FLM的下载算法,也可以用在JFLASH软件中, 我试下,看看到底行不行。
理论上是可以的,但是我费了很长时间,没有实现,先暂停。。。。
编辑JLinkDevices.xml增加如下内容
<Device>
<ChipInfo Vendor="自定义名字" Name="STM32F10x M25P64 SPI Flash" WorkRAMAddr="0x20000000" WorkRAMSize="0x00020000" Core="JLINK_CORE_CORTEX_M3" />
<FlashBankInfo Name="EXTSPI" BaseAddr="0xC0000000" MaxSize="0x00800000" Loader="Devices/ST/STM32F10x_M25P64.FLM" LoaderType="FLASH_ALGO_TYPE_OPEN" />
</Device>
终于知道为什么我失败的原因了:发现个问题,程序中定义的flash参数结构体,中编程页大小这一项必须为对齐的, 但是我这个AT45DB321 TMD页大小是528, 只要这一项我设置528,就会失败, 连接就连不上,真郁闷!!设置成512就可以的。浪费了我3天时间了
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, // Driver Version, do not modify!
"stm32f4_at45db321_willow", // Device Name
EXTSPI, // Device Type
0x20000000, // Device Start Address
0x00420000, // Device Size in Bytes (4.125MB)
528, // Programming Page Size
0, // Reserved, must be 0
0xFF, // Initial Content of Erased Memory
1000, // Program Page Timeout 1000 mSec
1000, // Erase Sector Timeout 1000 mSec
// Specify Size and Address of Sectors
0x1080, 0x000000, // Sector Size 4224 bytes (block = 8*page)
SECTOR_END
};
struct FlashDevice const FlashDevice = {
FLASH_DRV_VERS, /* 驱动版本,勿修改,这个是MDK定的 */
"stm32f4_at45db321_willow", /* 算法名,添加算法到MDK安装目录会显示此名字 */
EXTSPI, /* 设备类型 */
0xC0000000, /* Flash起始地址 */
0x00420000, /* Flash大小,4MB Total Size of Device*/
512, //528, /* 编程页大小 Programming Page Size*/
0, //0, /* 保留,必须为0 Reserved for future Extension*/
0xFF, /* 擦除后的数值 */
1000, /* 页编程等待时间 */
6000, /* 扇区擦除等待时间 */
8 * 528, 0x000000, /* 扇区大小4K ,扇区地址 */
SECTOR_END
};