F407如何实现调用DMA进行flash的数据传输

2019-07-20 14:06发布

本帖最后由 Eternal单人行 于 2017-6-8 16:20 编辑

根据原子哥的模板进行了修改,但没任何反馈数据,求大神们指点怎么使用SPI1与DMA的数据传递
[mw_shl_code=c,true]DMAPtoM_Config(DMA2_Stream3,DMA_Channel_3,(u32)&SPI1->DR,(u32)&DMA_Buffer,12);
DMAPtoM_Config(DMA2_Stream7,DMA_Channel_4,(u32)&USART1->DR,(u32)&DMA_Buffer,12);

W25QXX_CS=0;
SPI1_ReadWriteByte_flash(W25X_ReadData);
while(1)
                        {
                                if(DMA_GetFlagStatus(DMA2_Stream3,DMA_FLAG_TCIF3)!=RESET)
                                {
                                        DMA_ClearFlag(DMA2_Stream3,DMA_FLAG_TCIF3);
                                        break;
                                }
                                
                                W25QXX_CS=1;
                        }
                        USART_DMACmd(USART1,USART_DMAReq_Tx,ENABLE);  
                        MYDMA_Enable(DMA2_Stream7,12);     
                        while(1)
                        {
                                if(DMA_GetFlagStatus(DMA2_Stream7,DMA_FLAG_TCIF7)!=RESET)
                                {
                                        DMA_ClearFlag(DMA2_Stream7,DMA_FLAG_TCIF7);
                                        break;
                                }
                        }[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
Eternal单人行
2019-07-20 17:35
网上看到的,但也不行

[mw_shl_code=c,true]void SPI1_DMA_Config(u32 mar,u16 ndtr)
{
        DMA_InitTypeDef DMA_InitStructure;
        /**DMA2_Stream2 ,DMA2_Channel3 SPI RX**/
        DMA_DeInit(DMA2_Stream2);
        DMA_InitStructure.DMA_Channel=DMA_Channel_3;
        DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&SPI1->DR;//DMAíaéèμØÖ·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′æ′¢Æ÷0μØÖ·
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//íaéèμ½′æ′¢Æ÷
  DMA_InitStructure.DMA_BufferSize = ndtr;//êy¾Y′«êäá¿
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·ÇÔöá¿Ä£ê½
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′æ′¢Æ÷Ôöá¿Ä£ê½
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//íaéèêy¾Y3¤¶è:8λ
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//′æ′¢Æ÷êy¾Y3¤¶è:8λ
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ê1óÃÆÕí¨Ä£ê½
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//¸ßμèóÅÏ輶
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′æ′¢Æ÷í»·¢μ¥′Î′«êä
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí»·¢μ¥′Î′«êä
  DMA_Init(DMA2_Stream2, &DMA_InitStructure);//3õê¼»ˉDMA Stream

        DMA_ITConfig(DMA2_Stream2, DMA_IT_TC, ENABLE);
        /* Enable SPI1 DMA RX request */
        SPI1->CR2 |= 1<<0;                                                                 //&#189;óê&#213;&#187;o3&#229;&#199;&#248;DMAê1&#196;ü
        DMA_Cmd(DMA2_Stream2, ENABLE);

        /**DMA2_Stream3 ,DMA2_Channel3 SPI TX**/
        DMA_DeInit(DMA2_Stream3);
        DMA_InitStructure.DMA_Channel=DMA_Channel_3;
        DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&SPI1->DR;//DMAíaéèμ&#216;&#214;·
  DMA_InitStructure.DMA_Memory0BaseAddr = mar;//DMA ′&#230;′¢&#198;÷0μ&#216;&#214;·
  DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//′&#230;′¢&#198;÷μ&#189;íaéè
  DMA_InitStructure.DMA_BufferSize = ndtr;//êy&#190;Y′&#171;ê&#228;á&#191;
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//íaéè·&#199;&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//íaéèêy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//′&#230;′¢&#198;÷êy&#190;Y3¤&#182;è:8&#206;&#187;
  DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;// ê1ó&#195;&#198;&#213;í¨&#196;£ê&#189;
  DMA_InitStructure.DMA_Priority = DMA_Priority_VeryHigh;//&#184;&#223;μèó&#197;&#207;è&#188;&#182;
  DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;         
  DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_Full;
  DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//′&#230;′¢&#198;÷í&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//íaéèí&#187;·¢μ¥′&#206;′&#171;ê&#228;
  DMA_Init(DMA2_Stream3, &DMA_InitStructure);//3&#245;ê&#188;&#187;ˉDMA Stream
       
        DMA_ITConfig(DMA2_Stream3, DMA_IT_TC, ENABLE);                                   //?? DMA1_Channel3 ??????
        DMA_ITConfig(DMA2_Stream3, DMA_IT_TE, ENABLE);                                   //?? DMA1_Channel3 ??????
        /* Enable SPI1 DMA TX request */
        SPI1->CR2 |= 1<<1;                                                                //?????DMA??
        DMA_Cmd(DMA2_Stream3, DISABLE);                                                  //?? DMA ?? DMA1_Channel3

}

/******************************************
*oˉêy&#195;&#251;£oSPI1_Send
*1|  &#196;ü£oSPIμ&#196;DMA·&#189;ê&#189;·¢&#203;í
*ê&#228;  è&#235;£o&#196;ú′&#230;μ&#216;&#214;·buff,′&#171;ê&#228;×&#214;&#189;ú3¤&#182;èlen
*ê&#228;  3&#246;£o&#206;T
*******************************************/
void SPI1_Send( u8 *buff, u32 len )
{
    DMA2_Stream3->PAR = SPI1->DR;                                                        //íaéèμ&#216;&#214;·
    DMA2_Stream3->M0AR = (u32)buff;                                                //&#196;ú′&#230;μ&#216;&#214;·
    DMA2_Stream3->NDTR = len ;                                                                 //′&#171;ê&#228;3¤&#182;è
    DMA2_Stream3->CR = (0 << 14) |                                                 // ·&#199;′&#230;′¢&#198;÷μ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;
            (2 << 12) |                                                                                         // í¨μàó&#197;&#207;è&#188;&#182;&#184;&#223;
            (0 << 11) |                                                                                         // ′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è8bit
            (0 << 10) |                                                                                         // ′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è8bit
            (0 <<  9) |                                                                                         // íaéèêy&#190;Y&#191;í&#182;è8bit
            (0 <<  8) |                                                                                         // íaéèêy&#190;Y&#191;í&#182;è8bit
            (1 <<  7) |                                                                                         // ′&#230;′¢&#198;÷μ&#216;&#214;·&#212;&#246;á&#191;&#196;£ê&#189;
            (0 <<  6) |                                                                                         // íaéèμ&#216;&#214;·&#212;&#246;á&#191;&#196;£ê&#189;(2&#187;&#212;&#246;)
            (0 <<  5) |                                                                                         // ·&#199;&#209;-&#187;·&#196;£ê&#189;
            (1 <<  4) |                                                                                         // ′&#171;ê&#228;·&#189;ê&#189; &#196;ú′&#230;->íaéè
            (1 <<  3) |                                                                                         // &#212;êDí′&#171;ê&#228;′í&#206;ó&#214;D&#182;&#207;
            (0 <<  2) |                                                                                         // &#212;êDí°&#235;′&#171;ê&#228;&#214;D&#182;&#207;
            (1 <<  1) |                                                                                         // &#212;êDí′&#171;ê&#228;íê3é&#214;D&#182;&#207;
            (1);                                                                                                // í¨μà&#191;a&#198;&#244;
}


/******************************************
*oˉêy&#195;&#251;£oSPI1_Recive
*1|  &#196;ü£oSPIμ&#196;DMA·&#189;ê&#189;&#189;óê&#213;
*ê&#228;  è&#235;£o&#196;ú′&#230;μ&#216;&#214;·buff,′&#171;ê&#228;×&#214;&#189;ú3¤&#182;èlen
*ê&#228;  3&#246;£o&#206;T
*******************************************/
void SPI1_Recive( u8 *buff, u32 len )
{
    DMA2_Stream2->CR &= ~( 1 << 0 );          //1&#216;±&#213;êy&#190;Yá÷2
                DMA2_Stream2->PAR = SPI1->DR;                                                        //íaéèμ&#216;&#214;·
    DMA2_Stream2->M0AR = (u32)buff;                                                //&#196;ú′&#230;μ&#216;&#214;·
    DMA2_Stream2->NDTR = len ;                                                                 //′&#171;ê&#228;3¤&#182;è
    DMA2_Stream2->CR = (0 << 14) |                                                 // ·&#199;′&#230;′¢&#198;÷μ&#189;′&#230;′¢&#198;÷&#196;£ê&#189;
            (2 << 12) |                                                                                         // í¨μàó&#197;&#207;è&#188;&#182;&#184;&#223;
            (0 << 11) |                                                                                         // ′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è8bit
            (0 << 10) |                                                                                         // ′&#230;′¢&#198;÷êy&#190;Y&#191;í&#182;è8bit
            (0 <<  9) |                                                                                         // íaéèêy&#190;Y&#191;í&#182;è8bit
            (0 <<  8) |                                                                                         // íaéèêy&#190;Y&#191;í&#182;è8bit
            (1 <<  7) |                                                                                         // ′&#230;′¢&#198;÷μ&#216;&#214;·&#212;&#246;á&#191;&#196;£ê&#189;
            (0 <<  6) |                                                                                         // íaéèμ&#216;&#214;·&#212;&#246;á&#191;&#196;£ê&#189;(2&#187;&#212;&#246;)
            (0 <<  5) |                                                                                         // ·&#199;&#209;-&#187;·&#196;£ê&#189;
            (0 <<  4) |                                                                                         // ′&#171;ê&#228;·&#189;ê&#189; íaéè->&#196;ú′&#230;
            (0 <<  3) |                                                                                         // &#212;êDí′&#171;ê&#228;′í&#206;ó&#214;D&#182;&#207;
            (0 <<  2) |                                                                                         // &#212;êDí°&#235;′&#171;ê&#228;&#214;D&#182;&#207;
            (1 <<  1) |                                                                                         // &#212;êDí′&#171;ê&#228;íê3é&#214;D&#182;&#207;
            (1);                                                                                                // í¨μà&#191;a&#198;&#244;
}[/mw_shl_code]

一周热门 更多>