首页 > 其他分享 >STM32 进阶 SPI外设读写Flash 寄存器代码书写

STM32 进阶 SPI外设读写Flash 寄存器代码书写

时间:2024-12-13 18:29:28浏览次数:5  
标签:CR1 进阶 void Flash STM32 SPI SPI1 GPIO CRL

目录

SPI外设

SPI外设框图

需求描述

硬件电路设计

相关寄存器

文字说明:

spi.h

spi.c

 W25Q32.h


SPI外设

与I2C外设一样,STM32芯片也集成了专门用于SPI协议通讯的外设。

STM32 的 SPI 外设可用作通讯的主机及从机,支持最高的 SCK 时钟频率为 fpclk/2 (STM32F103 型号的芯片默认fpclk1为36MHz,fpclk2为72MHz。),完全支持 SPI 协议的 4 种模式,数据帧长度可设置为 8 位或 16 位,可设置数据 MSB 先行或 LSB 先行。它还支持双线全双工、双线单向以及单线模式。

STM32F103系列提供了3个SPI,SPI1挂在APB2总线,SPI2/3挂在APB1总线。

其中双线单向模式可以同时使用 MOSI 及 MISO 数据线向一个方向传输数据,可以加快一倍的传输速度。而单线模式则可以减少硬件接线,当然这样速率会受到影响。

用的比较多还是双线全双工模式。

SPI外设框图

因为NSS只有一个,如果需要其他设备的话解决办法就是:

禁用NSS,用GPIO引脚配置通用推挽,让其和SPI相连,用其进行控制SPI

需求描述

基于寄存器操作,使用SPI功能,完成Flash的读写。

硬件电路设计

 

相关寄存器

SPI_CR1:spi控制寄存器

MSTR:主设备选择

BR:波特率控制

CPOL:时钟极性

CPHA: 时钟相位

DFF:数据帧格式

SSI:内部从设备选择

LSBFIRST:帧格式

SSM:软件从设别管理

SSI:内部从设备管理

SPE:SPI使能

SPI_DR 数据寄存器

16位

SPI_SR:状态寄存器

TXE:发送缓冲为空

RXNE:接收缓冲非空

文字说明:

 

spi.h

#ifndef __SPI_H__
#define __SPI_H__

#include "stm32f10x.h"

#define CS_HIGH (GPIOC->ODR |= GPIO_ODR_ODR13)
#define CS_LOW (GPIOC->ODR &= ~ GPIO_ODR_ODR13)

void SPI_Init(void);

void SPI_Start(void);

void SPI_Stop(void);

uint8_t SPI_SwapByte(uint8_t byte);

#endif /* __SPI_H__ */

spi.c

#include "spi.h"

void SPI_Init(void){
    // 1. GPIOA
    // 1.1 先放时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPAEN;

    // 1.2 PA5 时钟 复用推挽
    GPIOA->CRL &= ~GPIO_CRL_CNF5_0;
    GPIOA->CRL |= GPIO_CRL_CNF5_1;
    GPIOA->CRL |= GPIO_CRL_MODE5;
    // 1.3 PA6 输入信号 浮空输入
    GPIOA->CRL &= ~GPIO_CRL_CNF6_1;
    GPIOA->CRL |= GPIO_CRL_CNF6_0;
    GPIOA->CRL &= ~GPIO_CRL_MODE6;
    // 1.4 PA7 数据输出 复用推挽
    GPIOA->CRL &= ~GPIO_CRL_CNF7_0;
    GPIOA->CRL |= GPIO_CRL_CNF7_1;
    GPIOA->CRL |= GPIO_CRL_MODE7;

    // 2. GPIOC
    // 2.1 放GPIOC的时钟
    RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;
    CS_HIGH;
    // 2.2. PC13 片选使能信号 通用推挽
    GPIOC->CRH &= ~GPIO_CRH_CNF13;
    GPIOC->CRH |= GPIO_CRH_MODE13;


    //配置硬件SPI
    //0.1放时钟
    RCC->APB2ENR |= RCC_APB2ENR_SPI1EN;
    //0.2 设置DFF位来定义8位或者16位数据格式 当前8位
    SPI1->CR1 &= ~SPI_CR1_DFF;
    //0.3 设置高位优先
    SPI1->CR1 &= ~SPI_CR1_LSBFIRST;
    //0.4 工作模式为主模式
    SPI1->CR1 |= SPI_CR1_MSTR;
    //0.5 波特率的配置 APB2 72M 如果是 000 就是2分频 36M
    SPI1->CR1 &= ~SPI_CR1_BR;
    //0.6 mode0 模式
    SPI1->CR1 &= ~SPI_CR1_CPOL;
    SPI1->CR1 &= ~SPI_CR1_CPHA;
    //0.7 SSOE 配0 这样的话 会关闭SS引脚的输出 同时 会被迫进入
    //多主模式(NSS 会变成一个输入引脚)
    SPI1->CR2 &= ~SPI_CR2_SSOE;
    //0.8 NSS 进入软件模式
    //          SSM 配1 那就是NSS信号 由SSI位来决定
    SPI1->CR1 |= SPI_CR1_SSM;
    //          SSI 配1 再多主模式里 一直处于可通讯状态
    SPI1->CR1 |= SPI_CR1_SSI; 
    // 使能位
    SPI1->CR1 |= SPI_CR1_SPE;
}

void SPI_Start(void){
    CS_LOW;
}

void SPI_Stop(void){
    CS_HIGH;
}

uint8_t SPI_SwapByte(uint8_t byte){
    while (!(SPI1->SR & SPI_SR_TXE))
    {
    }
    SPI1->DR = byte;
    while (!(SPI1->SR & SPI_SR_RXNE))
    {
    }
    uint8_t receive_byte = SPI1->DR;
    return receive_byte;
}

 W25Q32.h

#include "spi.h"

其他不变

标签:CR1,进阶,void,Flash,STM32,SPI,SPI1,GPIO,CRL
From: https://blog.csdn.net/qq_64219867/article/details/144407606

相关文章

  • 【百度地图系列教程一】前端html如何快速嵌入百度地图?从基础到进阶功能全面解析完成地
    【百度地图系列教程一】前端html如何快速嵌入百度地图?从基础到进阶功能全面解析完成地图展示功能标签:百度地图、JavaScript、前端开发、WebGL地图、BMapGL前几天,有人让我帮忙实现一个网页,要求能嵌入百度地图,还得支持鼠标滚轮缩放和右键旋转视角。这种需求在展示地理位......
  • 如何在Flash绝对地址写入常量数组数据
    目录文章目录背景一、问题现象及分析1、分析2、分析3、分析二、尝试方法1.方法2.方法三、结果四、总结背景出于项目要求,需要在STM32F407VETx芯片的Flash绝对地址写入常量数组数据,例如在0x0807F920处写入数组uint8_tMyFlashArray[4]={0x12,0x34,0x56......
  • Ubuntu下vscode cmake jlink stm32 开发环境搭建
    安装gcc-arm-none-eabiJLink或者stm32cubeide自带前面两者安装vscode扩展CMakeToolsCortex-Debug修复vscode爆红.vscode/c_cpp_properties.json{"configurations":[{"name":"Linux","includePath"......
  • 江科大STM32学习:01 C语言(2)指针
    1.指针简介指针Pointer是C语言的一个重要知识点,使用灵活,功能强大指针和底层硬件联系紧密(寄存器),使用指针可操作数据的地址,实现数据的间接访问2.计算机存储机制每个区域都是一个字节,线性分配下去,每个字节对应一个地址。注:一个字节是8bitinta=0x12345678;//十六进制,八......
  • 首发实测,Google最快AI来了!深度解析Gemini 2.0 Flash
    引言年末各家大模型产品之战再度升级,12月11日,Google在官网博客发布了其新一代AI模型Gemini2.0系列的首款模型——Gemini2.0Flash实验版本。正如模型名称Flash描述的那样,该模型具有低延迟和高性能的特性,Google更是计划使其成为Google相关产品规模化应用的核心引擎。通过......
  • Vue+ECharts高级实战】智慧城市数据大屏项目开发完全指南 - 前端开发进阶必看教程 【
    效果图:完整代码<!DOCTYPEhtml><html><head><metacharset="utf-8"><title>智慧城市数据监控大屏</title><scriptsrc="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script><s......
  • 《docker高级篇(大厂进阶):5.Docker-compose容器编排》包括是什么能干嘛去哪下、Compose
    @目录二、高级篇(大厂进阶)5.Docker-compose容器编排5.1是什么5.2能干嘛5.3去哪下5.4Compose核心概念5.5Compose使用的三个步骤5.6Compose常用命令5.7Compose编排微服务5.7.1改造升级微服务工程docker_boot5.7.2不用Compose5.7.3swagger测试5.7.4上面成功了,有哪些问题?5.7.5......
  • 企业消费管理再进阶:SIMPLE模型帮你选择服务商
    公司上万名员工每天满世界飞,差旅应该怎么管?员工出差、加班,每天数万单打车费用,怎么管?招待用餐和员工用餐,如何做到能成本更低,体验更好?包括差旅、招待用餐、员工用餐、用车、福利等,都是企业消费的核心场景。在当前的经济形势下,企业焦点已经从单纯追求用户规模增长,转向企业经营的全方......
  • 【MySQL 进阶之路】索引失效的11种情况
    MySQL进阶之路:索引失效的11种情况在MySQL的查询优化中,索引是一项至关重要的技术,它能够大大提升数据检索的效率。本文将讨论这11种常见情况,帮助开发者更好地理解索引的使用及优化。图示1.使用不等式操作符(!=,<,>)例子:SELECT*FROMusersWHEREage!=30;原理:索......
  • 【接口自动化_进阶】2.0版python接口自动化自建库
    项目介绍目前常见的接口自动化框架,数据维护方式分为两种,一种是维护到文件,另一种维护到代码中。文件方式维护优点:可读性和可维护性好易上手缺点:性能较差些用例设计和使用不灵活冗余数据较多扩展性差代码中维护优点:灵活性高性能高代码及数据复用率高缺点:可读......