STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法

这篇具有很好参考价值的文章主要介绍了STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

常见的SPI Flash:W25Qxx系列,本文以W25Q16为实例制作Keil下载算法。

如下图,红框内的东西就是下载算法。

keil flash算法配置,STM32学习,stm32,单片机,算法

只要导入下载算法后,就可以在烧录MCU的同时对W25Q16页进行烧录。此操作可方便LCD运用场景,字库、图片存放在外部Flash的烧录。

实际操作:

1、硬件:STM32G030C8T6、W25Q16(2MB FLASH)

2、算法对应的硬件连接图:

keil flash算法配置,STM32学习,stm32,单片机,算法

3、工程搭建:

①进入keil安装目录下的 \ARM\Pack\ARM\CMSIS\version\Device 路径(vesion为实际安装的keil pack的版本号),将 _Template_Flash 文件夹拷贝出来,以此为工程模板。

②用keil打开工程,点击“魔术棒”,Target页面下,编译器版本要选择V5.xx的。

keil flash算法配置,STM32学习,stm32,单片机,算法

Device页面,选择对应的单片机型号。

keil flash算法配置,STM32学习,stm32,单片机,算法

Ouput页面,设置生成文件的名称。

keil flash算法配置,STM32学习,stm32,单片机,算法

User页面,设置如下:

cmd.exe /C copy "Flash_Algx\%L" ".\@L.FLM"

cmd.exe /C copy ".\@L.FLM" "C:\Keil_v5\ARM\Flash\@L.FLM"

(C:\Keil_v5 为Keil的安装路径,ARM\Flash为路径下的下载算法存放地址)

keil flash算法配置,STM32学习,stm32,单片机,算法

C/C++页面,设置如下。

keil flash算法配置,STM32学习,stm32,单片机,算法

ASM页面,设置如下。

keil flash算法配置,STM32学习,stm32,单片机,算法

Linker页面,设置如下。

keil flash算法配置,STM32学习,stm32,单片机,算法

点击中间那个红框中的“Edit”,

打开后的文件内容为(如果与下面的代码不符,则手动修改):

; Linker Control File (scatter-loading)

;

PRG 0 PI ; Programming Functions

{

PrgCode +0 ; Code

{

* (+RO)

}

PrgData +0 ; Data

{

* (+RW,+ZI)

}

}

DSCR +0 ; Device Description

{

DevDscr +0

{

FlashDev.o

}

}

③以上设置完成后,开始生成工程。

点击下图红框内的按钮。

keil flash算法配置,STM32学习,stm32,单片机,算法

打开后,从上到下点击对应的框。

keil flash算法配置,STM32学习,stm32,单片机,算法

点击“STM32Cube HAL”后面按钮后,

keil flash算法配置,STM32学习,stm32,单片机,算法

跳出STM32Cube页面,开始配置MCU

keil flash算法配置,STM32学习,stm32,单片机,算法

配置完IO口和时钟频率之后(注意时钟频率会影响SPI的通讯速率),配置结束之后,点击项目设置,只需要设置如下选项即可,

keil flash算法配置,STM32学习,stm32,单片机,算法

设置完成后直接点击生成代码。

生成代码之后,用keil打开项目工程后会多出以下两个代码集,

keil flash算法配置,STM32学习,stm32,单片机,算法

此时,需要左击“Device”,如下图,点击红框中设置,

keil flash算法配置,STM32学习,stm32,单片机,算法

进入设置后,如下图,从上到下依次点击红框中的信息,

keil flash算法配置,STM32学习,stm32,单片机,算法

当点击确定之后,会发现STM32Cube生成的system_stm32g0xx.c不能用了。

此时需要自己从别的项目工程中拷贝一份system_stm32g0xx.c放到本工程中,同时在工程文件中添加,此时顺便将W25Qxx.c(FLASH驱动代码)和system_stm32g0xx.c一起添加进来,如下图。

keil flash算法配置,STM32学习,stm32,单片机,算法

④开始修改代码

点击main.c

keil flash算法配置,STM32学习,stm32,单片机,算法

先在main.c中重定义如下代码。

keil flash算法配置,STM32学习,stm32,单片机,算法

之后将“int main(void)”改为“int Init_main(void)”,同时对原本“int main(void)”中的函数做出修改,如下图

keil flash算法配置,STM32学习,stm32,单片机,算法

之后开始修改FlashDev.c,如下图所示文件,

keil flash算法配置,STM32学习,stm32,单片机,算法

做出如下修改,

keil flash算法配置,STM32学习,stm32,单片机,算法

注意超时时间要合理,全片擦除可能在10-20s左右。

之后开始修改FlashPrg.c,代码如下,

由于在FlashDev.c定义了地址为0x90000000所以先设置一个基础地址宏:

#define SPI_FLASH_MEM_ADDR 0x90000000

初始化函数:

extern int Init_main(void);

int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

/* Add your Code */

Init_main();

if(BSP_W25qxx_ReadID() != W25Q16)

{

//return (1);

}

return (0); // Finished without Errors

}

注意:在FlashPrg.c中的函数都有返回值,同时返回0表示正常,返回1表示异常。

清除初始化函数不修改:

int UnInit (unsigned long fnc) {

/* Add your Code */

return (0); // Finished without Errors

}

全片擦除函数:

int EraseChip (void) {

/* Add your Code */

for(uint16_t i = 0; i < 512; i++)

{

BSP_W25qxx_Erase_Sector(i * 0x1000);

}

return (0); // Finished without Errors

}

扇区擦除函数:

int EraseSector (unsigned long adr) {

/* Add your Code */

adr -= SPI_FLASH_MEM_ADDR;

BSP_W25qxx_Erase_Sector(adr);

return (0); // Finished without Errors

}

写入函数:

int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

/* Add your Code */

adr -= SPI_FLASH_MEM_ADDR;

B_W25qxx_Write(buf,adr,sz);

return (0); // Finished without Errors

}

添加校验函数:

unsigned long Verify(unsigned long adr, unsigned long sz, unsigned char *buf)

{

adr -= SPI_FLASH_MEM_ADDR;

adr += SPI_FLASH_MEM_ADDR;

return (adr + sz); /* 校验成功 */

}

注意:当前检验函数未作任何操作,只是为了下载时如果选择“Verify”了,依旧可以正常下载。

添加块擦除检查函数:

int BlankCheck(unsigned long adr, unsigned long sz, unsigned char pat)

{

// adr -= SPI_FLASH_MEM_ADDR;

/* 强制擦除 */

return 1;

}

注意:当前块擦除检查函数依旧未做任何操作。

⑤完成以上操作则修改完成,点击编译,生成FLM文件。

4、FLM下载算法验证

打开一份测试代码工程。

①修改测试工程设置,以下方式二选一。

方式一:打开“魔术棒”,Linker页面下,做出如下修改,

keil flash算法配置,STM32学习,stm32,单片机,算法

然后点击“Edit”,对.sct文件进行修改,在末尾添加如下代码:

LR_EROM1 0x90000000 0x00200000 { ; load region size_region

ER_EROM1 0x90000000 0x00200000 { ; load address = execution address

*(USE_EXT_FLASH_2MB_BUF_SPACE)

}

}

方式二:Traget页面,添加对应外部FLASH的虚拟地址和大小,如下图,

keil flash算法配置,STM32学习,stm32,单片机,算法

以上两种方式设置任意一种之后,进入下载设置界面,添加我们的FLM算法,然后将RAM空间暂时改大,否则算法下不进去(算法是下载到MCU中运行的),如下图,

keil flash算法配置,STM32学习,stm32,单片机,算法

②在测试工程中添加代码

实现将静态全局变量的值存储在外部FLASH中。

为了适配编译器,不然参数被编译器优化掉,定义宏:

#ifdef __CC_ARM /* ARM Compiler */

#define SECTION(x) __attribute__((section(x)))

#define USED __attribute__((used))

#define UNUSEDX __attribute__((unused))

#elif defined (__IAR_SYSTEMS_ICC__) /* for IAR Compiler */

#define SECTION(x) @ x

#define USED __root

#elif defined (__GNUC__) /* GNU GCC Compiler */

#define SECTION(x) __attribute__((section(x)))

#define USED __attribute__((used))

#define UNUSED __attribute__((unused))

#else

#error not supported tool chain

#endif /* __CC_ARM */

之后定义静态全局变量:

USED static const uint16_t Flash_Value SECTION("USE_EXT_FLASH_2MB_BUF_SPACE") = 0x1010;

5、连接实际板子点击下载即可。

附加说明:

1、可尝试屏蔽一些无用的库代码,例如内部flash的HAL代码,这样可以减小代码量,因为算法是临时加载到RAM中运行。

2、如遇到如下问题:

keil flash算法配置,STM32学习,stm32,单片机,算法

说明FLM算法存在问题,可尝试把自写的驱动代码屏蔽掉测试看看,屏蔽掉之后依旧不正常则可能是时钟设置或系统初始不对;屏蔽之后正常,则可能是IO初始化不对。文章来源地址https://www.toymoban.com/news/detail-833263.html

到了这里,关于STM32 HAL库形式制作SPI Flash(W25Q16)的 Keil下载算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32单片机初学8-SPI flash(W25Q128)数据读写

            当使用单片机进行项目开发,涉及大量数据需要储存时(例如使用了屏幕作为显示设备,常常需要存储图片、动画等数据),单靠单片机内部的Flash往往是不够用的。         如STM32F103系列,内部Flash最多只能达到512KByte,假设要储存240*240分辨率、64K彩色图片,

    2024年02月03日
    浏览(46)
  • STM32-SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)

    ​  SPI(Serial Peripheral Interface)是由Motorola公司开发的一种通用数据总线四根通信线:SCK(Serial Clock)、MOSI(Master Output Slave Input)、MISO(Master Input Slave Output)、SS(Slave Select)。 ​SPI通信具有以下特点: 同步,全双工; 支持总线挂载多设备(SPI仅支持一主多从); 在不

    2024年02月08日
    浏览(49)
  • stm32(SPI读写W25Q18)

    SPI是串行外设接口(Serial Peripheral Interface)的缩写,是一种 高速的,全双工,同步 的通信总 线,并且在芯片的管脚上只占用四根线,节约了芯片的管脚,同时为PCB的布局上节省空间,提 供方便,正是出于这种简单易用的特性,越来越多的芯片集成了这种通信协议,比如 A

    2024年02月16日
    浏览(58)
  • STM32之SPI和W25Q128

    目录 SPI 介绍 SPI 物理架构 SPI 工作原理 SPI 工作模式  W25Q128 介绍 W25Q128 存储架构 W25Q128 常用指令 W25Q128 状态寄存器 W25Q128 常见操作流程 实验:使用 SPI 通讯读写 W25Q128 模块  硬件接线 cubeMX配置 w25q128_write_nocheck流程图  代码: SPI 是什么? SPI 是串行外设接口( Serial Periphera

    2024年01月16日
    浏览(39)
  • STM32--SPI通信与W25Q64(2)

    STM32–SPI通信与W25Q64(1) STM32内部集成了硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU的负担 。 3线全双工同步传输 8或16位传输帧格式选择 主或从操作 支持多主模式 8个主模式波特率预分频系数(最大为fPCLK/2) 主模式和从模式下均可以由软件或硬

    2024年02月10日
    浏览(48)
  • STM32--SPI通信与W25Q64(1)

    USART串口链接入口 I2C通信链接入口 SPI(Serial Peripheral Interface)是一种高速的、全双工、同步的串行通信协议 。通常用于连接主控芯片和外围设备,比如传感器、存储器、显示屏等。SPI使用简单,只需要几根线就可以实现进行通信。 主要线路: SCLK(时钟信号) :由主设备产

    2024年02月11日
    浏览(70)
  • 2023版 STM32实战11 SPI总线读写W25Q

    英文全称:Serial peripheral Interface 串行外设接口 -1- 串行(逐bit传输) -2- 同步(共用时钟线) -3- 全双工(收发可同时进行) -4- 通信只能由主机发起(一主,多从机) -1- CS片选一般配置为软件控制 -2- 片选低电平有效,从器件CS引脚可直接连接GND -3- 从机不能主动给主机发数据 -4- 主机想要

    2024年02月08日
    浏览(39)
  • 【STM32】软件SPI读写W25Q64芯片

    目录 W25Q64模块 W25Q64芯片简介 硬件电路 W25Q64框图 Flash操作注意事项 状态寄存器 ​编辑 指令集 INSTRUCTIONS​编辑 ​编辑 SPI读写W25Q64代码 硬件接线图 MySPI.c MySPI.h W25Q64 W25Q64.c W25Q64.h W25Q64_Ins.h main.c 测试 SPI通信(W25Q64芯片简介,使用SPI读写W25Q64存储器芯片)  SPI通信文章:【

    2024年02月19日
    浏览(48)
  • stm32使用外部flash w25Q128实现读写操作

    数据保存是所有项目的基本功能,但是对于STM32C8T6的原flash进行操作,一方面大小有可能不够,另一方面单片机的运行程序本来就放在这个里面,所以还是外接的好。这里选用w25Q128 FLASH存储器,参考实现简单读写。 作为一个初学者,技能都是东拼西凑的,基础可能不扎实,如

    2023年04月08日
    浏览(51)
  • 【STM32】STM32学习笔记-硬件SPI读写W25Q64(40)

    在大容量产品和互联型产品上,SPI接口可以配置为支持SPI协议或者支持I2S音频协议。SPI接口默认工作在SPI方式,可以通过软件把功能从SPI模式切换到I2S模式。 在小容量和中容量产品上,不支持I2S音频协议。 串行外设接口(SPI)允许芯片与外部设备以半/全双工、同步、串行方式

    2024年02月19日
    浏览(69)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包