基于 STM32F407 的 SPI Flash下载算法

STM32F407 SPI Flash下载算法开发指南 SPI Flash作为嵌入式系统中常用的外部存储设备,通过SPI接口与主控芯片通信,解决了内部Flash容量不足的问题。其工作原理是通过标准的SPI协议实现数据读写,支持页编程和扇区擦除操作。在Keil MDK开发环境中,通过制作专用的下载算法(FLM文件),可以像操作内部Flash一样直接烧写外部SPI Flash,这大大提升了开发效率,特别适用于需要大容量存储或OTA升级的应用场景。本文以STM32F407和W25Q128为例,详细介绍SPI Flash驱动实现和下载算法开发过程,包含SPI配置、Fla 阅读详情
AI摘要

本文介绍基于STM32F407的SPI Flash下载算法。先阐述下载算法工作原理,即下载工具读取FLM文件并传输到单片机SRAM运行,实现对Flash的操作。接着说明自制FLM文件的步骤,包括修改芯片、输出名称等设置,还修改配置文件。最后对算法进行验证,解决报错后编写读取程序,证明算法编写成功。


一、概述

本文将介绍如何使用 MDK 创建 STM32F407 的 SPI Flash 下载算法。

其中,SPI Flash 芯片使用的是 W25Q128,其相关操作源码可以参考 STM32 通过 SPI 驱动 W25Q128,本文所使用的驱动 SPI Flash 的 API 和里面是一样的。

单片机的 Flash 下载算法是一个 FLM 文件,FLM 通过编译链接得到,其内部包含一系列对 FLASH 的操作,包括初始化、擦除、写、读、校验等等操作。

想要制作下载算法,先要了解下载算法的工作原理。我们下载一个程序的流程大概是这样的:

  1. 下载工具(比如 jlink)读取 FLM 文件
  2. 然后 JLINK 提取 FLM 文件的信息,将其传输到单片机的内部 SRAM
  3. 下载算法开始在 SRAM 中运行,由于下载算法包含了一系列对 Flash 的操作,那么下载工具通过下发初始化、擦除、写入、校验等指令给单片机,单片机去执行这些指令操作,实现对单片机 Flash 的下载。

二、自制 FLM 文件

我参照的是 MDK 给的程序模板来完成 Flash 下载程序,然后在模板的基础上加上自己的代码。

模板路径如下:D:\Keil_v5\ARM\Packs\ARM\CMSIS\5.8.0\Device\_Template_Flash,不同的 MDK 版本可能路径不一样。

然后将项目拷贝到你的工作目录下,并取消该工程项目的只读属性。

打开项目如下:

然后开始我们的工作。

1、修改使用的芯片

首先选择你的芯片类型和型号。

2、修改输出算法的名称

这一步不是必须的,改个名称方便自己查看。

注意这个名称只是项目最终生成输出的 FLM 文件的名称,和下面位置识别出的算法名(后面会介绍这个名称如何修改)无关。


3、其它设置

注意:

这里的设置在模板文件中已经设置好了,这里主要是介绍一些,可以跳过


这两个设置是为了保证生成的算法文件中 RO 和 RW 段的独立性,即与地址无关。

如果程序的所有只读段都与位置无关,则该程序为只读位置无关(ROPI,Read-only position independence)。ROPI 段通常是位置无关代码(PIC,position-independent code),但可以是只读数据,也可以是 PIC 和只读数据的组合。选择“ ROPI”选项,可以避免用户不得不将代码加载到内存中的特定位置。这对于以下例程特别有用:

  • 加载以响应运行事件。
  • 在不同情况下使用其他例程的不同组合加载到内存中。
  • 在执行期间映射到不同的地址。

使用 Read-Write position independence 同理,表示的可读可写数据段。

通过下面的命令就可以将生成的 axf 可执行文件修改为 FLM。

我们这里的分散加载文件直接使用 MDK 模板工程里提供好的即可,无需任何修改。

4、修改配置文件 FlashDev.c

模板工程里面提供简单的配置说明:

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,             // Driver Version, do not modify!
   "New Device 256kB Flash",   // Device Name 
   ONCHIP,                     // Device Type
   0x00000000,                 // Device Start Address
   0x00040000,                 // Device Size in Bytes (256kB)
   1024,                       // Programming Page Size
   0,                          // Reserved, must be 0
   0xFF,                       // Initial Content of Erased Memory
   100,                        // Program Page Timeout 100 mSec
   3000,                       // Erase Sector Timeout 3000 mSec

// Specify Size and Address of Sectors
   0x002000, 0x000000,         // Sector Size  8kB (8 Sectors)
   0x010000, 0x010000,         // Sector Size 64kB (2 Sectors) 
   0x002000, 0x030000,         // Sector Size  8kB (8 Sectors)
   SECTOR_END
};

这里的注释已经说得很明白了,大家根据自己的芯片来进行修改即可,我使用的是 W25Q128,其存储大小为 16MB,一个扇区 4KB,所以修改如下:

W25Q128 一页是 256KB,但这里写的 4096 是为了提高下载速率和擦除速率,如果你把 4096 改为 8,可以很明显得感受到下载速度变慢了

struct FlashDevice const FlashDevice  =  {
   FLASH_DRV_VERS,                  /* 驱动算法,由 MDK 制定,勿动 */
   "Yux_STM32F407VE_SPI_W25Q128",   /* 算法名称 */ 
   EXTSPI,                          /* 设备类型,外扩展 SPI-Flash */
   SPI_FLASH_MEM_ADDR,              /* Flash 起始地址 */
   0x01000000,                      /* Flash 大小,16MB */
   4096,                            /* 编程页大小 */
   0,                               /* 保留,必须为 0 */
   0xFF,                            /* 擦除后的数值 */
   3000,                            /* 页编程等待时间 */
   3000,                            /* 扇区擦除等待时间 */
   0x001000, 0x000000,              /* 扇区大小,扇区地址 */
   SECTOR_END
};

其中,SPI_FLASH_MEM_ADDR 是我在 FlashOS.h 文件中定义的一个宏,表示 Flash 的起始地址:

#define SPI_FLASH_MEM_ADDR     0x00000000

这里的算法名称就体现在这里:

5、文件 FlashPrg.c 的实现

模板文件中提供了这几个函数,也是我们完成 Flash 下载算法最关键的地方:

// Flash 初始化
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

// Flash 复位
int UnInit (unsigned long fnc) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

// 擦除整个 Flah 芯片
int EraseChip (void) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

// 擦除指定扇区
int EraseSector (unsigned long adr) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

// 页编程
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {

  /* Add your Code */
  return (0);                                  // Finished without Errors
}

// 校验
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf)
{
  /* Add your Code */
  return (0);                                  // Finished without Errors
}

这里涉及到了对 W25Q128 的相关操作,详细内容参照: STM32 通过 SPI 驱动 W25Q128,这里主要是调用之前实现的函数。

我使用的是标准库,所以还要添加一些相关的文件进来:

实现如下:

  • 初始化函数
int Init (unsigned long adr, unsigned long clk, unsigned long fnc) {
	SystemInit();   // 初始化系统和时钟
	
	w25qxx_init();  // 初始化 w25q128 
	
  /* Add your Code */
  return (0);                                  // Finished without Errors
}

这里的 SystemInit 是 system_stm32f4xx.c 中的函数,在 STM32 时钟树(基于 STM32F407) 一文中讨论过。

  • 复位函数

Uninit 没有用到,所以不用改。

  • 擦除整个芯片
int EraseChip (void) {
  w25qxx_erase_chip();
  
  /* Add your Code */
  return (0);                                  // Finished without Errors
}
  • 擦除指定扇区
int EraseSector (unsigned long adr) {
  uint32_t sector = 0;
  adr -= SPI_FLASH_MEM_ADDR;
	
  sector = adr / 4096;
  w25qxx_erase_sector(sector);
	
  /* Add your Code */
  return (0);                                  // Finished without Errors
}
  • 页编程
int ProgramPage (unsigned long adr, unsigned long sz, unsigned char *buf) {
  adr -= SPI_FLASH_MEM_ADDR;
  w25qxx_write(buf, adr, sz);
	
  /* Add your Code */
  return (0);                                  // Finished without Errors
}
  • 校验
unsigned char aux_buf[4096];
unsigned long Verify (unsigned long adr, unsigned long sz, unsigned char *buf)
{
	unsigned long remain = sz;	//剩余的字节数
	unsigned long current_add = 0;//当前的地址
	unsigned int index = 0;//用于buf的索引
	current_add = adr - 0xC0000000;
	
	while(remain >= 4096)
	{
		w25qxx_read(aux_buf, current_add, 4096);
		for(int i = 0; i < 4096; i++)
		{
			if(aux_buf[i] != buf[index+i])
				return adr+index+i;
		}
		current_add += 4096;
		remain -= 4096;
		index += 4096;
	}
	
	w25qxx_read(aux_buf, current_add, remain);
	for(int i = 0; i < remain; i++)
	{
		if(aux_buf[i] != buf[index+i])
			return adr + index + i;
	}
	return (adr + sz);                      // 校验成功
}

为什么要 adr -= SPI_FLASH_MEM_ADDR; ?

因为实际传递进来的地址是带了首地址的,即 0x00000000(如果你定义的是其它地址,而不执行 adr -= SPI_FLASH_MEM_ADDR; 就会出错)。特别注意,我们这里的 0xC0000000 是随意设置的,因为 STM32F4 的标准 SPI 外设并不支持内存映射。

这里执行的擦除大小要前面 FlashDev.c 文件中配置的扇区大小一致,这里是执行的 4KB 为扇区进行擦除。

现在编译之后就可以在项目目录下看见一个 FLM 文件。下面就来验证一下我们的下载算法是否正确。

三、验证算法

首先把我们的 FLM 文件放到如下目录中:D:\Keil_v5\ARM\Flash,可以看到这里有很多 FLM 和 FLX 文件。

这里我随便找了一个项目,按如下方式添加自己的 Flash 下载算法:

然后,编译下载,然后我报了如下的错误:


报错原因是下载算法没有找到 08000000H 这个地址,我这里使用的是默认的链接脚本:

LR_IROM1 0x08000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x08000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

有关链接脚本的部分可以参考:
浅析 Keil 中的 sct 文件,
分散加载文件 scatter files。

这部分的内容比较复杂,我就直接给出解决方案了:

LR_IROM1 0x00000000 0x00100000  {    ; load region size_region
  ER_IROM1 0x0000000 0x00100000  {  ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
   .ANY (+XO)
  }
  RW_IRAM1 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
}

这下编译成功了。但至于写没写入并不清楚,写没写对也不知道。所以我又写了个 W25Q128 的读取程序:

	w25q32_dev.rd(data, 0x00000000, sizeof(data));
	for (int i = 0; i < sizeof(data); ++i)
	{
		printf("%2x ", data[i]);
		
		if ( (i + 1) % 16 == 0 )
			printf("\r\n");
	}

话不多说,看结果(比较的是 bin 文件):

说明算法编写成功 (^人^)。

从零构建STM32F407 SPI Flash下载算法:FLM文件定制与MDK工程实战 本文详细讲解了如何为STM32F407外接SPI Flash(如W25Q128)定制FLM下载算法。通过剖析ARM下载算法工作原理,从MDK模板工程搭建、FlashDev.c设备配置到FlashPrg.c核心函数实现,手把手指导开发者完成FLM文件定制与MDK工程实战,实现对外部Flash的高效编程与验证。 阅读详情

相关推荐

保姆级教程:手把手教你为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)

本文提供了一份详细的教程,指导开发者如何为STM32F407和W25Q128制作Keil MDK的SPI Flash下载算法(FLM文件)。从理解下载算法的核心机制到实现FlashPrg.c的核心操作,再到链接脚本与地址映射实战,手把手教你完成定制化SPI Flash下载算法的开发与优化。

weixin_28716769的博客 408

利用MDK的FLM文件生成通用flash驱动

在进行Flash操作时,一般我们需要设计一套Flash抽象层,至少要包括flash的init,read、write、erase这些操作。但每更换一个单片机或者flash器件就要额外去编写flash驱动去适配init,read、write、erase。尽管有会者不难的属性加持,但适配所有的单片机或者flash器件,工作量也可想而知。本文为大家提供一个适配几乎任意单片机型号的flash驱动,之所以说是几乎,是因为我们这次要借东风,而这个东风就是Keil的FLM文件。

sinat_31039061的博客 1万+

深入浅出:拆解Keil MDK的FLM下载算法机制,以STM32F407驱动W25Q128为例

本文深入解析Keil MDK的FLM下载算法机制,以STM32F407驱动W25Q128为例,详细探讨FLM文件的运行机制、FlashDev.c数据结构、核心函数实现及调试技巧。通过SPI接口优化和防御性代码设计,提升Flash操作效率与可靠性,适用于嵌入式开发者优化存储介质管理。

weixin_30919429的博客 405

利用MDK的FLM文件生成通用flash驱动_keil flm

参数adr指定设备的基址。参数clk指定用于编程设备的时钟频率。参数fnc是一个数字:1 代表擦除。2代表程序。3代表验证。参数adr指定要编程的页面的起始地址。它由主机编程系统与flash页面的起始地址对齐。参数sz指定数据缓冲区中的数据大小。主机编程系统确保不跨越页面边界。参数buf指向包含要编程的数据的数据缓冲区。参数adr扇区地址。

2401_85015083的博客 3483

STM32F407外挂W25Q128在Keil MDK中实现FLM下载算法详解

SPI Flash是一种通过串行外设接口进行数据存储的非易失性存储器,广泛应用于嵌入式系统中扩展存储容量。其工作原理基于SPI协议,通过命令交互实现擦除、编程和读取操作。在Keil MDK开发环境中,FLM下载算法允许直接烧录外部SPI Flash,提升调试和量产效率。对于STM32F407搭配W25Q128的常见场景,自定义FLM算法能解决官方算法不匹配的问题,支持IAP升级和OTA方案。通过合理配置分散加载文件和实现标准接口函数,开发者可以高效完成外部Flash的烧录与验证。

weixin_27038245的博客 208

细说STM32F407单片机DMA方式读写SPI FLASH W25Q16BV

SPI接口具有发送和接收两个DMA请求,在大数据量传输时,使用DMA效率更高,比如,一次写入一个扇区的数据。参考本文作者写的其他文章:细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV-优快云博客本文目的:对照参考文章的需求,把读、写FLASH操作修改为通过DMA方式。其它不变。硬件开发板同参考文章。

wenchm的博客 1975

【STM32F407开发板用户手册】第36章 STM32F407的SPI 总线应用之SPI Flash的MDK下载算法制作

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第36章 STM32F407的SPI 总线应用之SPI Flash的MDK下载算法制作 本章节为大家讲解MDK下载算法制作方法。 目录 第36章 STM32F407的SPI 总线应用之SPI Flash的MDK下载算法制作 36.1 初学者重要提示 36.2 MDK下载算法基础知识 36.2.1 程序能够通过下载算法下载到芯片的核心思想 ...

Simon223的博客 1330

编写FLM编程算法文件(制作离线烧录器的OPT文件)

在MDK的Debug界面下的Flash Download可以选择芯片的编程算法,在安装了芯片包之后可以直接得到目标的编程算法文件,但是对于芯片包的开发者或者有独特的下载需求(校验),这个时候就需要去编写编程算法文件。编译工程文件,在输出目录下即可看到*.axf文件,工程中的*.axf文件跟*.FLM文件相同,只需将后缀.axf修改为.FLM,然后复制到MDK安装目录的ARM/FLASH下,就能在选项卡里选择自己的编程算法文件了。开源库进行文件转换就能得到离线下载的编程算法文件了,参考该文献。

一座明亮的小塔 5507

【STM32F407开发板用户手册】第37章 STM32F407的内部Flash和SPI Flash都使用MDK下载

最新教程下载:http://www.armbbs.cn/forum.php?mod=viewthread&tid=93255 第37章 STM32F407的内部Flash和SPI Flash都使用MDK下载 本章节为大家讲解内部Flash和外部SPI Flash都使用MDK下载的的实现。 37.1 初学者重要提示 37.2 内部Flash和SPI Flash都使用MDK下载的优势 37.3 下载算法存储存放位置 37.4 下载全字库到外部SPI Flash说明 37.5 内...

Simon223的博客 1059

STM32H7 系列芯片 FLM 下载算法文件

STM32H7 系列芯片 FLM 下载算法文件 放置路径:`keil安装路径/ARM/Flash`

STM32 QSPI QPI SPI FLASH W25Q256 MDK下载算法FLM文件下载

想要使用正点原子阿波罗的W25Q256 这个32MB的SPI flash作为代码存储和运行闪存,需要BootLoader +APP +下载算法三部分。 先把下载算法复制到D:\MDK\ARM\Flash 打开你的APP,把MDK工程0x8000 0000改成0x9000 0000编译,添加FLM算法到该APP工程。 本算法内给W25Q256设定的映射地址是固定的0x9000 0000 把APP下载到0x9000 0000,这时MDK会根据地址自动下载到地址对应的存储器W25Q256里面了。 BootLoader 工程设置跳转到0x9000 0000,编译下载到0x8000 0000的stm32内部flash,复位。就可以从BootLoader跳转到APP所在的W25Q256即0x9000 0000运行了。 BootLoader在另一个链接里面哦。测试APP在第三个链接里面哦。

STM32F407外挂W25Q128 Flash下载算法(FLM)开发实战

SPI NOR Flash是一种通过串行外设接口进行数据存储的非易失性存储器,广泛应用于嵌入式系统中存储字库、图片和固件。其工作原理基于扇区擦除和页编程操作,需遵循先擦后写的约束。在Keil MDK开发环境下,通过实现CMSIS-Flash API规范的FLM文件,可使MCU在下载程序时自动完成对外部SPI Flash的擦除与编程,显著提升调试效率和量产便利性。该技术适用于STM32F407等微控制器与W25Q128等SPI Flash的配合场景,实现程序与资源数据的一体化烧录。

weixin_28721917的博客 208

MDK程序下载----FLM文件.pdf

MDK程序下载 程序下载----FLM⽂件 ⽂件 MDK编程算法 编程算法   ⽤过MDK下载程序的⼩伙伴可能都知道,在下载程序之前需要都在Debug设置的Flash Download⼦选项卡选择编程算法。⼤多数时 候, 我们只要安装了芯⽚包之后,就可以直接得到对应的编程算法,并不需要我们去修改它。但是,当你是⼀个芯⽚包的开发者,或者你有独特 的下载需求(⽐如在你的程序⾥加⼊⼀些校验信息),这个时候你就需要去了解它了!   编程算法呢,说⽩就其实也就是⼀段程序,主要功能就是擦除相应的内存块,并将我们的程序写⼊到相应的内存区域上去。 在你点击下载按钮的时候,这段程序会被先下载到RAM上(RAM for Algorithm上的设置),然后才会通过它,将你的程序写⼊到 指定的内存区域内。 实现⼀个⾃⼰的编程算法 实现⼀个⾃⼰的编程算法   怎么去实现⼀个⾃⼰的编程算法?⾸先我们找到⾃⼰的MDK的安装路径,进⼊到ARM\Flash⽂件夹下(例如: D:\Keil_v5\ARM\Flash)。 这⾥有个编程算法的⼯程模板,复制这个⼯程到你的⼯程⽂件夹下,重命名你⾃⼰的想要的名字。   打开⼯程,⾥⾯主要有两个⽂件 FlashPrg.c 和 FlashDev.c:   FlashDev.c主要实现了⼀个设备相关的结构体(根据⾃⼰的Flash情况去实现)      ⽐如STM32L051实现如下:   FlashPrg.c实现了⼏个Flash编程相关的函数:   根据⾃⼰的需要去实现,STM32L051实现如下: 1 /* ----------------------------------------------------------------------------- 2 * Copyright (c) 2014 ARM Ltd. 3 * 4 * This software is provided 'as-is', without any express or implied warranty. 5 * In no event will the authors be held liable for any damages arising from 6 * the use of this software. Permission is granted to anyone to use this 7 * software for any purpose, including commercial applications, and to alter 8 * it and redistribute it freely, subject to the following restrictions: 9 * 10 * 1. The origin of this software must not be misrepresented; you must not 11 * claim that you wrote the original software. If you use this software in 12 * a product, an acknowledgment in the product documentation would be 13 * appreciated but is not required. 14 * 15 * 2. Altered source versions must be plainly marked as such, and must not be 16 * misrepresented as being the original software. 17 * 18 * 3. This notice may not be removed or altered from any source distribution. 19 * 20 * 21 * $Date: 18. November 2014 22 * $Revision: V1.00 23 * 24 * Project: Flash Programming Functions for ST STM32L0xx Flash 25 * --------------------------------------------------------------------------- */ 26 27 /* History: 28 * Version 1.00 29 * Initial release 30 */ 31 32 #include "FlashOS.H" // FlashOS Structures 33 34 typedef volat

STM32F407外挂W25Q128 FLM下载算法从零实现与避坑指南

SPI NOR Flash是一种通过串行外设接口进行数据存储的非易失性存储器,其工作原理基于命令集交互,包括写使能、扇区擦除、页编程和状态轮询等操作。在嵌入式系统中,SPI Flash常用于存储字库、图片和固件备份,技术价值在于扩展存储容量并支持OTA升级。典型应用场景包括STM32F407通过SPI接口连接W25Q128,实现Keil MDK一键下载。然而,Keil默认不支持外部SPI Flash的下载算法,需要开发者自定义FLM文件。本文围绕W25Q128的FLM算法开发,详细讲解从工程搭建到参数配置、

weixin_42549037的博客 184

机器人关节电机发热难题:从工程化角度拆解热管理解决方案(下)

摘要:本文系统分析了机器人关节电机与驱动系统的热管理方案,重点解决局部热点问题。针对不同功率场景提出了热管/均热板散热(适用于中小功率)和液冷散热(适用于高功率)的具体实施方案,详细比较了结构参数、材料选择、安装工艺和散热效果。特别强调了电机-驱动协同热管理的重要性,提出"工况联动+热路径共享"的核心理念,包括一体化散热结构设计和动态控制策略。最后介绍了热仿真与测试验证方法,确保方案的有效落地。通过系统级热管理,可显著降低温升(热点区域降温30-60℃),同时优化体积和能耗。

bother3000的博客 3325

Procedural modeling

What is procedural modeling? One content generation option is modeling buildings, plants, clouds, cities, and worlds using an underlying system of rules. 1 Procedural Modeling: Grammars A rule-based generative system loosely organized as: ...

qq_24505417的博客 711

细说STM32F407单片机轮询方式读写SPI FLASH W25Q16BV

本文旨在说明STM32F407单片机通过SPI1扩展FLASH W25Q16BV,对FLASH进行读ID、写操作、读操作、擦除操作。使用的是旺宝红龙开发板STM32F407ZGT6 KIT V1.0。使用开发板上的按键S2、S3、S4、S5、S6依此执行擦除芯片、擦除BLOCK0、写、读操作。使用开发板上的D2、D3、D4作为操作指示灯。通过串口USART3把操作状态显示到串口助手上。资源利用详见工程配置。工程里创建FLASH目录,包含w25flash.c、w25flash.h。

wenchm的博客 1858

西门子交换机环网冗余设置(实战篇2.2)

MRP的重组时间为 200ms 因此 PROFINET 通信必须选择大于 200ms 的看门狗时间,看门狗。ET200SP默认为 2ms*3=6ms) MRP 的重组时间为 200ms 故系统会报出看门狗超时。更新,默认是 3 个周期,超出设置的周期数就会报 IO 设备故障。时间不是直接配置的,而是作为没有 IO 数据可接受的更新周期,也就是允许几个周期没有数据。来达到大于 200ms 的看门狗时间的要求(看门狗时间 可接受更新周期数 更新时间)。是IO 控制器和 IO 设备)

weixin_42580591的博客 363

STM32F407单片机编程入门(十八) 华邦W25Q32 SPI FLASH实战含源码

本文对W25Q32 SPI FLASH的原理,指令,通讯时序等进行讲解,并介绍了STM32F407VET6的SPI接口,通过STM32F407VET6单片机对W25Q32 进行数据读写实验。采用硬件SPI通讯方式。

光子物联科技主要介绍STM32单片机,GD32单片机以及各种传感器模块原理以及驱动,适合学生,工程师等学习单片机嵌入式开发、传感器驱动、通信协议等。 2175

RK3568平台开发系列讲解:UBOOT详细介绍

U-boot是一款广泛使用的开源引导加载程序,支持多种嵌入式操作系统和处理器架构。其主要功能包括系统上电时的硬件初始化、引导操作系统内核等。U-boot的引导流程通常包括Boot Code、idbloader.img、uboot.img、boot.img和rootfs.img等步骤。启动U-boot时,通过Debug串口连接板卡,按下ctrl+c键可进入U-Boot命令行模式。U-boot启动过程中会执行一系列初始化操作,如打印系统信息、初始化内存、加载内核设备树、初始化I2C、PMIC电源芯片、DRM框架

内核笔记 806

YOLOv11改进策略【Neck】| 替换RT-DETR中的CCFF跨尺度特征融合颈部结构,优化计算瓶颈与冗余问题

RT-DETR中的CCFF模块用于优化多尺度特征融合,解决传统方法的计算瓶颈与冗余问题,提升模型速度与精度,以适应实时检测需求。

Limiiiing的博客 1830

STM32移植文件系统FATFS——片外SPI FLASH

FATFS文件系统移植,片外SPI FLASH

m0_59921410的博客 2157

S32K144 UDSdoCAN 升级刷写实现笔记

本篇旨在描述如何开发“车规级”的软件升级程序,通过在S32K144平台上实现基于UDSdoCAN的刷写升级功能,带你一步步建立安全升级的“工程思维”,在这里既能收获经验还能获得工程源码、测试脚本,助你起飞,避坑提速!

汽车电子软件领域知识分享 810
上一篇: 分散加载文件 scatter files
下一篇: Cortex-M3/M4/M7 芯片 Fault 分析原理与实战
Projectsauron
博客等级 码龄4年 2587粉丝 100原创
评论 19
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值