STM32内部Flash读写问题

2023-11-12

STM32Flash读写之Flash调试技巧


概述:
  MCU-STM32H743,编程环境-Keil,Flash容量为2MB(2048K)。

1.先熟悉所用MCU的Flash存储大小以及扇区地址

  2MB分成 2个块:Bank1和 Bank2,每个块有8个128K的用户扇区和1个128K的系统扇区,所以用户可用的Flash大小为2×8×128=2048KB,也就是2MB。
闪存模块组织表:

2.Flsah写之前为什么要先擦除

  要明白Flash的编程原理都是只能将1写为0,而不能将0写为1,所以在进行Flash编程前,必须将对应的块擦除,即将该块的每一位都变为1,块内所有字节变为0xFF。如下图所示将BANK1的扇区2(0x08040000)擦除的结果:
在这里插入图片描述
Keil中查看某个地址的数据
在这里插入图片描述
在Memory中输入地址查看改地址的内容。
在这里插入图片描述

3.Flash擦除长时间占用CPU

  片内flash擦除及写入的时序由芯片内自动控制,当发出擦除或写入指令时,CPU暂时停止工作,外围设备(串行口、ADC、Timer等仍处于活动状态),外围设备产生的中断此时被挂起,中断在擦除或写入完成后按优先级顺序执行,所以片内Flash的擦除占用了CPU的时间,这段时间还不少呢,查看STM32H743芯片手册:
在这里插入图片描述
写只需要us级的时间,但是扇区擦除和块擦除都是s级的,这时间是真的不短呢,因为Flash机制而且H7的Flash有2M字节,擦除时间长也在所难免。

4.实测Flash擦写占用的时间

实测扇区擦除需要时间
  首先要明白STM32H7只能以扇区(128K)或块(1M)为单位擦除,利用GPIO拉高拉低的方式测试Flash扇区擦除的时间,擦除之前拉高GPIO4擦除完毕后拉低,代码如下

	GPIO4_L;
	GPIO4_H;
	STMFLASH_OnlyErase(FLASH_Erase_ADDR,1);//后面会给出该函数
	GPIO4_L;

执行结果如下,一个扇区的擦除消耗了950ms
在这里插入图片描述
实测不擦除写入时间
  不擦除写入是指:要写入的区域没有被写过,或者提前被擦除过。执行以下代码

	GPIO4_L;
	GPIO4_H;
	STMFLASH_OnlyWrite(FLASH_Write_ADDR,(uint32_t*)Flash_WData,8);//flash测试(写) 写完一次就屏蔽(写只需要一次)
	GPIO4_L;

执行结果如下,消耗约190us
在这里插入图片描述

5.Flash读写要注意几点

●<1>.STM32H7每次写入数据必须为8个字(32字节)
在这里插入图片描述
  STM32H743内存的编程位数固定为256位,也就是每次写入数据必须为8个字(32字节),如果不够8个字,可以在后面进行补0写入,否则内容将不可预知。而且,写入首地址必须是32的整数倍,否则会影响前后的数据。
32字节写入至BANK1的扇区2(0x08040000)
执行代码:

uint32_t Flash_WData[8] ={0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA,0xAAAAAAAA};//测试数组
STMFLASH_Write(0x08040000,(uint32_t*)Flash_WData,8);//Flash擦除后写入

写入结果
在这里插入图片描述
小于32字节写入至BANK1的扇区2(0x08040000)
执行代码:

uint32_t Flash_WData[1] ={0xAAAAAAAA};//测试数组
STMFLASH_Write(0x08040000,(uint32_t*)Flash_WData,1);//写入读取的安装位置放置在0x08020060(扇区2)flash地址中(转存上一次写入的ID值)	

写入结果,出现了不可预知的内容:
在这里插入图片描述

●<2>Flash写入的首地址要大于代码占用的地址
  stm32默认就是从flash中取指令执行的,所以我们用户操作Flash时要避开代码占用区,闪存的起始地址为 0x08000000。我们在Keil的工程下就可以查看代码的起始地址和结束地址。方式如下:在Keil工程目录下搜索.map文件,用notepad++打开,里面有各个变量存放的地址代码的起始地址等等,从中看到代码起始地址为0x08000000:
在这里插入图片描述
结束地址为:
在这里插入图片描述
所以我们所要操作的Flash起始地址要大于代码占用的结束地址,并且为32的整数倍。

6.keil的.map文件中包含了什么

  编译后的.map文件中包含了很多有用的信息,关于涉及内存调试必看。
1.Section Cross References:模块、段(入口)交叉引用
2.Removing Unused input sections from the image:移除未调用模块
3.Image Symbol Table:映射符号表
4.Memory Map of the image:内存(映射)分布
5.Image component sizes:存储组成大小

比如在程序的编译后,我们会注意到以下信息:
在这里插入图片描述
其中
Code: 指代码的大小
RO-data :const变量或字符串常量
RW-data :指可读写(RW)、已初始化的变量数据
ZI-data:指未初始化(ZI)的变量数据

其实在工程目录下的.map文件中有更详细的描述,动手查看一下。
.map文件中:
Code:代码段
RO :const变量或字符串常量
RW :指可读写(RW)的数据
data:赋值了的全局变量或static变量、全局数组
bss:未赋值的全局变量或static变量

★注意:
Code、Ro-data:位于FLASH中;
RW-data、ZI-data:位于RAM中;
RW-data已初始化的数据会存储在Flash中,上电会从FLASH搬移至RAM。

观察下图.map文件中,RW数据事先保存在Flash中,但是.bss(未赋值的全局变量)就不会为其在Flash中分配内存。
在这里插入图片描述
所以程序占用的Flash大小为Code + RO Data + RW Data(中已初始化的数据)。

7.操作不当导致Flash损坏会怎样

调试一模一样的三块电路板,同样的程序两块好使,另一块一运行就进错误中断,最后查看了我操作的Flash部分:
在这里插入图片描述
成了这样…
换了扇区就好了。只能怀疑不小心损坏了它?

8.Flash上锁与解锁

  在Flash的读、写、擦除、操作的时候都会对Flash进行上锁解锁操作。
解锁: 在FLASH_KEYR寄存器写入特定的序列(KEY1和KEY2)。
在这里插入图片描述
上锁: 在Flash操作完成后要对Flash上锁,将FLASH_CR寄存D0位置1。
在这里插入图片描述
在这里插入图片描述

9.Keil编译器如何查看MCU寄存器的值

执行以下步骤:
在这里插入图片描述
就可以查看当前某个寄存器的值,调试起来非常方便了。
在这里插入图片描述

10.Flash读、写、擦除、擦除写代码

●Flash只擦除不写

/*只擦除不写*/
void STMFLASH_OnlyErase(uint32_t EraseAddr,uint32_t NumToErase)
{
	FLASH_EraseInitTypeDef FlashEraseInit;
    HAL_StatusTypeDef FlashStatus=HAL_OK;
    uint32_t SectorError=0;
	uint32_t addrx=0;
	uint32_t endaddr=0;	
    if(EraseAddr<STM32_FLASH_BASE||EraseAddr%4)return;	//非法地址
    
 	HAL_FLASH_Unlock();             //解锁	
	addrx=EraseAddr;				//写入的起始地址
	endaddr=EraseAddr+NumToErase*4;	//写入的结束地址
    
    if(addrx<0X1FF00000)
    {
        while(addrx<endaddr)		//扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
		{
			if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
			{   
				FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除 
				FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区STMFLASH_GetFlashSector(addrx)
				FlashEraseInit.Banks=FLASH_BANK_1;						//操作BANK1
                FlashEraseInit.NbSectors=1;                             //一次只擦除一个扇区
                FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!
                if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) 
                {
                    break;//发生错误了	
                }
               SCB_CleanInvalidateDCache();                            //清除无效的D-Cache
			}else addrx+=4;
            FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);    //等待上次操作完成
        }
    }
    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);       //等待上次操作完成
	if(FlashStatus==HAL_OK)
	{

	}
	HAL_FLASH_Lock();           //上锁
}

●Flash只写不擦

/*只写不擦除*/
void STMFLASH_OnlyWrite(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)
{
	HAL_StatusTypeDef FlashStatus=HAL_OK;
	uint32_t endaddr=0;	
	
	HAL_FLASH_Unlock();             //解锁	
	endaddr=WriteAddr+NumToWrite*4;	//写入的结束地址
		while(WriteAddr<endaddr)//写数据
		{
            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//写入数据
			{ 
				break;	//写入异常
			}
			WriteAddr+=32;
			pBuffer+=8;
		} 
	HAL_FLASH_Lock();           //上锁
}

●Flash先擦除后写

/*先擦出后写*/
void STMFLASH_Write(uint32_t WriteAddr,uint32_t *pBuffer,uint32_t NumToWrite)	
{ 
    FLASH_EraseInitTypeDef FlashEraseInit;
    HAL_StatusTypeDef FlashStatus=HAL_OK;
    uint32_t SectorError=0;
	uint32_t addrx=0;
	uint32_t endaddr=0;	
    if(WriteAddr<STM32_FLASH_BASE||WriteAddr%4)return;	//非法地址
    
 	HAL_FLASH_Unlock();             //解锁	
	addrx=WriteAddr;				//写入的起始地址
	endaddr=WriteAddr+NumToWrite*4;	//写入的结束地址
    
    if(addrx<0X1FF00000)
    {
        while(addrx<endaddr)		//扫清一切障碍.(对非FFFFFFFF的地方,先擦除)
		{
			if(STMFLASH_ReadWord(addrx)!=0XFFFFFFFF)//有非0XFFFFFFFF的地方,要擦除这个扇区
			{   
				FlashEraseInit.TypeErase=FLASH_TYPEERASE_SECTORS;       //擦除类型,扇区擦除 
				FlashEraseInit.Sector=STMFLASH_GetFlashSector(addrx);   //要擦除的扇区STMFLASH_GetFlashSector(addrx)
				FlashEraseInit.Banks=FLASH_BANK_1;						//操作BANK1
                FlashEraseInit.NbSectors=1;                             //一次只擦除一个扇区
                FlashEraseInit.VoltageRange=FLASH_VOLTAGE_RANGE_3;      //电压范围,VCC=2.7~3.6V之间!!
                if(HAL_FLASHEx_Erase(&FlashEraseInit,&SectorError)!=HAL_OK) 
                {
                    break;//发生错误了	
                }
               SCB_CleanInvalidateDCache();                            //清除无效的D-Cache
			}else addrx+=4;
            FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);    //等待上次操作完成
        }
    }
    FlashStatus=FLASH_WaitForLastOperation(FLASH_WAITETIME,FLASH_BANK_1);       //等待上次操作完成
	if(FlashStatus==HAL_OK)
	{
		while(WriteAddr<endaddr)//写数据
		{
            if(HAL_FLASH_Program(FLASH_TYPEPROGRAM_FLASHWORD,WriteAddr,(uint64_t)pBuffer)!=HAL_OK)//写入数据
			{ 
				break;	//写入异常
			}
			WriteAddr+=32;
			pBuffer+=8;
		} 
	}
	HAL_FLASH_Lock();           //上锁
} 

●Flash读

//从指定地址开始读出指定长度的数据
//ReadAddr:起始地址
//pBuffer:数据指针
//NumToRead:字(32位)数
void STMFLASH_Read(uint32_t ReadAddr,uint32_t *pBuffer,uint32_t NumToRead)   	
{
	uint32_t i;
	for(i=0;i<NumToRead;i++)
	{
		pBuffer[i]=STMFLASH_ReadWord(ReadAddr);//读取4个字节.
		ReadAddr+=4;//偏移4个字节.	
	}
}

下一篇:Flash擦除长时间占用CPU时间,影响代码正常运行解决方案。

软件优化Flash擦写长时间占用CPU
已更新…
已更新…
已更新…
待更新…
已更新…
已更新…
已更新…
软件优化Flash擦写长时间占用CPU

★★★如有错误,欢迎指导!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32内部Flash读写问题 的相关文章

  • 使用 Flash 在本地托管游戏?

    我只是找不到合适的谷歌搜索词 是否可以使用 Flash 或 Flash 兼容服务 来允许游戏中的玩家通过 Web 浏览器托管自己的游戏 使用自己的带宽 在某种程度上 从他们的计算机运行他们自己的游戏服务器 对于 Flash 浏览器内游戏 但
  • 如何在动作脚本 3 中设置/访问外部 swf 文件的动态文本字段?

    我正在处理一个 fla 文件 其中添加了一个 swf 文件 我如何在该 swf 文件的动态文本上设置文本 有没有直接设置文本的方法 我不想在 url 中作为参数传递 我试过这样 var rq URLRequest new URLReques
  • Flash 未在调试播放器中显示错误/堆栈跟踪(firefox/chrome/whatnot)

    我正在尝试调试在线默默地失败的应用程序 我 100 确定我正在运行 Flash 调试播放器 为了确保我不会丢失它 我故意抛出一个错误 但 Flash 在浏览器中没有显示任何 stracktrace 我快要失去它了 有什么线索吗 我正在 ch
  • 在 Javascript 中检测 Flash 文件何时完成播放

    我正在使用 Javascript 将 Flash 文件嵌入到网站中 然后需要在播放完成后将其删除 有没有办法用普通的 Javascript 来做到这一点 或者是否需要将回调类型的函数添加到 Flash 文件本身 我该如何编码 JavaScr
  • 在 Flash Player 10 中打开 pdf

    我需要在 Flash Player 10 中打开 PDF 该 swf 不会在浏览器中运行 并且系统上不会有 adobe reader 程序 我需要知道是否可以在 Flash 播放器中打开 PDF 而无需以任何方式进行转换 我在谷歌上搜索了无
  • html 可嵌入 flash wav 播放器

    我需要一个可在 IE FF 和 Chrome 中播放 wav 文件的嵌入式音频播放器 目前无法转换为 mp3 或任何其他格式 该播放器应该非常简单 只有一个播放 暂停按钮 也许还有一个时间轴栏 用户可以单击该时间轴栏来转到音频的特定部分 还
  • Flash - HTTP 请求在本地主机上不起作用

    首先 我试图修复一些我一开始就没有构建的东西 项目负责人向我保证 当他离开时 它工作得很好 尽管自从他离开后我从未接触过的版本似乎已经同样的问题 一般来说 我对编程也有点陌生 所以如果我在第一篇文章中遗漏了重要信息 请告诉我 我会尝试添加更
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • 在没有流媒体服务器的情况下在 Flash 中录制 h.264 视频?

    是否可以在不需要流媒体服务器 如 fms wowza red5 的情况下从 Flash Actionscript 相机 即网络摄像头 保存 h 264 视频 我还想从麦克风获取样本数据 并在客户端对其进行转码 以便用户可以录制 h 264
  • FloorPlanner 应用程序的 SVG/Canvas 与 Flash

    我计划创建一个平面图应用程序 允许用户使用鼠标绘制 调整大小 移动和旋转对象 我只是想知道使用 Flash 或 Javascript 是否会更好 如果使用 Javascript 我应该使用 canvas 还是 SVG 该应用程序将允许拖动选
  • 在浏览器上录制视频并上传到LAMP服务器

    我已经尝试了很多东西 red5 jquery 网络摄像头 html5 但这些解决方案都没有录制视频并准备好上传到服务器 无论如何 html5 flash 等等 更好的跨浏览器解决方案 最好的 上传视频 音频 并将结果上传到服务器 我猜是通过
  • 我如何知道请求是否来自 flash swf?

    我有一个用 flash 开发的应用程序 我需要访问一些 php 文件 因此 如果访问来自 swf 则 php 文件会返回一些数据 如何判断请求是否来自Flash 无需将 get post 变量传递给 php 可能是用户代理 推荐人 请记住
  • 使用 Flex 3 从 SWF 创建 EXE,而不需要 AIR?

    我有一个用 Flex 3 MXML 和一些 AS3 编写的简单的小测试应用程序 我可以将其编译为 SWF 但我想将其制作为 EXE 这样我就可以将它提供给我的几个同事 他们可能会发现它有用 使用 Flash 8 我可以只针对 EXE 而不是
  • 使用 Javascript 检测 Pepper (PPAPI) Flash

    我们使用的是专有的文档查看器 它与某些 Chrome 版本中的 Pepper 版本的 Flash 配合得不太好 所以我希望能够检测到它并重定向到不同格式的相同内容 由于这个版本似乎落后于 NPAPI 版本 所以我一直在使用闪光检测 http
  • 用于商业 Web 应用程序的 Flash - 为什么不呢?

    我从事开发商业网络应用程序的行业 它们大多供内部使用 有时有合作伙伴区域 但很少可供公共互联网使用 它们是帮助公司运营业务的应用程序 一段时间以来 我有一个想法困扰着我 为什么不使用 Flash 到现在为止都是ASP NET AJAX 这还
  • 如何检测跨平台浮点行为的差异

    我可以执行哪些检查来确定两个硬件平台的浮点行为有何差异 验证 IEEE 754 合规性或检查已知错误可能就足够了 以解释我观察到的输出差异 我通过 proc cpu 查看了 CPU 标志 两者都声称支持 SSE2 我在看 https www
  • Javascript 通过ExternalInterface 来刷新

    我想知道是否有人可以查看我的代码 我正在尝试使用以下代码将虚拟变量从 javascript 传递到 actionscript 3 HTML
  • GCC 变量映射和 MISRA-C

    我主要知道两种使用 GCC 声明内存映射寄存器的方法 有许多变体 使用双字段 每个外设的数据结构等 要么使用初始化为正确地址的指针 例如volatile uint32 t pMyRegister uint32 t 0xDEADBEEFUL
  • 创建对象的弱引用

    Actionscript 3 中是否可以创建对对象的弱引用 以便可以对其进行垃圾收集 我正在创建一些类以使调试更容易 因此如果仅在此处引用这些对象 我不希望这些对象挂在内存中 当然我不想用回调填充代码以删除对象 格兰特 斯金纳 Grant
  • Actionscript 3:使用字符串中的名称播放库中的声音

    我正在尝试编写一些 actionscript 3 代码来播放库中的短声音 使用动态创建的字符串来加载它 在 AS2 中 我可以这样做 mySound new Sound mySound attachSound any concatenate

随机推荐

  • 日本半导体制造商AKM工厂失火停产,市场再次掀起抢货潮!

    数据猿年度重磅活动预告 2020年度金猿策划活动 金猿榜单发布 金猿奖杯颁发 即将推出 尽情咨询期待 大数据产业创新服务媒体 聚焦数据 改变商业 据日本共同社报道 10月20日 旭化成旗下集团公司从事半导体制造的旭化成微电子株式会社 简称
  • C++从0到1(2):数据类型

    目录 1 整型 2 sizeof关键字 3 实型 浮点型 4 字符型 5 转义字符 6 字符串型 7 布尔类型 8 cin 数据的输入 C 规定在创建一个变量或常量时 必须要指定相应的数据类型 否则无法给变量分配内存 数据类型存在的意义 给
  • 富文本编辑器的使用方法

    富文本编辑器又称Rich Text Editor 简称RTE 它不同与文本编辑器 程序员可以到网上下载免费的富文本编辑器嵌于自己设计的网站或者程序里 方便用户编辑文章或者信息 主要用于发新闻类似的东西 它有着和word文档还有网上发论坛插图
  • ssd测试mAP的时候出现tensorflow版本问题,问题 _variable_v2_call() got an unexpected keyword argument ‘collections’

    这个问题是Tensorflow 版本太高导致的 我原来使用的 1 13 1 的版本不行 换成了 1 10 1就可以了
  • 2023年新能源汽车行业研究报告

    第一章 行业概况 新能源汽车 是指采用新型动力系统 完全或者主要依靠新型能源驱动的汽车 包括纯电动汽车 插电式混合动力汽车 增程式混合动力汽车和燃料电池汽车等 国际上 混合动力汽车 含中混 强混 插电式混动 汽车 天然气汽车 纯电动汽车和燃
  • 《一周搞定模电》—基本放大电路

    文章目录 TOC 文章目录 一 三极管放大电路 1 饱和失真和截至失真 2 静态工作点 二 放大电路改进 分压偏置电路 一 三极管放大电路 下图是共发射极放大电路 R8两端的电压值与输入信号是反向关系 仿真图如下所示 1 饱和失真和截至失真
  • MySQL大小写敏感的解决方案

    不同的MySQL版本有不同的默认设定 具体情况需要具体分析 mysql是通过lower case table names参数来控制大小写敏感的 该参数在 mysqld 节点下 具体的含义笔者从官网截了一张图 关于lower case tab
  • 算法:链表数字相加

    算法 链表数字相加 问题 解决 问题 解决 class Solution def mergeNodes self head Optional ListNode gt Optional ListNode init re ListNode 0
  • 项目总结@Repository注解dao层接口扫描不到

    使用 Repository来注解 来注解dao层接口 运行运行项目不能扫描 应该是接触的项目比较少 第一次遇到这种情况 使用 Repository注解mapper接口发现项目运行找不到dao层的东西 我滴个神 以前用着这玩意不是挺好使的嘛
  • hashmap链表转化成红黑树的过程以及红黑树转化成链表的过程

    1 链表转红黑树的实现代码 该方法主要是将单向链表转化成双向链表 为了后面操作 比如在后面将红黑树放到数组上时 以及红黑树转成链表时简化操作 final void treeifyBin Node
  • C语言分别判断大小写英文字母,空格,数字和其他字符的个数

    输入一段字符串 分别判断小写字母 大写字母 数字 空格和其他字符各有几个 ASCII码中空格的ASCII码为32 A为65 a为97 程序代码 include
  • 世纪末的星期

    曾有邪教称1999年12月31日是世界末日 当然该谣言已经不攻自破 还有人称今后的某个世纪末的12月31日 如果是星期一则会 有趣的是 任何一个世纪末的年份的12月31日都不可能是星期一 于是 谣言制造商 又修改为星期日 1999年的12月
  • trap 信号捕获

    trap 信号捕获 命令说明 示例 产生信号 语法 选项说明 命令说明 Trap signals and other events Defines and activates handlers to be run when the shel
  • List去除空元素

    一 Collections singleton 一个用于创建只包含一个元素的不可变集合的方法 创建一个只包含一个值为null的元素的集合 list removeAll Collections singleton null list remo
  • Node.js搭建WEB服务器

    Node js搭建WEB服务器 1 安装Node和nodemon插件 2 引入http模块 3 创建服务监听端口 4 解析接口地址 5 解析get参数 6 解析post参数 1 安装Node和nodemon插件 全局安装nodemon插件
  • 超详细 Springboot 线程池用法一(自用)

    目录 前言 1 EnableAsync 和 Async 很关键 2 Thread 和 Runnable 要谨慎 3 数据类型 线程安全 要牢记 4 Configuration 和 Bean 很方便 5 ThreadPoolExecutor
  • uniapp图片裁剪插件开发整理

    工作之余 把工作中需要用的一个小工具封装成uniapp插件分享给大家 图片裁剪 使用场景 头像裁剪 对照片尺寸有特定要求的 实现思路 布局 做上下两层展示 下层展示一张亮度低一点全图 充当遮住部分 效果可以自定义比如说高斯模糊等 上层展示裁
  • 网络调试助手-Win & Linux

    网络调试助手 Win Linux 一 网络调试助手 二 Windows版 三 Linux版 参考链接 一 网络调试助手 PC桌面或嵌入式的客户端开发时常需要进行收发调试 常用的工具便是网络调试助手 支持UDP TCP客户端 服务端的模拟 二
  • [王垠系列]TeXmacs:一个真正“所见即所得”的排版系统

    TeXmacs 一个真正 所见即所得 的排版系统 好久没有推荐过自己喜欢的软件了 现在推荐一款我在美国做数学作业的私家法宝 TeXmacs 我恐怕不可能跟以前那么有闲心写个长篇的 TeXmacs 说明文档了 不过这东西如此的简单好用 所以基
  • STM32内部Flash读写问题

    STM32Flash读写之Flash调试技巧 文章目录 1 先熟悉所用MCU的Flash存储大小以及扇区地址 2 Flsah写之前为什么要先擦除 3 Flash擦除长时间占用CPU 4 实测Flash擦写占用的时间 5 Flash读写要注意