最近项目用到STM32F0驱动TFT显示,因存在字库及图片资源,有限的内部Flash肯定无法胜任这些资源,所以外挂了个GD25Q32芯片作为资源,设计板子时候没考虑到外部flash初始化数据的需求,这样开发过程频繁的修改flash数据就面临一大难题。

仔细分析认为只有几个方法:

1、飞线直接用外部的USB烧录器在线烧录,看似解决问题,但日后升级就很尴尬,不可能每个板子都飞线一次吧?

2、通过调试串口自定义协议,实现间接升级flash数据,看似合情合理,可还要面临开发个PC端APP实现协议对接,时间伤不起。

3、网上一搜,果然也有不少人碰到同样问题,之前没注意STLINK也支持在线烧录,不正是我需要的吗?大喜,分析看到官方提供了一些驱动例程都不是基于我的硬件,只好自己改,话不多说直接开工。

随便找个接近的例程,复制文件夹再重新命名为自己项目文件夹,此例用25Q32_STM32F072-EVAL,见下图:

替换用到的STD库文件,参考工程为STMF1系列,此处需要替换为STM32F0系列,包括源文件及头文件等,见下图:

然后进入工程,修改工程MCU为STM32F0系列,输出文件改成自己容易识别的。

下一步就是调整硬件对应的GPIO及代码移植了,注意,F1和F0系列的时钟有点不同,下面是重要修改部分,增加了AF功能开启,GPIO时钟也对应修改:

/*** @brief  Initializes the peripherals used by the SPI FLASH driver.* @param  None* @retval None*/
void sFLASH_LowLevel_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*!< sFLASH_SPI_CS_GPIO, sFLASH_SPI_MOSI_GPIO, sFLASH_SPI_MISO_GPIO and sFLASH_SPI_SCK_GPIO Periph clock enable */RCC_AHBPeriphClockCmd(sFLASH_CS_GPIO_CLK | sFLASH_SPI_MOSI_GPIO_CLK | sFLASH_SPI_MISO_GPIO_CLK |sFLASH_SPI_SCK_GPIO_CLK, ENABLE);RCC_APB2PeriphResetCmd(RCC_APB2Periph_SYSCFG, ENABLE) ;/*!< sFLASH_SPI Periph clock enable */RCC_APB2PeriphClockCmd(sFLASH_SPI_CLK, ENABLE);GPIO_PinAFConfig(GPIOA,GPIO_PinSource5,GPIO_AF_0);  GPIO_PinAFConfig(GPIOA,GPIO_PinSource6,GPIO_AF_0);GPIO_PinAFConfig(GPIOA,GPIO_PinSource7,GPIO_AF_0); /*!< Configure sFLASH_SPI pins: SCK */GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_SCK_PIN;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(sFLASH_SPI_SCK_GPIO_PORT, &GPIO_InitStructure);/*!< Configure sFLASH_SPI pins: MOSI */GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MOSI_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;GPIO_Init(sFLASH_SPI_MOSI_GPIO_PORT, &GPIO_InitStructure);/*!< Configure sFLASH_SPI pins: MISO */GPIO_InitStructure.GPIO_Pin = sFLASH_SPI_MISO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;  GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;GPIO_Init(sFLASH_SPI_MISO_GPIO_PORT, &GPIO_InitStructure);/*!< Configure sFLASH_CS_PIN pin: sFLASH Card CS pin */GPIO_InitStructure.GPIO_Pin = sFLASH_CS_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_Init(sFLASH_CS_GPIO_PORT, &GPIO_InitStructure);GPIO_SetBits(sFLASH_CS_GPIO_PORT, sFLASH_CS_PIN);
}

然后是在Dev_inf.c定义flash规格,此处英文备注容易误导,试了好几次才弄清楚,我对注释做了更正直观一些,继续保留英文风格不伤大雅:

#if defined (__ICCARM__)
__root struct StorageInfo const StorageInfo  =  {
#else
struct StorageInfo const StorageInfo  =  {
#endif"GD25Q32_STM32F0XX-EVAL",        // Device Name + version numberSPI_FLASH,                         // Device Type0x00000000,                       // Device Start Address, STM32 external flash start at 0H4*1024*1024,                   // Device Size in Bytes (4MBytes/32Mbits)0x00000100,                        // Programming Page Size 256Bytes0xFF,                              // Initial Content of Erased Memory
// Specify Size and Address of Sectors (view example below)0x00000040, 0x00010000,          // Block count : 64 ,each block has 64k byte0x00000000, 0x00000000,         // end flag
}; 

对应的spi读写函数也有点修改:


/*** @brief  Sends a byte through the SPI interface and return the byte received*         from the SPI bus.* @param  byte: byte to send.* @retval The value of the received byte.*/
uint8_t sFLASH_SendByte(uint8_t byte)
{/*!< Loop while DR register in not emplty */while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_TXE) == RESET);/*!< Send byte through the SPI1 peripheral */SPI_SendData8(sFLASH_SPI, byte);/*!< Wait to receive a byte */while (SPI_I2S_GetFlagStatus(sFLASH_SPI, SPI_I2S_FLAG_RXNE) == RESET);/*!< Return the byte read from the SPI bus */return SPI_ReceiveData8(sFLASH_SPI);
}

编译后生成对应的stldr文件,因为项目文件夹与其他平行,所以生成的代码也在STLINK扫描的文件夹中,这样在STLINK中的External loader 菜单的add external loader 就会自动出现这个选择,见下图:

点击Validate就可以验证了。

注意,注意,注意!重要事情说3次,外挂Flash起始地址为0,注意烧录时候选择正确地址烧写bin文件,选择烧录后校验比较安全,毕竟是全部读回烧写的数据100%无误。

烧录后,可以直接在内存视图看到刚才烧录的数据了:

测试2M文件用了不到1分钟,通过更改spi分频还可以加快,我用了4分频。

至于具体字库及图片合并在另一文章讨论,因找不到合适软件,我做了个混合多个资源工具,自动生成资源地址定义,类似MFC资源索引。

本文仅针对外部flash烧录移植做了抛砖引玉的介绍,具体其他型号可以根据需求自行更改,有需求的也可以到我的下载中下载完整工程,代码在ST原装MCU和国产替代APM都测试通过,其他规格估计不行,因为STM32 STLINK 本身就不识别非ST芯片,目前只有Device ID兼容的高仿才可以用到这个便利功能。

STM32F0 使用ST-LINK实现对外部Flash芯片的烧录相关推荐

  1. 使用STM32 ST-LINK Utility 烧录程序,ST LINK烧录程序,解锁FLASH

    关键词:ST LINK烧录程序,STLINK烧录程序,ST-LINK烧录程序,STLINK烧录程序,ST LINK解锁Flash 1.读取STM32内部FLASH及芯片信息 使用ST-Link连接硬件 ...

  2. 使用STM32F103CBT6自制ST LINK V2-1多功能烧录器

    基于STM32的ST LINK V 2-1多功能烧录器制作 前 言 根据官方相关文档可知 ST LINK V2-1拥有以下四大功能: ST LINK V2-1制作教程和资料说明 主空部分原理图(参考) ...

  3. ST-LINK Utility + ST LINK+ STM32G474 erase chip fails

    今天遇到个诡异的问题,用ST-LINK Utility修改STM32G4XX的option byte 和下载程序时,突然发现MCU flash里的内容全为0.. 并且用full chip erase ...

  4. st-link v2怎么连接_使用ST Link下载和进行调试输出

    ST LINK引脚定义和对应MCU引脚如下图 ​ ​ 只有下载功能,接线方式如下: ST LINK引脚序号 ST LINK引脚名称 STM引脚 19 VDD ST Link的2号TVCC引脚 1 TV ...

  5. 《STM32从零开始学习历程》——SPI物理层及FLASH芯片介绍

    <STM32从零开始学习历程>@EnzoReventon SPI物理层及FLASH芯片介绍 相关链接: SPI协议层 SPI特性及架构 SPI固件库 参考资料: [野火EmbedFire] ...

  6. 为什么在用Vivado生成存储器配置文件时找不到相应型号的Flash芯片呢?

    为什么在用Vivado生成存储器配置文件时找不到相应型号的Flash芯片呢? 是Vivado版本文件?Vivado没装全?到底怎么回事? http://group.chinaaet.com/279/5 ...

  7. Micron Flash芯片识别心得

    数据手册地址 看这款FLASH芯片的时候,在Vivado中生成配置文件去编程设备,找不到对应的Flash型号,也不知道芯片是串行还是并行,内存大小以及其代号的意义.下面给出心得. 首先: 看完这个大概 ...

  8. Flash芯片(硬盘)与RAM芯片(内存)存储信息的区别!

    Flash芯片(硬盘)与RAM芯片(内存)存储信息的区别 1.Flash芯片(硬盘) 硬盘就是采用磁性物质记录信息的,磁盘上的磁性物质被磁化了就表示1,未被磁化就表示0,因为磁性在断电后不会丧失,所以 ...

  9. SPI Flash芯片W25Q32英文版数据手册解读(三)---------程序编写,电路应用

    一.序言 序言对这篇文章进行一个总体的说明: 1.这部分是根据手册写程序,因此采用手册截图+程序截图的形式,对图片不进行标号,而且对重点部分进行颜色标注. 2.考虑到很多读者(包括我),使用手机看文章 ...

最新文章

  1. 如果不当程序员,我可以生活的更好么?
  2. Mybatis学习笔记 4:Mybatis 连表查询(一)——一对多关系
  3. 如何在Mac上使用Memoji贴纸、屏幕效果、应用程序和Messages
  4. 如何设置操作系统处于最佳性能?此方法可以取消系统自带的界面渲染及其它多余的辅助功能.
  5. 努比亚更新系统服务器,努比亚N3升级更新V2.11官方最新完整rom包
  6. linux中,ls -l命令显示的total的含义。
  7. namecheap域名设置Cloudflare为第三方DNS
  8. Stata实验——计算个股“上海机场“的市场模型和CAPM模型的β值
  9. 【转】开发者需要了解的领域特定语言(DSL)
  10. Vue_实现五星好评效果
  11. 计算机科学引论2021英文,计算机科学引论= Computing Essentials : 英文
  12. cmd下使用命令切换目录
  13. MATLAB【函数和图像】
  14. java video明星分类_分类: java基础 - 程序员老猫
  15. 深入理解Linux内核之主调度器(下)
  16. HCIP之排障(三)ISIS故障排除
  17. AOMEI Backupper 6.5.0所有版本+引导旧版和UEFI
  18. excel数据分类汇总
  19. 运维(2)运维的主要工作内容
  20. ServerBoss:国产免费的Linux连接工具,服务器管理工具

热门文章

  1. 小米不是富士康的稻草
  2. 北京一建增报专业成绩如何进行管理
  3. 基于c++和 opengl 鞋子定制系统
  4. 销售人员如何打好专业基础、成为一名合格的销售?
  5. 三星平板T805S刷机
  6. 手机木马产业链分工明确,拿你的信息很简单
  7. unity学习笔记-特效篇
  8. 101 Three.js 场景世界坐标和平面二维坐标互转
  9. 千分位格式化 -小数点版也有
  10. 卡巴斯基或遭攻击,黑客称窃取了40000份文件资料