STM32 - 利用SPI接口读写FLASH编程实践

2023-11-15

1. SPI 固件库介绍

可以直接查看:

F103固件库手册(只有英文没有中文).chm,找到SPI章节,相关信息都在这里:

初始化结构体及函数定义在库文件“stm32f4xx_spi.h”及“stm32f4xx_spi.c”中,编程 时我们可以结合这两个文件内的注释使用或参考库帮助文档。

typedef struct
{
	uint16_t SPI_Direction; /*设置 SPI 的单双向模式 */
	uint16_t SPI_Mode; /*设置 SPI 的主/从机端模式 */
	uint16_t SPI_DataSize; /*设置 SPI 的数据帧长度,可选 8/16 位 */
	uint16_t SPI_CPOL; /*设置时钟极性 CPOL,可选高/低电平*/
	uint16_t SPI_CPHA; /*设置时钟相位,可选奇/偶数边沿采样 */
	uint16_t SPI_NSS; /*设置 NSS 引脚由 SPI 硬件控制还是软件控制*/
	uint16_t SPI_BaudRatePrescaler; /*设置时钟分频因子,fpclk/分频数=fSCK */
	uint16_t SPI_FirstBit; /*设置 MSB/LSB 先行 */
	uint16_t SPI_CRCPolynomial; /*设置 CRC 校验的表达式 */
} SPI_InitTypeDef;

(1) SPI_Direction

本成员设置 SPI 的通讯方向,可设置为双线全双工(SPI_Direction_2Lines_FullDuplex), 双线只接收(SPI_Direction_2Lines_RxOnly),单线只接收(SPI_Direction_1Line_Rx)、单线只 发送模式(SPI_Direction_1Line_Tx)。

(2) SPI_Mode

本成员设置 SPI 工作在主机模式(SPI_Mode_Master)或从机模式(SPI_Mode_Slave ),这 两个模式的最大区别为 SPI 的 SCK 信号线的时序,SCK 的时序是由通讯中的主机产生的。 若被配置为从机模式,STM32 的 SPI 外设将接受外来的 SCK 信号。

(3) SPI_DataSize

本成员可以选择 SPI 通讯的数据帧大小是为 8 位(SPI_DataSize_8b)还是 16 位 (SPI_DataSize_16b)。

(4) SPI_CPOL 和 SPI_CPHA

这两个成员配置 SPI 的时钟极性 CPOL 和时钟相位 CPHA,这两个配置影响到 SPI 的 通讯模式,关于 CPOL 和 CPHA 的说明参考前面“通讯模式”小节。 时钟极性 CPOL 成员,可设置为高电平(SPI_CPOL_High)或低电平(SPI_CPOL_Low )。 时钟相位 CPHA 则可以设置为 SPI_CPHA_1Edge(在 SCK 的奇数边沿采集数据) 或 SPI_CPHA_2Edge (在 SCK 的偶数边沿采集数据) 。

(5) SPI_NSS

本成员配置 NSS 引脚的使用模式,可以选择为硬件模式(SPI_NSS_Hard )与软件模式 (SPI_NSS_Soft ),在硬件模式中的 SPI 片选信号由 SPI 硬件自动产生,而软件模式则需要 我们亲自把相应的 GPIO 端口拉高或置低产生非片选和片选信号。实际中软件模式应用比 较多。

(6) SPI_BaudRatePrescaler

本成员设置波特率分频因子,分频后的时钟即为 SPI 的 SCK 信号线的时钟频率。这个 成员参数可设置为 fpclk 的 2、4、6、8、16、32、64、128、256 分频。

(7) SPI_FirstBit

所有串行的通讯协议都会有 MSB 先行(高位数据在前)还是 LSB 先行(低位数据在前)的 问题,而 STM32 的 SPI 模块可以通过这个结构体成员,对这个特性编程控制。

(8) SPI_CRCPolynomial

这是 SPI 的 CRC 校验中的多项式,若我们使用 CRC 校验时,就使用这个成员的参数 (多项式),来计算 CRC 的值。 配置完这些结构体成员后,我们要调用 SPI_Init 函数把这些参数写入到寄存器中,实 现 SPI 的初始化,然后调用 SPI_Cmd 来使能 SPI 外设。

2. 硬件设计

本实验板中的 FLASH 芯片(型号:W25Q64)是一种使用 SPI 通讯协议的 NOR FLASH 存储器,它的 CS/CLK/DIO/DO 引 脚 分 别 连 接 到 了 STM32 对 应 的 SPI 引 脚 NSS/SCK/MOSI/MISO 上,其中 STM32 的 NSS 引脚是一个普通的 GPIO,不是 SPI 的专用 NSS 引脚,所以程序中我们要使用软件控制的方式。

FLASH 芯片中还有 WP 和 HOLD 引脚。WP 引脚可控制写保护功能,当该引脚为低电 平时,禁止写入数据。我们直接接电源,不使用写保护功能。HOLD 引脚可用于暂停通讯, 该引脚为低电平时,通讯暂停,数据输出引脚输出高阻抗状态,时钟和数据输入引脚无效。 我们直接接电源,不使用通讯暂停功能。

关于 FLASH 芯片的更多信息,可参考其数据手册《W25Q64》来了解。

3. 软件设计

3.1. 编程要点

(1) 初始化通讯使用的目标引脚及端口时钟;

(2) 使能 SPI 外设的时钟;

(3) 配置 SPI 外设的模式、地址、速率等参数并使能 SPI 外设;

(4) 编写基本 SPI 按字节收发的函数;

(5) 编写对 FLASH 擦除及读写操作的的函数;

(6) 编写测试程序,对读写数据进行校验。

3.2 实例代码

定义FLASH指令编码表

#define  sFLASH_ID              0XEF4017    //W25Q64

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

STM32 - 利用SPI接口读写FLASH编程实践 的相关文章

  • 一文讲解单片机、 ARM、 MCU、 DSP、 FPGA、 嵌入式错综复杂的关系

    概述 一文讲解单片机 ARM MCU DSP FPGA 嵌入式错综复杂的关系 首先 嵌入式 这是个概念 准确的定义没有 各个书上都有各自的定义 但是主要思想是一样的 就是相比较PC机这种通用系统来说 嵌入式系统是个专用系统 结构精简 在硬件
  • 笔记-STM32F407 DAC-DMA-TIM输出正弦波

    通用定时器6中断初始化 arr 自动重装值 psc 时钟预分频数 定时器溢出时间计算方法 Tout arr 1 psc 1 Ft us Ft 定时器工作频率 单位 Mhz 这里使用的是定时器6 void TIM6 Init u16 arr
  • 【STM32+cubemx】0024 HAL库开发:IAP(在应用编程)的实现

    IAP在应用编程 In Application Programming 指的是MCU在运行应用程序时 能接收新的烧写文件 并更新到自身的程序存储器中 即可以在应用程序运行时在线升级 本节我们通过一个简单的例子 来实现STM32的IAP功能
  • 什么是大小端?如何确定大小端?

    一 什么是大小端 对于一个由2个字节组成的16位整数 在内存中存储这两个字节有两种方法 一种是将低序字节存储在起始地址 这称为小端 little endian 字节序 另一种方法是将高序字节存储在起始地址 这称为大端 big endian
  • 关于串口助手接收到数据,但显示的数据(16进制)为00的解决方法

    只需要把波特率调低就行
  • 《深入理解计算机系统》(CSAPP)实验三 —— Buf Lab

    这是CSAPP的第三个实验 主要让我们熟悉GDB的使用 理解程序栈帧的结构和缓冲区溢出的原理 实验目的 本实验的目的在于加深对IA 32函数调用规则和栈结构的具体理解 实验的主要内容是对一个可执行程序 bufbomb 实施一系列缓冲区溢出攻
  • 【STM32+cubemx】0015 HAL库开发:内部flash读写

    本节我们来学习stm32内部flash的读写 在某些应用中 我们需要保存少量掉电仍然不丢失的数据 而在电路板上额外增加一块eeprom或者flash又太浪费硬件资源 这时我们就可以把这些数据保存在stm32内部的flash里 1 stm32
  • 嵌入式开发之堆栈调试打印

    简介 打印堆栈的常用方法包括 glibc中的backtrace函数 gcc内置函数 builtin return address 第三方库libunwind 1 glibc中的backtrace 1 1函数原型 include
  • 利用三轴加速度求解位移的算法—来自飞思卡尔方案

    在要求精度不高的情况 可以使用三轴加速度积分得到位移 飞思卡尔给出了官方方法 下文来自翻译说明 cache freescale com files senso 摘要 此文档描述并使用MMA7260QT三轴加速计和低功耗的9S08QG8八位单
  • 交叉编译tslib (正确版)

    1 下载安装交叉编译器 编译器版本不限 需要与系统移植时的编译器保持一致即可 2 下载tslib1 4 3 交叉编译tslib 1 4 下载的tslib 1 4 tar gz放到 home driver ts 目录下 cd home dri
  • STM32 基础系列教程 21 - NVIC

    前言 学习stm32 NVIC接口编程 学会使用常用的NVIC接口函数 优改中关优先级 开 关单个中断 开 关所有中断 开 关所有中断和异常 系统软件重启等功能 示例详解 基于硬件平台 STM32F10C8T6最小系统板 MCU 的型号是
  • STM32 基础系列教程 31 – DAC

    前言 学习stm32 DAC数模转换接口使用 学会用STM32 的DAC接口 通过DAC接口将数字信号转变成模拟信号输出 或查看内部变量值的变化波形 学习DAC波形发生器的使用 示例详解 基于硬件平台 NUCLEO F302R8 NUCLE
  • 嵌入式入门基础知识有哪些?

    嵌入式系统是指在特定应用领域内为满足特定要求而设计的计算机系统 通常被嵌入到设备中 具有实时性 可靠性 低功耗等特点 嵌入式系统应用广泛 例如 智能家居 智能手表 汽车控制系统 医疗设备等 在本篇博客中 我们将讨论嵌入式入门基础知识 包括嵌
  • 线性回归方程

    线性回归方程在嵌入式开发中是非常常用的 尤其在参数校准这块应用非常普遍 无论你是写在上位机代码中 还是直接写在嵌入式软件中 下面是我在PT100校准中写的关于线性回归方程代码 线性回归方程公式 平均值XA X1 X2 XN N 平均值YA
  • 【STM32+cubemx】0020 HAL库开发:以太网ENC28J60芯片和TCP、UDP简单应用

    MCU通过以太网通信有很多种方式 有的内部自带以太网接口 如stm32f107的某些型号 如果没有 也可以在外围连接以太网芯片来实现 外接的以太网芯片 又分为带网络协议栈和不带协议栈的 带网络协议栈的典型如W5500 不带网络协议栈的典型的
  • STM32 基础系列教程 36 - Lwip_dns

    前言 域名系统 英文 DomainNameSystem 缩写 DNS 是互联网的一项服务 它作为将域名和IP地址相互映射的一个分布式数据库 能够使人更方便地访问互联网 DNS使用TCP和UDP端口53 当前 对于每一级域名长度的限制是63个
  • STM32 基础系列教程 5 – 系统定时器

    前言 学习stm32 systime的使用 用基本定时器产生定时1ms定时中断 用于参生1ms系统时钟节拍 并实现将1ms 节拍改成500us 或其它时间功能 并实产生的时间节拍为机基准实现控制LED闪烁 示例详解 基于硬件平台 STM32
  • printk函数的用法

    printk在内核源码中用来记录日志信息的函数 只能在内核源码范围内使用 用法和printf非常相似 printk函数主要做两件事情 第一件就是将信息记录到log中 而第二件事就是调用控制台驱动来将信息输出 1 日志级别 printk相比p
  • STM32的烧录和Hex/bin烧录文件解析、烧录文件是被如何存储到MCU中的?

    什么是hex文件 以 hex为后缀的文件我们称之为HEX文件 hex是intel规定的标准 hex的全称是Intel HEX 此类文件通常用于传输将被存于ROM或EEPROM中的程序和数据 是由一行行符合Intel HEX文件格式的文本所构
  • GPIO引脚的模式设置:开漏、推挽、拉高、拉低、中断输入、串行通信、模拟输入输出、容错输入、PWM输出。过零检测介绍。

    开漏输出 软件 将GPIO口设置为开漏输出模式 可以实现开漏输出控制方式 输出电平只能被拉低 而不能被拉高 在使用开漏输出时 需要外部接上一个上拉电阻 将输出电平拉高到高电平 开漏输出常用于驱动I2C总线 LED灯等场景中 硬件设置为开漏输

随机推荐

  • 哈夫曼编码的实现

    2 哈夫曼编码的实现 对教材P167中习题5 18 编码实现哈夫曼编码树 并对 Chapter Graphs surveys the most important graph processing problems including de
  • org.hibernate.UnknownEntityTypeException: Unable to locate persister:xxx类

    看了网上其他人的解决办法 发现出现的错误跟我的并不相同 基本就是没有引入映射文件 或者映射文件路径错误 我的错误是抽取了一个公共的dao 其中 get方法应该传入get x class id 而我写入的是类名 所以运行时总是提示找不到这个类
  • 51单片机学习笔记-12LCD1602液晶屏

    12 LCD1602液晶屏 toc 注 笔记主要参考B站江科大自化协教学视频 51单片机入门教程 2020版 程序全程纯手打 从零开始入门 注 工程及代码文件放在了本人的Github仓库 12 1 LCD1602介绍 LCD1602 Liq
  • ArcSDE 日志文件表(二)

    基于会话的或独立的日志文件组成的池 Pools of log file tables 以下为ArcGIS10 1中文帮助 归地理数据库管理员所有的日志文件池 地理数据库管理员可以创建可由其他用户检出和使用的日志文件池 这些日志文件可以是基于
  • spark性能优化调优指导性文件

    1 让我们看一下前面的核心参数设置 num executors 10 20 executor cores 1 2 executor memory 10 20 driver memory 20 spark default parallelis
  • Linux常用命令与JavaWeb开发环境的搭建

    文章目录 前言 一 系统信息以及查看文件 1 1系统信息 1 2查看文件 二 查看进程和防火墙的开关 三 搭建Java Web开发环境 3 1JDK 3 2Tomcat 3 3Mysql 总结 前言 Linux 特点 免费 开源 免费 安全
  • 继电器驱动电路原理及注意事项

    继电器驱动电流一般需要20 40mA或更大 线圈电阻100 200欧姆 因此要加驱动电路 1 晶体管用来驱动继电器 必须将晶体管的发射极接地 具体电路如下 NPN晶体管 PNP晶体管 NPN晶体管驱动时 当晶体管T1基极被输入高电平时 晶体
  • 导入数据的几种方法

    采用标准python类库导入数据 读取文件 from csv import reader import numpy as np filename pima csv with open filename rt as raw data read
  • centOS7服务器搭建

    一 安装jdk 运行代码 yum search jdk 1 查询当前云服务器里面通过yum可以安装哪些jdk 以这个jdk1 8的版本为例 运行代码 yum y install java 1 8 0 openjdk 2 安装jdk1 8版本
  • obj(判断对象中是否包含某个key属性)

    key in obj 不包含 obj hasOwnProperty key 包含
  • 纯代码构建Swift工程

    有些东西很简单 但是我还是把它记录了下来 使用Storyboard创建一个新的项目后 应用程序从闪屏 到主窗口 再到第一个界面经过的文件分别是 LaunchScreen storyboard gt Main storyboard gt Vi
  • NBIoT与LoRa技术详解及竞争态势分析

    物联网的无线通信技术很多 主要分为两类 一类是Zigbee WiFi 蓝牙 Z wave等短距离通信技术 另一类是LPWAN low power Wide Area Network 低功耗广域网 即广域网通信技术 LPWA又可分为两类 一类
  • 计算机视觉领域经典模型汇总(RCNN、YOLO等)

    一 RCNN系列 1 RCNN RCNN是用于目标检测的经典方法 其核心思想是将目标检测任务分解为两个主要步骤 候选区域生成和目标分类 候选区域生成 RCNN的第一步是生成可能包含目标的候选区域 RCNN使用传统的计算机视觉技术 特别是选择
  • linux中tmp文件在哪,Linux系统中/tmp文件夹

    在Linux系统中 tmp文件夹里面的文件会被清空 至于多长时间被清空 如何清空的 可能大家知识的就不多了 所以 今天我们就来剖析一个这两个问题 在RHEL CentOS Fedora 系统中 本次实验是在RHEL6中进行的 1 tmpwa
  • 数字后端dbGet使用方法合集

    以下资料是我之前写过的 芯片数字后端中Innovus Encounter dbGet命令使用方法的介绍 整理了一下 做成合集 方便大家查询 点击标题就可以选择文章查看 会直接挂在公众号的主页菜单栏里的 后端资料 里 感觉好的话 请多多推广喔
  • java报错:Connection reset by peer: socket write error

    用java做excel导出时 报错 ClientAbortException java net SocketException Connection reset by peer socket write error 大致出现问题的原因如下
  • java指纹识别+谷歌图片识别技术(采用Hash方法)

    转载自 http blog csdn net yjflinchong article details 7469213 java指纹识别 谷歌图片识别技术 前阵子在阮一峰的博客上看到了这篇 相似图片搜索原理 博客 就有一种冲动要将这些原理实现
  • Python3 PyCharm 捕获异常报 Too broad exception clause 警告

    最近在 PyCharm 中写代码的时候会抱怨 Exception 没有指定错误类型 Too broad exception clause 这是因为捕获的异常过于宽泛 没有针对性 可以通过指定精确的异常类型来解决 BaseException
  • NLP进阶,使用TextRNN和TextRNN_ATT实现文本分类

    TextRNN TextRNN仅仅是将Word Embedding后 输入到双向LSTM中 然后对最后一位的输出输入到全连接层中 在对其进行softmax分类即可 模型如下图 代码 class RNN nn Module def init
  • STM32 - 利用SPI接口读写FLASH编程实践

    1 SPI 固件库介绍 可以直接查看 F103固件库手册 只有英文没有中文 chm 找到SPI章节 相关信息都在这里 初始化结构体及函数定义在库文件 stm32f4xx spi h 及 stm32f4xx spi c 中 编程 时我们可以结