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

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

?? spi_flash.c

?? STM32F10x USB Library V1.0
?? 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一区二区三区免费野_久草精品视频
2020日本不卡一区二区视频| 久久久久综合网| 亚洲精品视频在线| 97久久精品人人澡人人爽| 国产欧美日韩精品在线| 国产美女精品人人做人人爽| 精品日韩欧美在线| 精东粉嫩av免费一区二区三区| 日韩美女一区二区三区| 久久av资源网| 久久综合网色—综合色88| 九九视频精品免费| 精品国产91久久久久久久妲己| 久99久精品视频免费观看| 亚洲精品一区二区三区福利 | 老司机免费视频一区二区| 91精品国产综合久久蜜臀| 日本不卡视频在线观看| 日韩欧美一二三四区| 精品写真视频在线观看| 久久女同精品一区二区| 粉嫩av亚洲一区二区图片| 中文字幕日韩精品一区| 在线视频观看一区| 亚洲h在线观看| 正在播放一区二区| 久久99久久久久久久久久久| 久久影院视频免费| 成人三级伦理片| 最新国产成人在线观看| 欧美亚洲动漫精品| 强制捆绑调教一区二区| 久久久亚洲午夜电影| 成人免费观看av| 亚洲精品中文字幕乱码三区| 欧美三级电影一区| 蜜臀久久99精品久久久画质超高清| 欧美mv和日韩mv国产网站| 国v精品久久久网| 亚洲精品五月天| 在线不卡一区二区| 国产一区二区三区免费在线观看| 一色桃子久久精品亚洲| 欧美日韩另类国产亚洲欧美一级| 麻豆中文一区二区| 国产精品久久久久久户外露出| 在线观看一区日韩| 麻豆精品视频在线观看视频| 国产欧美日韩在线观看| 亚洲欧美日韩国产综合在线| 欧美日韩亚洲丝袜制服| 韩国v欧美v日本v亚洲v| 亚洲视频你懂的| 91麻豆精品91久久久久久清纯| 国产一区二区三区四| 亚洲日韩欧美一区二区在线| 欧美一区二区在线观看| 粉嫩13p一区二区三区| 亚州成人在线电影| 久久在线免费观看| 欧美性猛交xxxxxxxx| 国产麻豆日韩欧美久久| 一区二区高清免费观看影视大全| 制服丝袜日韩国产| 99久久99久久精品免费看蜜桃| 日本亚洲视频在线| 国产精品高潮呻吟| 日韩欧美一级二级三级久久久| av色综合久久天堂av综合| 日韩影院精彩在线| 成人欧美一区二区三区白人| 欧美一卡二卡三卡| 91麻豆福利精品推荐| 极品尤物av久久免费看| 亚洲综合久久久久| 国产欧美一区二区精品仙草咪| 欧美二区乱c少妇| 99国产精品久久久| 精品亚洲免费视频| 亚洲成人资源在线| 国产精品久线观看视频| 日韩女优制服丝袜电影| 日本韩国一区二区| 国产不卡在线视频| 蜜桃av噜噜一区| 亚洲图片欧美综合| 国产精品国产自产拍在线| 欧美哺乳videos| 欧美日韩国产系列| 91丨九色丨尤物| 国产河南妇女毛片精品久久久| 亚洲成av人影院| 亚洲女人****多毛耸耸8| 精品国产免费一区二区三区香蕉| 欧美在线免费播放| 91视频国产观看| 国产99精品国产| 狠狠色狠狠色合久久伊人| 亚洲国产精品久久一线不卡| 亚洲欧洲在线观看av| 国产网站一区二区| 日韩视频一区二区三区| 欧美日韩国产小视频| 在线影院国内精品| 99re成人在线| 成人久久视频在线观看| 国产做a爰片久久毛片| 美女网站视频久久| 日本三级亚洲精品| 丝袜美腿亚洲一区| 亚洲国产毛片aaaaa无费看| 亚洲少妇中出一区| 亚洲同性同志一二三专区| 国产精品网友自拍| 久久久国际精品| 欧美mv日韩mv| 精品国产第一区二区三区观看体验 | 欧美国产一区二区在线观看| 精品盗摄一区二区三区| 日韩午夜激情免费电影| 555www色欧美视频| 欧美一区二区三区白人| 91精品国产综合久久精品图片| 欧美日本韩国一区二区三区视频| 欧美在线你懂得| 在线观看视频欧美| 欧美午夜不卡在线观看免费| 在线一区二区三区四区五区 | 中文字幕一区二区在线观看| 国产日韩欧美在线一区| 日本一区二区免费在线观看视频| 久久久精品黄色| 国产嫩草影院久久久久| 国产精品久久久久久一区二区三区| 国产精品天美传媒| 中文字幕中文乱码欧美一区二区| 亚洲欧洲一区二区在线播放| 亚洲丝袜美腿综合| 亚洲一区二三区| 午夜免费久久看| 日本网站在线观看一区二区三区 | 亚洲午夜免费电影| 图片区小说区区亚洲影院| 日本v片在线高清不卡在线观看| 日韩成人一区二区| 精品无码三级在线观看视频| 国产乱人伦精品一区二区在线观看| 国产激情精品久久久第一区二区| 粉嫩一区二区三区性色av| 91美女福利视频| 欧美日韩国产综合一区二区三区| 日韩一区二区在线看| 欧美sm美女调教| 亚洲国产精品成人综合| 亚洲色大成网站www久久九九| 亚洲综合在线观看视频| 丝袜国产日韩另类美女| 麻豆91在线播放| 国产**成人网毛片九色| 色婷婷综合久久久中文字幕| 欧美日韩精品一区视频| 91精品国产aⅴ一区二区| 精品国产电影一区二区| 国产精品久久99| 午夜精品视频一区| 久久精品国产一区二区三区免费看| 国产剧情一区在线| 91麻豆免费视频| 日韩一卡二卡三卡四卡| 国产丝袜在线精品| 亚洲午夜av在线| 极品少妇xxxx偷拍精品少妇| 成人av在线电影| 精品视频999| 国产视频亚洲色图| 亚洲一区二区高清| 久久se精品一区二区| 91蜜桃婷婷狠狠久久综合9色| 欧美二区在线观看| 中文字幕欧美三区| 香蕉乱码成人久久天堂爱免费| 国产一区二区三区久久久| 色狠狠综合天天综合综合| 精品免费国产二区三区| 国产98色在线|日韩| 欧美三级一区二区| 国产三区在线成人av| 亚洲自拍偷拍麻豆| 国产一区二区三区在线观看免费 | 国产成人免费视频精品含羞草妖精| 色偷偷成人一区二区三区91| 精品卡一卡二卡三卡四在线| 一区二区三区中文字幕精品精品| 美腿丝袜亚洲综合| 91小视频免费看| 久久综合九色综合欧美就去吻| 一区二区三区高清| 国产成人在线免费| 91精品欧美综合在线观看最新| 国产精品免费视频观看|