捣鼓STM32开发版

2023-12-30 00:20
文章标签 开发 stm32 捣鼓

本文主要是介绍捣鼓STM32开发版,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

汽车电子小菜鸟,从头开始搞嵌入式

  • 开发环境准备 资料准备和一些基本概念
      • 资料
      • ARM 与 STM32的关系:
      • 开发环境搭建
      • 关于编译器和Keil的解释
  • 使用DAP(Fire_Debugger)仿真器下载程序
  • 代码是如何控制硬件的
    • STM 31 位带操作:
    • 寄存器是如何控制外设硬件的?
    • 寄存器,内存
    • GPIO, 引脚,寄存器之间的关系
  • 启动文件
  • 代码是如何驱动硬件的
  • HAL 库
  • Keil新建工程
  • 如何看懂开发板电路图
  • C语言技巧
  • 固件库编程
  • 单片机时钟
    • 晶振 (石英晶体谐振器)
    • 振荡电路
    • 时钟树
  • STM32中断
  • 芯片数据手册(datasheet)、用户手册

开发环境准备 资料准备和一些基本概念

开发,编译,调试环境

资料

野火资料下载中心:https://doc.embedfire.com/products/link/zh/latest/index.html

野火STM32F103霸道_V1_V2(STM32F103ZET6)开发板资料下载:
https://doc.embedfire.com/products/link/zh/latest/mcu/stm32/ebf_stm32f103_badao_v1_v2/download/stm32f103_badao_v1_v2.html

F103霸道资料目录内容及底板介绍:https://doc.embedfire.com/stm32_products/must_read/zh/latest/doc/introduction_of_stm32/STM32/ebf_stm32f103_badao_v1_v2/stm32f103_badao_v1_v2.html

思路一:
https://www.rt-thread.org/ : 国产的的开源操作系统,提供的是工程,一系列文件,

思路二:
KEIL 下载,芯片包导入,从提供的实例工程入手;

思路三:

STM32CubeMX初始化代码生成器;

ARM 与 STM32的关系:

stm32是一种意法半导体公司生产的32位的单片机(或称微控制器),这款单片机的设计采用的就是ARM架构,除了意法半导体公司的STM32单片机,摩托罗拉公司、华为公司、苹果公司均基于ARM架构生产了自己的32位单片机。 stm32作为一种通用型的32位ARM单片机,其出货量全球第一,是最具竞争力的ARM单片机。 (2)ARM是一种芯片的设计模式,STM32是意法半导体公司基于ARM的设计模式生产出的具体的控制器件。 ARM有以下几个系列: Cortex-A:针对高性能计算。如我们目前手机SoC中常出现的Cortex-A76等。 Cortex-R:针对实时操作处理。主要是面向嵌入式实时处理器。在汽车的电子制动系统,工业控制领域等领域比较常见。 Cortex-M:专为低功耗、低成本系统设计。目前火热的IoT领域常常见到采用Cortex-M架构的处理器。

stm32是基于ARM内核的一种控制器,是包含与被包含的关系,ARM(STM32)
ARM是英国的一家芯片设计公司,该公司主要提供IP核,也就是CPU的内核架构,并不是完整的处理器。然后它将这个核卖给各大半导体公司。为了对付8位机市场,推出了Cortex-M3内核,重点来了,STM32就是意大利的意法半导体基于Cortex-M3的32位嵌入式处理器。ST是意法半导体公司的简称,M是指微控制器,也就是MCU的第一个英文字母,32是指32位的MCU。STM32是采用ARM公司的内核设计的。
在这里插入图片描述ARM介绍:

总结 具有以下三种含义:
ARM是一家全球半导体行业技术领先的公司,主要业务是设计RISC嵌入式处理器。
ARM是一类微处理器芯片或产品的统称,即所有采用ARM公司提供方案开发的RISC处理器。
ARM是一项技术的名称,即采用RISC的处理器体系结构。

开发环境搭建

(一)

  • ARMCC环境搭建——用VScode和Cube MX搭建单片机开发环境:(到需要的时候再看)
    https://zhuanlan.zhihu.com/p/419037933
  • https://blog.csdn.net/shengli001842/article/details/126374662
    第1章 Window下VSCode的C语言开发环境搭建 (一),这个使用的是GCC编译器
    该博主的文章都是关于C语言的干货,找时间多看看;
  • https://wekeyuan.blog.csdn.net/article/details/126374788?spm=1001.2014.3001.5502
    VSCode的C语言开发常用配置 (二)
  1. 终端设置字体大小
文件 -> 首选项 -> 设置 -> 功能 ->  终端 
Integrated: Font Size(控制终端的字号(以像素为单位)) 
Editor: Font Size 
设置 18 pix 
  1. 显示终端和隐藏终端
快捷键 :  ctrl + ` 
按下一次显示, 再按一次就会隐藏
  1. 运行前自动保存文件
-> 文件 -> 首选项 -> 设置 -> 扩展 
-> Run Code Configuertion 
-> Save File Before Run -> 选中 
  1. VSCode 复制粘贴一行的快捷键
可以使用ctrl + c 复制光标所在的行 
接下来使用ctrl + v  可以粘贴一行    
  1. 代码对齐

  2. 对齐整个文件

vscode 编辑中 -> 右击 -> 格式化文档(shift+alt+f)  //可以实现整个文件的代码对齐
  1. 对齐选中的内容
先选中代码 -> 右击 -> 格式化选中的内容    // 可以实现对选中的文本对齐  

直接使用keil:

Keil 安装
Keil被ARM 收购之后,叫做MDK, STM32 安装 MDK536;
Keil需要安装芯片包;
使用注册机激活;

关于编译器和Keil的解释

  • https://blog.csdn.net/u012846795/article/details/128030614
    首先来了解一下编译器,其通常分为三个部分:前端+优化器+后端。
    前端:词法、语法和语义分析,将源代码转化为抽象语法树,生成中间代码
    优化器:对得到的中间代码进行优化,使得代码更加高效,
    后端:将优化的代码转化为针对各自平台的机器代码。

    再通俗地说编译器的工作就是:源代码->预处理->编译->目标代码->链接->可执行程序。

armcc 是arm 公司开发的一款编译器,集成在KEIL以及ARM DS IDE里面,于5.06版本后停滞(AC5),不继续维护,其前端基于 Edison Design Group 。

armclang 集成于armcc,基于新的架构 clang 和LLVM,作为arm 的第六代编译器,AC6,成为今后主推的编译器。

由于STM32 是基于 ARM 内核的,而Keil被ARM 收购后,在Keil中集成了armcc 或者 armclang,所以用STM32 开发时,使用Keil是很方便的。

在使用Keil进行STM32开发时,开发人员需要下载适配于ARM Cortex-M3内核的编译器和适配于他们所使用的微控制器的Peripherals Pack。然后,通过Tools选项中的Device Database Manager向Keil添加STM32微控制器。在添加后,Keil就可以自动为你配置所需要的环境。接下来,可以打开Keil的集成开发环境,使用工具集合中的C/C++编译器、Linker和debugger等实现整个开发过程。通过Keil提供的功能,工程师可以轻松地使用STM32进行开发,并有效提高工作效率。

GCC 编译器,
GreenHills 编译器,优势很明显,dmips高,code size小。

使用DAP(Fire_Debugger)仿真器下载程序

串口下载程序:不能硬件仿真和调试程序;
DAP:能下载程序,能硬件仿真(单步执行)和在线调试;
DAP 在Keil中的配置:
使用不需要安装驱动,
支持JTAG 和SW 模式,SWD? V-UART ? 这些是啥? 仿真协议:
JTAG 接口

  • 关注一下T32 硬件组成和JTAG 接口;为什么最终和板子相连时只剩下几根线了?

DAP标准JTAG接口:
标准JTAG接口

仿真器默认是不对外供电的;

代码是如何控制硬件的

参考文章:代码是如何控制硬件的

在这里插入图片描述在这里插入图片描述
32位的ARM或其他设备的flash,一个地址下能写入多少数据?

*( unsigned int * )0x40010C00 |=  ( (1) << (4*5) );
// 这行代码,对地址 0x40010C00  操作 的数据 已经超过了一个字节,为什么也是可以行得通呢?-----该地址作为一个起始地址,会自动往后

51单片机, 位操作:

STM 31 位带操作:

寄存器的每个位都对应一个地址,
在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
乘 32, 左移 5 位; 乘4,左移2两位;

带参宏;

初略的说,一个寄存器的一个BIT,就是一个开关,开就是1,关就是0。通过这个电子开关去控制电路,从而控制外设硬件。
编程最终操作的都是寄存器;
芯片厂商给寄存器分配了相应地址;

我们写的代码,怎么转化为电信号,去改变硬件的输入输出状态?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
https://www.bilibili.com/video/BV1uo4y1M73t/?spm_id_from=333.337.search-card.all.click&vd_source=a0be7f79bf50c208522174ece7f955a5

寄存器是如何控制外设硬件的?

寄存器,内存

Register 寄存器,内存:内存主要用来存储程序代码和数据,而寄存器则用来存储 CPU 运算时使用的指令、数据和地址。内存的容量比寄存器更大。内存分为RAM (也叫运行内存)和ROM(也叫存储性内存)

什么是寄存器?
什么是存储器映射?
在这里插入图片描述通过绝对地址能对应到相应的存储器;

什么是寄存器映射?
在这里插入图片描述

不同的线挂载不同的外设:
在这里插入图片描述
在这里插入图片描述
寄存器与单片机引脚(I/O)的对应关系:PB0-2,
每个寄存器都占了32位,

GPIO, 引脚,寄存器之间的关系

GPIO是什么
GPIO 是引脚的一部分,

既然一个引脚可以用于输入、输出或其他特殊功能,那么一定有寄存器用来选择这些功能。对于输入,一定可以通过读取某个寄存器来确定引脚电位的高低;对于输出,一定可以通过写入某个寄存器来让这个引脚输出高电位或者低电位;对于其他特殊功能,则有另外的寄存器来控制它们。

学会看芯片:霸道;看芯片丝印,得到厂家,型号等信息;辨别芯片正方向:明确相应的引脚,沿着一个小点的逆时针方向旋转(注意右上角那个不是,不要被迷惑了);
芯片架构:
内核(ARM);
I S D
FLASH
SRAM
外设
STM32芯片结构图

在这里插入图片描述
黄色:驱动单元,内核,ARM 公司设计

粉色:被动单元,外设,ST 设计

Icode总线,从Flash读取程序;
DCode总线,读数据,SRAM

系统总线System,读取寄存器,

DMA:

memory mapping:

包含头文件 使用 <> 和使用 “” 的区别

#if 0

#endif 的用法

寄存器

电路图上的PB0, PB1,PB5 对应的GPIO是哪个?

启动文件

.s
在这里插入图片描述
堆栈以8字节对齐 是啥意思?

代码是如何驱动硬件的

在这里插入图片描述在这里插入图片描述在这里插入图片描述

HAL 库

HAL 库是什么及使用

Keil新建工程

启动文件:.s 什么作用?

如何看懂开发板电路图

片内

片外:
如何看开发板原理图
以100ASK_STM32F103的原理图为例,介绍如何看原理图,读者只需要掌握几个要点,就能基本理解原理图的标识含义。100ASK_STM32F103原理图在“4_硬件资料”文件夹里,读者打开《100ASK_STM32F103原理图.pdf》(后简称,《原理图》)配合本手册阅读。

《原理图》一共有11页,第一页包含整体框图、目录、版本信息;第二页是开发板的核心——STM32F103ZET6的原理图;第三页是单片机最小系统,包含MCU电源、时钟、复位等;第四页是系统电源;从第五页开始,是各个模块的原理图,当对某个模块编程的时候,才需要找到对应部分查看。也就是说,当前我们重点关注前面4页即可,这样拆分后,整体框架就比较清晰了。

在原理图上,除了用连线表示两个器件有连接外,更多的时候使用网络标号来表示连接。如图 5.1.1 所示,红色文字是网络标号,只要两者网络标号相同,则表示它们是连接的。原理图上KEY1一共出现了三次,分别是第二页MCU的34脚、第五页按键1模块、第十一页扩展排针J21的15脚,则它们表示电气上是连通的,对应的实物就是MCU的34脚与按键1相连,同时通过J21引出。

在第二页的KEY1前面有个“{5,11}”,表示除了本处以外,在5、11页还有KEY1。同理,第五页的KEY1,有个“{2,11}”,表示除本处以外,在2、11页还有KEY1。读者可以通过此标识,快速了解该网络标号出现了几次,出现在什么位置。
在这里插入图片描述

原理图上的器件类型繁多,但依旧遵循“二八原则”,80%都是常见的器件,因此我们只需熟悉常见器件即可。每一类器件,通常使用英文名称简写标记,比如电阻通常标记为Rn(n为数字),常见元件如下表5.1.1 所示。

—————————在这里插入图片描述
对于电阻、电容这类数量众多,规格不一的器件。除了元件编号以外,通常还会有值、封装、属性等信息。比如上表示例中的电阻R12,阻值为100KΩ,封装为0402,精度为1%。上表示例中的电容C50,容值为1uF,封装为0603,耐压为10V,X5R表示在-55℃~+85℃温度范围工作,电容容值偏差小于±15%。对于嵌入式软件工程师,通常只关注元件编号、阻/容值即可。

对于一个单片机系统,首先要保证最小系统功能正常,其次再实现与各个外设模块的控制或数据传输。因此看原理图也是,首先重点是最小系统,其次是各个外设模块。对于外设模块的外围电路,需要什么电源、怎么接线,电阻/电容如何取值,读者也不用太担心,通常都能找到参考电路,然后根据芯片手册说明,仔细核对,最后调试验证即可。

【总结】
后面分析STM32最小系统的时候,再感受如何具体的分析原理图细节,对于原理图基础部分,读者暂时理解以下内容即可:

理清原理图板块;
理解网络标号;
熟悉常见元件;
理解电阻、电容属性

————————————————
版权声明:本文为CSDN博主「韦东山」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/thisway_diy/article/details/115063642

C语言技巧

防止头文件被重复包含,造成头文件中的变量和函数被重复定义,所以建议在每个头文件中使用以下方式:

#ifndef  __XXXX_H
#define  __XXXX_H

条件编译

#ifdef 0
,,,,
,,,
#elif 1
,,,,
#endif

延时
软件延时:

Delay();

定时器:

\  续行符,所在行不能有任何内容

寄存器编程

固件库编程

固件库文件

  1. 汇编编写的启动文件
  2. 时钟配置文件
  3. 外设相关的
  4. 内核相关的

在这里插入图片描述在这里插入图片描述
安装的芯片包 与固件库有什么区别?
新建工程的时候需要选择芯片,这就是事先安装的芯片包;这个包选择之后会影响什么?

单片机时钟

晶振 (石英晶体谐振器)

石英晶体的 压电特性: 给石英晶体施加交变电压,晶体会震动,震动从而又会产生交变电压,若输入信号的频率等于石英的谐振频率,则组成的震荡电路就会处于共振状态;

有源晶振:只有晶振自己,芯片内部有时钟电路,产生数字时钟信号
无源晶振:内部有时钟电路,

C51单片机晶振频率、时钟周期、状态周期、机器周期、指令周期和总线周期的关系

一、晶振频率

1、英文全称:frequency oscillate;

2、定义:晶体振荡器的固有频率, 不能改变;

3、如果外接12Mhz晶振,则晶振频率12Mhz。

二、时钟周期

1、英文全称:Clock Cycle,为晶振频率12Mhz倒数。

2、时钟周期是计算机中最基本的、最小的时间单位。在一个时钟周期内,CPU仅完成一个最基本的动作。

3、时钟周期 = 晶振周期 = 振荡周期Tosc = 晶振频率(振荡频率fosc)的倒数。

4、若晶振周期为12MHz,则时钟周期 = 1/12us。

三、状态周期

振荡器脉冲信号经过时钟电路二分频之后产生的单片机时钟信号的周期(用S表示)称为状态周期。故一个状态周期S包含2个节拍,前一时钟周期称为P1节拍,后一时钟周期称为P2节拍。

四、机器周期

1、定义:CPU完成一项基本操作(取指令、存储器读写等)所消耗的最短时间。

2、一般由12个时钟周期或者6个状态周期组成。

3、计算:机器人周期 = 12 / 晶振频率。

4、存在的原因:1个时钟周期无法干完一件事,而12个时钟周期能够完成基本的操作。

五、指令周期

取出并执行一条指令的时间。

六、总线周期

访问1次存储器和I/O端口操作所需要的时间。

七、小结

所需时间:时钟周期 < 状态周期 < 机器周期 < 指令周期 < 总线周期

什么是单片机的“S5P2”?
晶体振荡器的振荡信号从XTAL2端输入到片内的时钟发生器上,时钟发生器是一个二分频触发器电路,它将振荡器的信号频率除以2,向CPU提供了两相时钟信号P1和P2。

时钟信号的周期称为机器状态时间S,它是振荡周期的2倍。在每个时钟周期(即机器状态时间S)的前半周期,相位1(即P1信号)有效,在每个时钟周期的后半周期,相位2(即P2信号)有效。每个时钟周期(以后常称状态S)有两个节拍即相位P1和P2,CPU就以两相时钟P1和P2为基本节拍指挥8051各们部件协调工作。

因此,S5P2指的就是第5个时钟周期的相位2(后半拍)(是不是应该是第5个状态周期?)

而在定时器/计数器的应用当中,一个机器周期才能产生一个计数(或叫计数脉冲),计数器才加1。
因此要计多少次就让他产生多少个机器周期。

**eg:**晶体频率为12MHZ,则代表1秒振荡12M次,1次耗时1/12us,
一个机器周期就是12 * 1/12 = 1us
即1us一次计数

所以,一个16位定时器,从0计数到65535,即65536个计数,初值要定多少呢?
(65535 - 待算初值x)= 计数的次数 = 机器周期数 = 所需定时时长/机器周期
(就是数电计数器当中的末态已知,初态待定)
(注意:(65536 - 待算初值x)是关于计数器的计数,不是晶振的东西。16位计数器总计数为65536,一个计数花费一个机器周期)

即有:
(65535 - 待算初值x) = 所需定时时长/机器周期
————————————————
版权声明:本文为CSDN博主「mars_1_1」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/mars_1_1/article/details/106875907

振荡电路

时钟树

无源时钟,需要配起振电容
时钟分频:即多少倍

寄存器编程:一个一个对时钟相关的寄存器进行配置;

使用固件库函数;

芯片包—影响编译

STM32中断

异常 == 中断
ESR
中断嵌套,

中断优先权----查询次序
硬件中断编号
系统异常

外部异常

NVIC:嵌套向量中断控制器,内核外设

内核相关的函数:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

中断向量表:
在这里插入图片描述

中断程序放在哪里了?-- 需要自己写;
中断服务函数
在哪里关联将中断服务函数与中断源进行关联?— 寄存器相应配置之后,
数据手册:

中断的应用实例:
在这里插入图片描述
在这里插入图片描述

GPIO—>EXTI—>NVIC

中断服务函数调用机制

芯片数据手册(datasheet)、用户手册

一般流程是先通过数据手册(datasheet)来获取芯片的参数、引脚分布和所支持的功能。以此来判断芯片是否符合项目需求。

而后工程师通过用户手册(user manual)来进行具体的程序开发。包含详细的功能支持和寄存器描述,还可能有示例代码。

这篇关于捣鼓STM32开发版的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/551150

相关文章

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

Linux_kernel驱动开发11

一、改回nfs方式挂载根文件系统         在产品将要上线之前,需要制作不同类型格式的根文件系统         在产品研发阶段,我们还是需要使用nfs的方式挂载根文件系统         优点:可以直接在上位机中修改文件系统内容,延长EMMC的寿命         【1】重启上位机nfs服务         sudo service nfs-kernel-server resta

【区块链 + 人才服务】区块链集成开发平台 | FISCO BCOS应用案例

随着区块链技术的快速发展,越来越多的企业开始将其应用于实际业务中。然而,区块链技术的专业性使得其集成开发成为一项挑战。针对此,广东中创智慧科技有限公司基于国产开源联盟链 FISCO BCOS 推出了区块链集成开发平台。该平台基于区块链技术,提供一套全面的区块链开发工具和开发环境,支持开发者快速开发和部署区块链应用。此外,该平台还可以提供一套全面的区块链开发教程和文档,帮助开发者快速上手区块链开发。

Vue3项目开发——新闻发布管理系统(六)

文章目录 八、首页设计开发1、页面设计2、登录访问拦截实现3、用户基本信息显示①封装用户基本信息获取接口②用户基本信息存储③用户基本信息调用④用户基本信息动态渲染 4、退出功能实现①注册点击事件②添加退出功能③数据清理 5、代码下载 八、首页设计开发 登录成功后,系统就进入了首页。接下来,也就进行首页的开发了。 1、页面设计 系统页面主要分为三部分,左侧为系统的菜单栏,右侧

v0.dev快速开发

探索v0.dev:次世代开发者之利器 今之技艺日新月异,开发者之工具亦随之进步不辍。v0.dev者,新兴之开发者利器也,迅速引起众多开发者之瞩目。本文将引汝探究v0.dev之基本功能与优势,助汝速速上手,提升开发之效率。 何谓v0.dev? v0.dev者,现代化之开发者工具也,旨在简化并加速软件开发之过程。其集多种功能于一体,助开发者高效编写、测试及部署代码。无论汝为前端开发者、后端开发者

【STM32】SPI通信-软件与硬件读写SPI

SPI通信-软件与硬件读写SPI 软件SPI一、SPI通信协议1、SPI通信2、硬件电路3、移位示意图4、SPI时序基本单元(1)开始通信和结束通信(2)模式0---用的最多(3)模式1(4)模式2(5)模式3 5、SPI时序(1)写使能(2)指定地址写(3)指定地址读 二、W25Q64模块介绍1、W25Q64简介2、硬件电路3、W25Q64框图4、Flash操作注意事项软件SPI读写W2