stm32f4 SPI DMA FLASH 传输调试

来源:项目中需要用stm32对外部spi flash(m25p16  2MB)进行快速读取,主要是图像数据。

平台:stm32f407---168MHz,FreeRTOS V7.3.0 

主要参考:http://blog.csdn.net/sinat_20598829/article/details/44408125

貌似发现了其中的一个小问题,未使用中断!!!见图

期间还参考帖子:http://blog.csdn.net/chenwei2002/article/details/49722373,本人不才,未能实现文中使用的方法。对于文中所讲:我们把SPI模式配置成只读模式,如上面程序中的样子,这个时候就可以直接读取数据,而不需要在发送无效数据0xff,大大提高了性能。SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_RxOnly; 然而在配置为只读模式后没有spi时钟驱动flash进行数据输出,故放弃此方法。

代码来源:st 官方spi flash驱动文件

(STM32F4xx_DSP_StdPeriph_Lib_V1.4.0\Project\STM32F4xx_StdPeriph_Examples\SPI\SPI_FLASH)

在官方文件的基础上进行修改(注意修改红色部分):

/**
  ******************************************************************************
  *
  *          +-----------------------------------------------------------+
  *          |                     Pin assignment                        |
  *          +-----------------------------+---------------+-------------+
  *          |  STM32 SPI Pins             |     sFLASH    |    Pin      |
  *          +-----------------------------+---------------+-------------+
  *          | sFLASH_CS_PIN               | ChipSelect(/S)|    1        |
  *          | sFLASh_SPI_MISO_PIN / MISO  |   DataOut(Q)  |    2        |
  *          |                             |   VCC         |    3 (3.3 V)|
  *          |                             |   GND         |    4 (0 V)  |
  *          | sFLASH_SPI_MOSI_PIN / MOSI  |   DataIn(D)   |    5        |
  *          | sFLASH_SPI_SCK_PIN / SCK    |   Clock(C)    |    6        |
  *          |                             |    VCC        |    7 (3.3 V)|
  *          |                             |    VCC        |    8 (3.3 V)|
  *          +-----------------------------+---------------+-------------+
  ******************************************************************************
  * @attention
  * 
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "spi_dma_flash.h"
#include <stdio.h>
/** @addtogroup STM32F4xx_StdPeriph_Examples
  * @{
  */

/** @addtogroup SPI_FLASH
  * @{
  */

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define USE_SPI_DMA
#define SET_SPI1_ENABLE     SPI_Cmd(sFLASH_DMA_SPI, ENABLE);

#define DMA2_TX_STREAM      DMA2_Stream3
#define DMA2_TX_CHANNEL     DMA_Channel_3

#define DMA2_RX_STREAM      DMA2_Stream0
#define DMA2_RX_CHANNEL     DMA_Channel_3

/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/

static DMA_InitTypeDef DMA2_Tx_InitStructure;
static DMA_InitTypeDef DMA2_Rx_InitStructure;
/* Private function prototypes -----------------------------------------------*/
void sFLASH_DMA_LowLevel_DeInit(void);
void sFLASH_DMA_LowLevel_Init(void);

/* Private functions ---------------------------------------------------------*/

/**
  * @brief  DeInitializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void sFLASH_DMA_DeInit(void)
{
  sFLASH_DMA_LowLevel_DeInit();
}

/**
  * @brief  Initializes the peripherals used by the SPI FLASH driver.
  * @param  None
  * @retval None
  */
void sFLASH_DMA_Init(void)
{
  SPI_InitTypeDef  SPI_InitStructure;
    
  sFLASH_DMA_LowLevel_Init();

  /*!< Deselect the FLASH: Chip Select high */
  sFLASH_DMA_CS_HIGH();

  /*!< SPI 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_2;

  SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;
  SPI_InitStructure.SPI_CRCPolynomial = 7;
  
 
  DMA_Configuration_SPI1();
  SPI_Init(sFLASH_DMA_SPI, &SPI_InitStructure); 
  SET_SPI1_ENABLE;

}

/**
  * @brief  Erases the specified FLASH sector.
  * @param  SectorAddr: address of the sector to erase.
  * @retval None
  */
void sFLASH_DMA_EraseSector(uint32_t SectorAddr)
{
  /*!< Send write enable instruction */
  sFLASH_DMA_WriteEnable();

  /*!< Sector Erase */
  /*!< Select the FLASH: Chip Select low */
  sFLASH_DMA_CS_LOW();
  /*!< Send Sector Erase instruction */
  sFLASH_DMA_SendByte(sFLASH_DMA_CMD_SE);
  /*!< Send SectorAddr high nibble address byte */
  sFLASH_DMA_SendByte((SectorAddr & 0xFF0000) >> 16);
  /*!< Send SectorAddr medium nibble address byte */
  sFLASH_DMA_SendByte((SectorAddr & 0xFF00) >> 8);
  /*!< Send SectorAddr low nibble address byte */
  sFLASH_DMA_SendByte(SectorAddr & 0xFF);
  /*!< Deselect the FLASH: Chip Select high */
  sFLASH_DMA_CS_HIGH();

  /*!< Wait the end of Flash writing */
  sFLASH_DMA_WaitForWriteEnd();
}

/**
  * @brief  Erases the entire FLASH.
  * @param  None
  * 
  • 3
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值