STM32入门学习笔记之外置FLASH读写实验(下)

发布者:SereneSpirit最新更新时间:2024-09-25 来源: elecfans关键字:STM32  读写实验 手机看文章 扫描二维码
随时随地手机看文章

(2)创建w25q128.c并输入以下代码。


/*********************************************************************************************************

                FLASH    驱    动    程    序

*********************************************************************************************************/

#include 'w25q128.h' 

#include 'delay.h'

/***************************************************

Name    :SPI2_SetSpeed

Function  :SPI2速度设置函数

Paramater  :

      SpeedSet:0~7

Return    :None

***************************************************/

void SPI2_SetSpeed( u8 SpeedSet )

{

  SpeedSet &= 0x07 ;                                          //限制范围

  SPI2->CR1 &= 0xFFC7 ;

  SPI2->CR1 |= SpeedSet<<3 ;                                      //设置SPI2速度

  SPI2->CR1 |= 1<<6 ;                                          //SPI设备使能

}

/***************************************************

Name    :SPI2_ReadWriteByte

Function  :SPI2读写一个字节

Paramater  :

      TxData:要写入的字节

Return    :读取到的字节

***************************************************/

u8 SPI2_ReadWriteByte( u8 TxData )

{

  u16 retry=0;

  //等待发送区空

  while( ( SPI2->SR&0x02 )==0 )

  {

    retry ++ ;

    //超时退出

    if( retry>=0xFFFE )

      return 0 ;

  }

  SPI2->DR = TxData ;                                          //发送一个byte

  //等待接收完一个byte

  retry = 0 ;

  while( ( SPI2->SR&0x01 )==0 )

  {

    retry ++ ;

    //超时退出

    if( retry>=0xFFFE )

      return 0 ;

  }

  return SPI2->DR ;                                          //返回收到的数据

}

/***************************************************

Name    :W25QXX_Init

Function  :初始化W25Q128芯片

Paramater  :None

Return    :None

***************************************************/

void W25QXX_Init()

  RCC->APB2ENR |= 1<<3 ;                                        //PORTB时钟使能     

  GPIOB->CRH &= 0x0000FFFF ;

  GPIOB->CRH |= 0xBBB30000 ;                                      //PB12推挽输出+PB13/14/15复用

  GPIOB->ODR |= 0x7<<13 ;                                        //PB13/14/15上拉

  W25QXX_CS = 1 ;                                            //SPI FLASH不选中

  //初始化SPI

  RCC->APB1ENR |= 1<<14 ;                                        //SPI2时钟使能

  SPI2->CR1 |= 0<<10 ;                                        //全双工模式

  SPI2->CR1 |= 1<<9 ;                                          //软件nss管理

  SPI2->CR1 |= 1<<8 ;

  SPI2->CR1 |= 1<<2 ;                                          //SPI主机

  SPI2->CR1 |= 0<<11 ;                                        //8bit数据格式

  SPI2->CR1 |= 1<<1 ;                                          //空闲模式下SCK为1 CPOL=1

  SPI2->CR1 |= 1<<0 ;                                          //数据采样从第二个时间边沿开始,CPHA=1

  //对SPI2属于APB1的外设.时钟频率最大为36M

  SPI2->CR1 |= 3<<3 ;                                          //Fsck=Fpclk1/256

  SPI2->CR1 |= 0<<7 ;                                          //MSBfirst

  SPI2->CR1 |= 1<<6 ;                                          //SPI设备使能

  SPI2_ReadWriteByte( 0xFF ) ;                                    //启动传输

  SPI2_SetSpeed( SPI_SPEED_2 ) ;                                    //设置为18M时钟,高速模式

}

/***************************************************

Name    :W25QXX_Wait_Busy

Function  :等待空闲

Paramater  :None

Return    :None

***************************************************/

void W25QXX_Wait_Busy()   

{

  u8 byte=0 ;

  // 等待BUSY位清空

  do

  {

    W25QXX_CS = 0 ;                                          //使能器件

    SPI2_ReadWriteByte( W25X_ReadStatusReg ) ;                            //发送读取状态寄存器命令

    byte = SPI2_ReadWriteByte( 0xFF ) ;                                //读取一个字节

    W25QXX_CS = 1 ;                                          //取消片选

  }while( ( byte&0x01 )==0x01 ) ;

}

/***************************************************

Name    :W25QXX_Erase_Chip

Function  :擦除整个芯片

Paramater  :None

Return    :None

***************************************************/

void W25QXX_Erase_Chip()

{

    W25QXX_CS = 0 ;                                            //使能器件

    SPI2_ReadWriteByte( W25X_WriteEnable ) ;                              //发送写使能

  W25QXX_CS = 1 ;                                            //取消片选

    W25QXX_Wait_Busy() ;   

    W25QXX_CS=0 ;                                            //使能器件   

    SPI2_ReadWriteByte( W25X_ChipErase ) ;                                //发送片擦除命令  

  W25QXX_CS = 1 ;                                            //取消片选             

  W25QXX_Wait_Busy() ;                                        //等待芯片擦除结束

}

/***************************************************

Name    :W25QXX_Erase_Sector

Function  :擦除一个扇区

Paramater  :

      Address:扇区地址

Return    :None

***************************************************/

void W25QXX_Erase_Sector( u32 Address )

{

   Address *= 4096 ;

    W25QXX_CS = 0 ;                                            //使能器件

    SPI2_ReadWriteByte( W25X_WriteEnable ) ;                              //发送写使能

  W25QXX_CS = 1 ;                                            //取消片选

    W25QXX_Wait_Busy();   

    W25QXX_CS = 0 ;                                            //使能器件

    SPI2_ReadWriteByte( W25X_SectorErase ) ;                              //发送扇区擦除指令

    SPI2_ReadWriteByte( ( u8 )( Address>>16 ) ) ;                            //发送24bit地址

    SPI2_ReadWriteByte( ( u8 )( Address>>8 ) ) ;

    SPI2_ReadWriteByte( ( u8 )Address ) ;

  W25QXX_CS = 1 ;                                            //取消片选

[1] [2]
关键字:STM32  读写实验 引用地址:STM32入门学习笔记之外置FLASH读写实验(下)

上一篇:基于STM32F4x9的LCD显示设计
下一篇:STM32入门学习笔记之外置FLASH读写实验(上)

推荐阅读最新更新时间:2024-11-17 13:59

STM32入门学习笔记之TFTLCD显示实验2
Bit 19:成组写使能位 0:写操作始终处于异步模式 1:写操作为同步模式 Bit 14:EXTMOD:扩展模式使能(即允许读和写使用不同的时序) 0:不使用FSMC_BWTR寄存器(默认) 1:FSMC使用FSMC_BWTR寄存器 Bit 13:等待使能位 0:禁用NWAIT信号,在设置的闪存保持周期之后不会检测NWAIT信号插入等待状态 1:使用NWAIT信号,在设置的闪存保持周期之后根据NWAIT信号插入等待状态(默认) Bit 12:写使能位 0:禁止FSMC对存储器的写操作,否则产生一个AHB错误 1:允许FSMC对存储器的写操作(默认) Bit 11:配置等待时序 0:N
[单片机]
STM32在MDK下的一种通用建立库函数工程的方法(标准库)
物料准备 MDK4或者(MDK5+Legacy支持包) ST官方下载的库文件(STM32F10x_StdPeriph_Lib_V3.5.0) 下载地址 http://pan.baidu.com/s/1cyxwXS 库函数主要文件夹简介 需要的用的库文件都在STM32F10x_StdPeriph_Lib_V3.5.0Libraries文件夹下,它又包含了以下两个文件夹 CMSIS(一些核心和库文件代码,CMSIS主要代码) CM3DeviceSupportSTSTM32F10x文件夹 system_stm32f10x.c(STM32F10x CMSIS Cortex-M3设备访问层的系统源文件) system_stm32f10
[单片机]
<font color='red'>STM32</font>在MDK下的一种通用建立库函数工程的方法(标准库)
STM32驱动LCD的原理介绍
TFTLCD即薄膜晶体管液晶显示器。它与无源TN-LCD、STN-LCD的简单矩阵不同,它在液晶显示屏的每一个像素上都设置有一个薄膜晶体管(TFT),可有效地克服非选通时的串扰,使显示液晶屏的静态特性与扫描线数无关,因此大大提高了图像质量。 ▲驱动流程 01 使用FSMC驱动LCD 关于FSMC,把数据写入相应的地址,FSMC就会把地址从FSMC_A出去,写入的数据会会从FSMC_D发出去。至于片选等信号线都是自动的。读的话,直接读相应的地址,就会拿到改地址上的数据。 FSMC驱动外部SRAM时,外部SRAM的控制一般有: 地址线(如A0~A25) 数据线(如D0~D15) 写信号(WE,即WR) 读信号(OE,即RD
[单片机]
<font color='red'>STM32</font>驱动LCD的原理介绍
STM32中断挂起和RTOS任务挂起的区别
中断挂起 可以理解为:将中断设置为就绪状态,一旦符合条件,立即执行中断并进入中断函数;比如A和B的抢占优先级相同,A的响应优先级高于B,那么当产生A和B中断的事件发生时,先执行A,并同时将B挂起,一旦A执行完毕,立即执行B。 RTOS的任务挂起 以FreeROTS为例,因为某些原因不能立即执行的任务,可以将其挂起,这个挂起使得任务暂时无法参与任务调度。只有将任务唤醒之后才能继续参与;
[单片机]
STM32库程序编程出现的串口,时钟配置与实际的不同的问题
前些日子,到网上下了STM32的库文件,自己建了个工程,虽然工程建成功了,但是调试定时器与串口的时候,却出现了以下问题: 1、调i的时候,我设置定时1s钟,每秒让LED轮流亮灭,结果程序出现每2sLED轮流亮灭一次??? 2、调试串口的时候,我设置波特为115200,结果串口调试助手的波特率调到57600才那个正常收发??? 鉴于上两种正常的状态,可以总结出:期望与实际存在2倍的关系,可以肯定不是定时器货串口配置问题,而是时钟系统上出现了问题,所以在线仿真调试发现(我使用的外部时钟8M),在void RCC_GetClocksFreq(RCC_ClocksTypeDef* RCC_Clocks)函数中 RCC_Clocks-
[单片机]
如何使用代码清除STM32单片机上的PCROP
前言 STM32PCROP专有代码读出保护,将某个区域设置为仅允许执行,可防止代码被非法读出与修改。ST网站提供了免费的PCROP参考代码,但是例程中仅仅提供了用代码设置PCROP。为方便利用PCROP进行知识产权保护的开发和部署,这篇文章提供了方法,可在RDP级别设置为1或者0时,使用代码清除PCROP。 ST网站上的PCROP参考代码 学习使用PCROP,可从ST网站下载文档以及参考代码。文档里有一步一步的详细说明。参考代码则实现了,如何设置编译开发环境去掉文字库(Literal pool),以避免受保护区域需要被读访问;参考代码也实现了如何利用代码使能PCROP保护以及如何导出接口符号供二次开发使用。 你可以编译运行
[单片机]
如何使用代码清除<font color='red'>STM32</font>单片机上的PCROP
STM32再学习——启动流程分析
我们写嵌入式程序,基本上采用C语言来编写,以main( )作为程序的入口。但实际上,mian()并不是最先要执行的,在这之前需要做一些基本的工作,如堆、栈的定义;main函数的复位连接等,这些工作就需要一个专门的启动程序来完成,由于需要做的工作内容不多,并且需要更直接的管理内存,一般采用汇编编写。 无论是STM32、ARM系列的单片机,还是简单的如51,PIC等,都以为上述原因,需要启动程序,只不过51,PIC等单片机的启动程序已经在相应的IDE编译、链接的时候隐含的编译了,故在写单片机程序的时候无需考虑。而STM32的启动有相应的启动文件,本文将采用KEIL MDK自带的启动文件STM32F10x.s进行分析。 1 启动模式的选
[单片机]
STM32的RCC
STM32的复位可以分为三种,分别是:系统复位、电源复位、备份域复位。 系统复位: 系统复位发生后,除过时钟寄存器CSR中的复位标志位和在备份域里的寄存器值保存外,把所有的寄存器值都设置成他们的复位值,以下任何事件中的那个发生都会触发系统复位: 1.在引脚NRST上有低电平存在(外部复位); 2.窗口看门狗计数器计数计到头(WWDG复位); 3.独立看门狗计数器计数计到头(IWDG复位); 4.软件复位(SW复位); 5.低功耗管理复位。
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved