stm32驱动NOR Flash 之MX25L51245G(64MB)

发布者:tanjunhui最新更新时间:2020-03-23 来源: eefocus关键字:stm32  驱动NOR  Flash  MX25L51245G 手机看文章 扫描二维码
随时随地手机看文章

MX25L51245G 支持SPI的MODE0/MODE3,一般都选择mode3


#define FLASH_SECTOR_SIZE (4*1024)

#define FLASH_PAGE_SIZE 256

引脚定义


/*

* SPI1

* @SCK  : PA5

* @MISO : PA6

* @MOSI : PA7

*

* @CS   : PA0

*/

读写接口


static u8 SPI_Write(u8 byte)

{

u32 timeout = 0xFFFF;

while(!(SPI1->SR & SPI_I2S_FLAG_TXE))

{

if(--timeout == 0)

{

printf("TX timeout ! rn");

return 0;

}

}

SPI1->DR = byte;

 

timeout = 0xFFFF;

while(!(SPI1->SR & SPI_I2S_FLAG_RXNE))

if(--timeout == 0)

{

printf("RX timeout ! rn");

return 0;

}

 

return SPI1->DR;

}

 

static u8 SPI_Read(void)

{

    return (SPI_Write(DUMMY_BYTE));

}

初始化函数


void SPI1_Configuration(void)

{

SPI_InitTypeDef  SPI_InitStructure;

    GPIO_InitTypeDef GPIO_InitStructure;

 

RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    

    /* Configure SPI1 pins: NSS, SCK, MISO and MOSI */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    /* Configure PA.0 as Output push-pull, used as Chip select */

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;

    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

    GPIO_Init(GPIOA, &GPIO_InitStructure);

 

    /* Deselect the FLASH: Chip Select high */

    SPI_CS_Low();

 

    /* SPI1 configuration */ 

    SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master;

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;          /* mode 3 */

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8;

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPI1, &SPI_InitStructure);

 

    /* Enable SPI1 NSS output for master mode */

    //SPI_SSOutputCmd(SPI1, DISABLE);    

    /* Enable SPI1  */

    SPI_Cmd(SPI1, ENABLE); 

 

SPI_Write(0xFF); //start transport

}

 

等待忙


/*

* @return : none-zero idle, else busy

*/

static u8 SPI_WaitBusy(void)

{

u32 timeout = 0xFFFF;

while( SET==SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY)) /* SPI_SR */

{

if(--timeout == 0)

return 1;

}

 

return 0;

}

Flash 等待WIP信号


#define    FLASH_WIP_MASK         (1 << 0)

 

/*

* @return : none-zero timeout

*/

static u8 FlashWait_Busy(void)

{

    u8 FLASH_Status;

    u32 retry=0;

    FLASH_CS_Low();

 

/*

* bit 0: WIP (=1 busy, else free)

* bit 1: WEL (=1 write enable)

*/

    SPI_Write(RDSD_CMD);          /* read status register */

    do{

        

        FLASH_Status=SPI_Read();

        if(retry++ > FLASH_BUSY_TIMEOUT)

            return FLASH_Status;

    }while((FLASH_Status & FLASH_WIP_MASK) == FLASH_WIP_MASK);    /* fix : not bit 7 !!! */

    

    //printf("status register : 0x%x rn", FLASH_Status);

 

    SPI_CS_High();

 

return 0;

}

获取flash信息


static void FlashGet_Info(flashInfoTypedef * pFlashInfo)

{

//     FlashWait_Busy();

    FLASH_CS_Low();

    SPI_Write(RDID_CMD);

    pFlashInfo->ManufacturerID=SPI_Read();

    pFlashInfo->DeviceID[0]=SPI_Read();

    pFlashInfo->DeviceID[1]=SPI_Read();

    SPI_CS_High();    

}

 

static void FlashGet_ElectronicInfo(flashInfoTypedef * pFlashInfo)

{

    FLASH_CS_Low();

    SPI_Write(REMS_CMD);

    SPI_Write(DUMMY_BYTE);

    SPI_Write(DUMMY_BYTE);

    SPI_Write(0x00);             //manufacturer's ID first

    pFlashInfo->ManufacturerID=SPI_Read();

    pFlashInfo->DeviceID[0]=SPI_Read();   

    SPI_CS_High();    

}

写使能


static void FlashWriteEnable(void)

{

    FLASH_CS_Low();

    SPI_Write(WREN_CMD);   

    SPI_CS_High();    

}

spi flash初始化


void SpiFlash_Init(void)

{

flashInfoTypedef flashInfo;

 

//SPI1_Configuration();

#if 1

FlashGet_ElectronicInfo(&flashInfo);

 

if((flashInfo.ManufacturerID==0xc2)&&(flashInfo.DeviceID[0]==0x20))

    {

        printf("Flash Info: MXIC(Macronix International Co.,Ltdrn");

    }

#endif

    FlashGet_Info(&flashInfo);

    printf("ManufacturerID = 0x%02X     rn",flashInfo.ManufacturerID);

    printf("DeviceID       = 0x%02X%02X rn",flashInfo.DeviceID[0],flashInfo.DeviceID[1]);

}

获取ID的接口


static void Flash_ReadID(void)

{

flashInfoTypedef flashInfo;

FlashGet_ElectronicInfo(&flashInfo);

 

if((flashInfo.ManufacturerID==0xc2)&&(flashInfo.DeviceID[0]==0x20))

    {

        printf("Flash Info: MXIC(Macronix International Co.,Ltdrn");

    }

    FlashGet_Info(&flashInfo);

    printf("ManufacturerID = 0x%02X     rn",flashInfo.ManufacturerID);

    printf("DeviceID       = 0x%02X%02X rn",flashInfo.DeviceID[0],flashInfo.DeviceID[1]);

}

关键字:stm32  驱动NOR  Flash  MX25L51245G 引用地址:stm32驱动NOR Flash 之MX25L51245G(64MB)

上一篇:stm32外扩外部sram学习笔记
下一篇:STM32芯片开发之添加外置NOR FALSH扩展代码空间

推荐阅读最新更新时间:2024-11-12 20:58

什么是stm32看门狗?独立看门狗和窗口看门狗工作原理解析
stm32有两个看门狗,独立看门狗和窗口看门狗,其实两者的功能是类似的,只是喂狗的限制时间不同。 独立看门狗是限制喂狗时间在0-x内,x由你的相关寄存器决定。喂狗的时间不能过晚。 窗口看门狗,所以称之为窗口就是因为其喂狗时间是一个有上下限的范围内,你可以通过设定相关寄存器,设定其上限时间和下限时间。喂狗的时间不能过早也不能过晚。 窗口看门狗的 上窗口就是配置寄存器WWDG- CFR里设定的W ; 下窗口是固定的0x40; 当窗口看门狗的计数器在上窗口值之外,或是低于下窗口值都会产生复位。 图2 && 上窗口的值可以只有设定,7位二进制数最大只可以设定为127(0x7F),最小又必须大于下窗口的0x40,所以其取值范
[单片机]
什么是<font color='red'>stm32</font>看门狗?独立看门狗和窗口看门狗工作原理解析
stm32定时器外部时钟3使用外部时钟源模式2进行定时的步骤
stm32中的通用定时器的计数时钟有三种,内部时钟、外部时钟源、内部触发输入这三种,其中内部时钟是大家都比较常用的,也是在应用中比较多的,我们现在主要来讲一下外部时钟源的模式2外部时钟模式2:外部触发输入。 编程步骤: 配置TIM3_ETR引脚为输入引脚PD2,硬件上需要将脉冲连接到该引脚,我这里是使用6.78MHz的晶振 配置定时器3:包括使能定时器3对应的时钟引脚,配置定时器3的周期、预分频参数 因为我们使用了定时器3中断,所以需要给定时器设置优先级,在timerx_nvic_init()中的关于TIM3部分操作 将SMCR中的ETF、ETPS、ETP和ECE进行配置 执行完了以上步骤之后还需要操作triggle中断
[单片机]
STM32使用内部晶振还是外部晶振
在项目开发过程中,经常会面临“用内部晶振还是外部晶振”的问题。如何选择?关键还是看应用! 如果产品附加值比较高,并且产品对温度,电磁环境等可靠性要求严格的时候,需要考虑使用外部晶振。 毕竟,内部晶振受环境影响比较大(内部晶振的叫法不是很严谨,准确的说内部是RC振荡器,鉴于阻容器件尤其电容大小受温度影响较大,因此温度、电压等对其影响较大,如下图技术手册中所指出的)。 话说回来,在MCU上如果不使用外部晶振,那么引脚OSC_IN和OSC_OUT如何接才比较好呢? ▲技术手册 我们以STM32为例说明,如果使用内部RC振荡器而不使用外部晶振,请按照以下方法处理: (1)对于100脚或144脚的产品,OSC_IN应接地,
[单片机]
<font color='red'>STM32</font>使用内部晶振还是外部晶振
STM32-触摸屏实验
void Touch_Init(void);//初始化 u8 Read_ADS(u16 *x,u16 *y); //带舍弃的双方向读取 u8 Read_ADS2(u16 *x,u16 *y); //带加强滤波的双方向坐标读取 u16 ADS_Read_XY(u8 xy); //带滤波的坐标读取(单方向) u16 ADS_Read_AD(u8 CMD); //读取AD转换值 void ADS_Write_Byte(u8 num); //向控制芯片写入一个数据 void Drow_Touch_Point(u8 x,u16 y);//画一个坐标叫准点 void Draw_Big_Point(u8 x,u16 y); //画一个大点 voi
[单片机]
STM32的GPIO介绍及电路图讲解
STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在【STM32】STM32端口复
[单片机]
<font color='red'>STM32</font>的GPIO介绍及电路图讲解
STM32: 一种计算CPU使用率的方法及其实现原理
1前言 出于性能方面的考虑,有的时候,我们希望知道CPU的使用率为多少,进而判断此CPU的负载情况和对于当前运行环境是否足够“胜任”。本文将介绍一种计算CPU占有率的方法以及其实现原理。 2移植算法 2.1 算法简介 此算法是基于操作系统的,理论上不限于任何操作系统,只要有任务调度就可以。本文将以FreeRTOST为例来介绍本算法的使用方法。 本文所介绍的算法出处为随Cube库一起提供的,它在cube库中的位置如下图所示: 本文将以STM32F4为例,测试环境为STM3240G-EVAL评估板。 2.2 开始移植 本文以CubeF4内的示例代码工程STM32Cube_FW_F4_V1.10.0ProjectsSTM324xG_
[单片机]
<font color='red'>STM32</font>: 一种计算CPU使用率的方法及其实现原理
STM32的时钟系统
STM32(CORETEX-M3)有5中时钟源:HSI、HSE、LSI、LSE、PLL (1)HSI是高速内部时钟,又叫RC振荡器,晶振频率为8MHZ,精确度不高。 (2)HSE是高速外部时钟,可接石英、陶瓷谐振器;也可接如外部时钟信号,范围为4-16MHZ。 (3)LSI是低速内部时钟,RC振荡器,频率为40KHZ,提供低功耗时钟。 (4)LSE是低速外部时钟,外接频率为32.768KHZ石英晶体。 PLL为锁相环倍频输出,其时钟输入源可为HSI、HSE、HSE/2。倍频可选择2~16倍,最大不超过76MHZ。 sysclk的时钟来源:HSI、HSE、PLL 实时时钟 stm32的实时时钟是一个独立的定时器,这个定时器可以连
[单片机]
<font color='red'>STM32</font>的时钟系统
STM32】5分钟了解STM32的串口通信
一、串口通信简介 1.1 百度百科解释 来源百度百科 串行接口是一种可以将接收来自CPU的并行数据字符转换为连续的串行数据流发送出去,同时可将接收的串行数据流转换为并行的数据字符供给CPU的器件。一般完成这种功能的电路,我们称为串行接口电路。 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节的通信方式。 1.2 通信接口 1.3 串口通信分类 ▲ 全双工、半双工和单工 1.4 STM32串行通信的通信方式 插播一条反爬虫信息,读者可以忽略: 二、STM32的串口通信 ▲ USART 功能框图 2.1 功能引脚 TX: 发送数据输出引
[单片机]
【<font color='red'>STM32</font>】5分钟了解<font color='red'>STM32</font>的串口通信
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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