亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? spi_flash.c

?? stm32單片機的usb程序包
?? C
?? 第 1 頁 / 共 2 頁
字號:
/******************** (C) COPYRIGHT 2007 STMicroelectronics ********************
* File Name          : spi_flash.c
* Author             : MCD Application Team
* Version            : V1.0
* Date               : 10/08/2007
* Description        : This file provides a set of functions needed to manage the
*                      communication between SPI peripheral and SPI M25P64 FLASH.
********************************************************************************
* THE PRESENT SOFTWARE WHICH IS FOR GUIDANCE ONLY AIMS AT PROVIDING CUSTOMERS
* WITH CODING INFORMATION REGARDING THEIR PRODUCTS IN ORDER FOR THEM TO SAVE TIME.
* AS A RESULT, STMICROELECTRONICS SHALL NOT BE HELD LIABLE FOR ANY DIRECT,
* INDIRECT OR CONSEQUENTIAL DAMAGES WITH RESPECT TO ANY CLAIMS ARISING FROM THE
* CONTENT OF SUCH SOFTWARE AND/OR THE USE MADE BY CUSTOMERS OF THE CODING
* INFORMATION CONTAINED HEREIN IN CONNECTION WITH THEIR PRODUCTS.
*******************************************************************************/

/* Includes ------------------------------------------------------------------*/
#include "spi_flash.h"

/* Private typedef -----------------------------------------------------------*/
#define SPI_FLASH_PageSize 256

#define WRITE      0x02  /* Write to Memory instruction */
#define WRSR       0x01  /* Write Status Register instruction */ 
#define WREN       0x06  /* Write enable instruction */

#define READ       0x03  /* Read from Memory instruction */
#define RDSR       0x05  /* Read Status Register instruction  */
#define RDID       0x9F  /* Read identification */
#define SE         0xD8  /* Sector Erase instruction */
#define BE         0xC7  /* Bulk Erase instruction */

#define WIP_Flag   0x01  /* Write In Progress (WIP) flag */

#define Dummy_Byte 0xA5

/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/*******************************************************************************
* Function Name  : SPI_FLASH_Init
* Description    : Initializes the peripherals used by the SPI FLASH driver.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
  GPIO_InitTypeDef GPIO_InitStructure;
   
  /* Enable SPI1 and GPIOA clocks */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1 | 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.4 as Output push-pull, used as Flash Chip select */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
  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_FLASH_CS_HIGH();

  /* 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;
  SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;
  SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;
  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  SPI_Init(SPI1, &SPI_InitStructure);
  
  /* Enable SPI1  */
  SPI_Cmd(SPI1, ENABLE);   
}

/*******************************************************************************
* Function Name  : SPI_FLASH_SectorErase
* Description    : Erases the specified FLASH sector.
* Input          : SectorAddr: address of the sector to erase.
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_SectorErase(u32 SectorAddr)
{
  /* Send write enable instruction */
  SPI_FLASH_WriteEnable();

  /* Sector Erase */ 
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send Sector Erase instruction */
  SPI_FLASH_SendByte(SE);
  /* Send SectorAddr high nibble address byte */
  SPI_FLASH_SendByte((SectorAddr & 0xFF0000) >> 16);
  /* Send SectorAddr medium nibble address byte */
  SPI_FLASH_SendByte((SectorAddr & 0xFF00) >> 8);
  /* Send SectorAddr low nibble address byte */
  SPI_FLASH_SendByte(SectorAddr & 0xFF);
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_BulkErase
* Description    : Erases the entire FLASH.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_BulkErase(void)
{
  /* Send write enable instruction */
  SPI_FLASH_WriteEnable();

  /* Bulk Erase */ 
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send Bulk Erase instruction  */
  SPI_FLASH_SendByte(BE);
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();

  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_PageWrite
* Description    : Writes more than one byte to the FLASH with a single WRITE
*                  cycle(Page WRITE sequence). The number of byte can't exceed
*                  the FLASH page size.
* Input          : - pBuffer : pointer to the buffer  containing the data to be 
*                    written to the FLASH.
*                  - WriteAddr : FLASH's internal address to write to.
*                  - NumByteToWrite : number of bytes to write to the FLASH,
*                    must be equal or less than "SPI_FLASH_PageSize" value. 
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_PageWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
  /* Enable the write access to the FLASH */
  SPI_FLASH_WriteEnable();
  
  /* Select the FLASH: Chip Select low */
  SPI_FLASH_CS_LOW();
  /* Send "Write to Memory " instruction */
  SPI_FLASH_SendByte(WRITE);
  /* Send WriteAddr high nibble address byte to write to */
  SPI_FLASH_SendByte((WriteAddr & 0xFF0000) >> 16);
  /* Send WriteAddr medium nibble address byte to write to */
  SPI_FLASH_SendByte((WriteAddr & 0xFF00) >> 8);  
  /* Send WriteAddr low nibble address byte to write to */
  SPI_FLASH_SendByte(WriteAddr & 0xFF);
  
  /* while there is data to be written on the FLASH */
  while(NumByteToWrite--) 
  {
    /* Send the current byte */
    SPI_FLASH_SendByte(*pBuffer);
    /* Point on the next byte to be written */
    pBuffer++; 
  }
  
  /* Deselect the FLASH: Chip Select high */
  SPI_FLASH_CS_HIGH();
  
  /* Wait the end of Flash writing */
  SPI_FLASH_WaitForWriteEnd();
}

/*******************************************************************************
* Function Name  : SPI_FLASH_BufferWrite
* Description    : Writes block of data to the FLASH. In this function, the
*                  number of WRITE cycles are reduced, using Page WRITE sequence.
* Input          : - pBuffer : pointer to the buffer  containing the data to be 
*                    written to the FLASH.
*                  - WriteAddr : FLASH's internal address to write to.
*                  - NumByteToWrite : number of bytes to write to the FLASH.
* Output         : None
* Return         : None
*******************************************************************************/
void SPI_FLASH_BufferWrite(u8* pBuffer, u32 WriteAddr, u16 NumByteToWrite)
{
  u8 NumOfPage = 0, NumOfSingle = 0, Addr = 0, count = 0, temp = 0;

  Addr = WriteAddr % SPI_FLASH_PageSize;
  count = SPI_FLASH_PageSize - Addr;
  NumOfPage =  NumByteToWrite / SPI_FLASH_PageSize;
  NumOfSingle = NumByteToWrite % SPI_FLASH_PageSize;
  
  if(Addr == 0) /* WriteAddr is SPI_FLASH_PageSize aligned  */
  {
    if(NumOfPage == 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    {
      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumByteToWrite);
    }
    else /* NumByteToWrite > SPI_FLASH_PageSize */ 
    {
      while(NumOfPage--)
      {
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, SPI_FLASH_PageSize);
        WriteAddr +=  SPI_FLASH_PageSize;
        pBuffer += SPI_FLASH_PageSize;  
      }    
     
      SPI_FLASH_PageWrite(pBuffer, WriteAddr, NumOfSingle);
   }
  }
  else /* WriteAddr is not SPI_FLASH_PageSize aligned  */
  {
    if(NumOfPage== 0) /* NumByteToWrite < SPI_FLASH_PageSize */
    {
      if(NumOfSingle > count) /* (NumByteToWrite + WriteAddr) > SPI_FLASH_PageSize */
      {
        temp = NumOfSingle - count;
      
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, count);
        WriteAddr +=  count;
        pBuffer += count; 
        
        SPI_FLASH_PageWrite(pBuffer, WriteAddr, temp);
      }
      else
      {

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲va欧美va人人爽午夜| 亚洲精品高清在线| 亚洲精品久久久蜜桃| 日本成人超碰在线观看| 成人毛片在线观看| 日韩欧美亚洲另类制服综合在线| 成人免费在线播放视频| 麻豆免费看一区二区三区| 一本高清dvd不卡在线观看| 国产色综合久久| 免费人成黄页网站在线一区二区| 99国产精品一区| 国产欧美精品在线观看| 日本不卡免费在线视频| 欧美无砖砖区免费| 亚洲日穴在线视频| 国产成人av一区二区三区在线 | 一区二区在线观看不卡| 国产老妇另类xxxxx| 欧美一二三区精品| 午夜精品久久久久久久久久| 91电影在线观看| 亚洲人快播电影网| 91免费观看视频在线| 国产精品福利一区| av中文一区二区三区| 中文久久乱码一区二区| 国产91精品露脸国语对白| 精品国产一区久久| 麻豆freexxxx性91精品| 日韩视频免费观看高清完整版在线观看 | 久久日一线二线三线suv| 日本午夜一区二区| 欧美一级精品大片| 激情六月婷婷久久| 精品国产乱码久久久久久老虎| 日本三级韩国三级欧美三级| 69av一区二区三区| 麻豆久久久久久久| 久久久91精品国产一区二区三区| 国产精品亚洲人在线观看| 国产午夜精品久久久久久久| 成人开心网精品视频| 国产精品久久夜| 在线观看视频91| 日韩精品一卡二卡三卡四卡无卡| 91精品婷婷国产综合久久| 麻豆精品国产传媒mv男同| 2023国产精品视频| 99精品国产热久久91蜜凸| 亚洲一级二级在线| 欧美电影免费观看高清完整版在线| 久久99国产精品麻豆| 国产精品免费人成网站| 色婷婷久久久久swag精品| 天堂久久久久va久久久久| 精品欧美一区二区三区精品久久 | 亚洲国产精品天堂| 日韩欧美资源站| 丁香婷婷深情五月亚洲| 亚洲综合色噜噜狠狠| 日韩欧美123| jlzzjlzz亚洲日本少妇| 亚洲大片在线观看| 久久亚洲欧美国产精品乐播| 91蝌蚪porny九色| 欧美aaa在线| 综合自拍亚洲综合图不卡区| 欧美性生活久久| 国产精品一级片在线观看| 亚洲激情av在线| 欧美精品一区二区三区高清aⅴ| caoporm超碰国产精品| 日本美女一区二区三区视频| 国产精品毛片无遮挡高清| 91精品国产乱| 色综合天天做天天爱| 激情久久五月天| 午夜精品国产更新| 国产精品视频一二三区| 日韩精品一区二区在线观看| 色综合一个色综合亚洲| 国产乱对白刺激视频不卡| 五月婷婷激情综合| 椎名由奈av一区二区三区| 亚洲精品一区二区三区精华液| 色激情天天射综合网| 粉嫩蜜臀av国产精品网站| 蜜桃视频一区二区三区 | 日韩精品1区2区3区| 国产精品久久久久永久免费观看 | 欧美美女网站色| 91在线免费看| 丁香婷婷深情五月亚洲| 激情六月婷婷综合| 久久激五月天综合精品| 天堂蜜桃91精品| 亚洲成a人片在线观看中文| 综合av第一页| 中文字幕一区二区三区四区| 久久久久国产一区二区三区四区 | 精品视频在线看| 色综合久久99| 色综合久久中文字幕综合网| 成人免费毛片app| 国产成人在线观看| 国产精品中文字幕日韩精品| 久久成人免费电影| 麻豆精品视频在线观看| 精品综合免费视频观看| 蜜桃视频一区二区| 九色综合国产一区二区三区| 久久99精品久久久久| 开心九九激情九九欧美日韩精美视频电影| 亚洲va韩国va欧美va| 亚洲成人av资源| 天堂在线亚洲视频| 久久精品理论片| 国产一区二区主播在线| 国产一区二区三区香蕉| 国产综合成人久久大片91| 国产经典欧美精品| 国产91对白在线观看九色| caoporm超碰国产精品| 91小宝寻花一区二区三区| 91福利视频网站| 91精品欧美久久久久久动漫| 日韩精品中文字幕一区二区三区 | 国产精品一区二区91| 国产成人高清在线| 色婷婷综合在线| 欧美人体做爰大胆视频| 日韩视频一区二区在线观看| 久久久.com| 亚洲一二三区视频在线观看| 亚洲444eee在线观看| 久久激情五月激情| www.激情成人| 欧美精品乱码久久久久久按摩 | 国产真实乱子伦精品视频| 国产激情一区二区三区| 91猫先生在线| 精品国产伦理网| 日韩毛片高清在线播放| 婷婷综合五月天| 国产成人av一区二区三区在线观看| 一本一道久久a久久精品| 欧美一二三区在线| 1024国产精品| 青青草精品视频| 成人免费视频网站在线观看| 6080午夜不卡| 中文字幕在线不卡| 蜜臀a∨国产成人精品| 一本久久a久久免费精品不卡| 欧美zozo另类异族| 一区二区三区精品视频| 久久成人av少妇免费| 91国偷自产一区二区三区观看 | 日韩三级精品电影久久久| 国产精品视频在线看| 日本欧美韩国一区三区| 99久久精品99国产精品| 精品欧美一区二区久久| 亚洲一区二区视频| 国产成人免费9x9x人网站视频| 欧美酷刑日本凌虐凌虐| 国产精品护士白丝一区av| 精品在线观看免费| 欧美二区三区91| 一区二区三区在线观看动漫| 国产麻豆精品theporn| 91精品国产综合久久婷婷香蕉| 中文字幕一区三区| 国产精品18久久久久久久网站| 7777精品伊人久久久大香线蕉| 综合av第一页| 成人精品gif动图一区| 精品国产123| 另类欧美日韩国产在线| 911精品国产一区二区在线| 亚洲乱码国产乱码精品精可以看| 国产1区2区3区精品美女| 精品国产百合女同互慰| 蜜臀av亚洲一区中文字幕| 欧美精品成人一区二区三区四区| 亚洲另类在线一区| www.欧美.com| 亚洲视频一二区| 91在线国内视频| 中文字幕视频一区| www.视频一区| 中文字幕不卡在线| 成人午夜碰碰视频| 中文字幕av一区二区三区高| 国产91对白在线观看九色| 中日韩免费视频中文字幕| 99精品国产热久久91蜜凸| 亚洲青青青在线视频| 91麻豆精东视频|