14894|2

3

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

STM32F4 SPI+DMA 控制显示屏 [复制链接]

1、我用SPI+DMA方式控制显示屏、发送数据给显示屏、单步调试正常、全速的时候显示少像素。
此帖出自stm32/stm8论坛

最新回复

  详情 回复 发表于 2014-8-25 20:58
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
void SPI_DMA_Config(void)
{
                /*##-3- Configure the DMA streams ##########################################*/
  /* Configure the DMA handler for Transmission process */
        //RCC_AHB1PeriphClockCmd(RCC_AHB1ENR_DMA1EN, ENABLE);
        __DMA1_CLK_ENABLE() ;
        HAL_DMA_DeInit(&hdma_tx);
  hdma_tx.Instance                 = SPI2_TX_DMA_STREAM;
  hdma_tx.Init.Channel             = SPI2_TX_DMA_CHANNEL;    //éèÖÃí¨μà
        hdma_tx.Init.PeripheralBaseAddr  = (uint32_t)SPI2_DR_Addr;//&SPI2->DR;
        hdma_tx.Init.Memory0BaseAddr     = (uint32_t)&LCDValue[0];
       
        hdma_tx.Init.BufferSize          = DMA_LEN;                      //128*64
  hdma_tx.Init.Direction           = DMA_MEMORY_TO_PERIPH;   //éèÖÃ′«êä·½Ïò
  hdma_tx.Init.PeriphInc           = DMA_PINC_DISABLE;      //íaéèμØÖ·Ôöá¿
  hdma_tx.Init.MemInc              = DMA_MINC_ENABLE;        //Äú′æμØÖ·Ôöá¿
  hdma_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE;    //íaéè′«êä¿í′ø
  hdma_tx.Init.MemDataAlignment    = DMA_MDATAALIGN_BYTE;    //Äú′æ′«êä¿í′ø
  hdma_tx.Init.Mode                = DMA_NORMAL;             //′«êä·½ê½
  hdma_tx.Init.Priority            = DMA_PRIORITY_LOW; //DMA_PRIORITY_HIGH; DMA_PRIORITY_MEDIUM;//      //ÖD¶Ï·½ê½:¸ß
  hdma_tx.Init.FIFOMode            = DMA_FIFOMODE_DISABLE;         
  hdma_tx.Init.FIFOThreshold       = DMA_FIFO_THRESHOLD_FULL;
  hdma_tx.Init.MemBurst            = DMA_MBURST_SINGLE;//DMA_MBURST_INC4;
  hdma_tx.Init.PeriphBurst         = DMA_PBURST_SINGLE;//DMA_PBURST_INC4;
  HAL_DMA_Init(&hdma_tx);   
        //
//       
//       
  HAL_NVIC_SetPriority(SPI2_DMA_TX_IRQn, 15, 15);
  HAL_NVIC_EnableIRQ(SPI2_DMA_TX_IRQn);
        __HAL_DMA_ENABLE_IT(&hdma_tx, DMA_IT_TC);
        SPI_I2S_DMACmd(LCD_SPI,SPI_CR2_TXDMAEN,ENABLE);
        DMA_Cmd(DMA1_Stream4,ENABLE);
}

void Spi_Init(void)
{
        HAL_SPI_MspInit(&Spi_InitStru);
       
         /*##-1- Configure the SPI peripheral #######################################*/
  /* Set the SPI parameters */
        RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, ENABLE);
    /* Release SPI1 from reset state */
  RCC_APB1PeriphResetCmd(RCC_APB1Periph_SPI2, DISABLE);
  Spi_InitStru.Instance               = LCD_SPI;
  Spi_InitStru.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4;
  Spi_InitStru.Init.Direction         = SPI_DIRECTION_2LINES;
  Spi_InitStru.Init.CLKPhase          = SPI_PHASE_1EDGE;
  Spi_InitStru.Init.CLKPolarity       = SPI_POLARITY_LOW;
  Spi_InitStru.Init.CRCCalculation    = SPI_CRCCALCULATION_DISABLED;
  Spi_InitStru.Init.CRCPolynomial     = 7;
  Spi_InitStru.Init.DataSize          = SPI_DATASIZE_8BIT;
  Spi_InitStru.Init.FirstBit          = SPI_FIRSTBIT_MSB;
  Spi_InitStru.Init.NSS               = SPI_NSS_SOFT;
  Spi_InitStru.Init.TIMode            = SPI_TIMODE_DISABLED;
  Spi_InitStru.Init.Mode = SPI_MODE_MASTER;
  HAL_SPI_Init(&Spi_InitStru);
  //__HAL_SPI_ENABLE_IT(&Spi_InitStru,SPI_CR2_TXDMAEN);       
        //SPI_I2S_DMACmd(LCD_SPI,SPI_CR2_TXDMAEN,ENABLE);
        __HAL_SPI_ENABLE(&Spi_InitStru);
        //__HAL_SPI_ENABLE_IT();
        SPI_DMA_Config();
}

uint8_t LCD_SPI_SendData(uint8_t da)
{
//    while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
//    SPI_I2S_SendData(SPI2,da);
//       
//          while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_RXNE)==RESET)
//                        ;
//       
//    return SPI_I2S_ReceiveData(SPI2);
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
         LCDValue[0]=da;
         hdma_tx.Instance->NDTR =1;
        DMA_Cmd(DMA1_Stream4,ENABLE);
        //LCD_DMATXBuffer(1);
}
uint8_t LCD_SPI_SendString(uint8_t *buf,uint8_t len)
{
//        memcpy(LCDValue,buf,len);
        uint8_t i=0;
        while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_TXE)==RESET);
        for(i=0;i         {
                LCDValue[i]=*buf++;
        }
        hdma_tx.Instance->NDTR =(uint32_t) len;
        DMA_Cmd(DMA1_Stream4,ENABLE);
        //LCDValue[i++]=0;
        //LCD_DMATXBuffer(len+1);
}
void SPI2_DMA_TX_IRQHandler()
{
  /* Transfer Complete Interrupt management ***********************************/
  if(__HAL_DMA_GET_FLAG(&hdma_tx, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_tx)) != RESET)
  {
    if(__HAL_DMA_GET_IT_SOURCE(&hdma_tx, DMA_IT_TC) != RESET)
    {
      if(((hdma_tx.Instance->CR) & (uint32_t)(DMA_SxCR_DBM)) != 0)
      {
        /* Clear the transfer complete flag */
        __HAL_DMA_CLEAR_FLAG(&hdma_tx, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_tx));

        /* Current memory buffer used is Memory 1 */
        if((hdma_tx.Instance->CR & DMA_SxCR_CT) == 0)
        {
          if(hdma_tx.XferM1CpltCallback != NULL)
          {
            /* Transfer complete Callback for memory1 */
            hdma_tx.XferM1CpltCallback(&hdma_tx);
          }
        }
        /* Current memory buffer used is Memory 0 */
        else if((hdma_tx.Instance->CR & DMA_SxCR_CT) != 0)
        {
          if(hdma_tx.XferCpltCallback != NULL)
          {
            /* Transfer complete Callback for memory0 */
            hdma_tx.XferCpltCallback(&hdma_tx);
          }
        }
      }
      /* Disable the transfer complete interrupt if the DMA mode is not CIRCULAR */
      else
      {
        if((hdma_tx.Instance->CR & DMA_SxCR_CIRC) == 0)
        {
          /* Disable the transfer complete interrupt */
        //  __HAL_DMA_DISABLE_IT(&hdma_tx, DMA_IT_TC);
        }
        /* Clear the transfer complete flag */
        __HAL_DMA_CLEAR_FLAG(&hdma_tx, __HAL_DMA_GET_TC_FLAG_INDEX(&hdma_tx));

        /* Update error code */
        hdma_tx.ErrorCode |= HAL_DMA_ERROR_NONE;

        /* Change the DMA state */
        hdma_tx.State = HAL_DMA_STATE_READY_MEM0;

        /* Process Unlocked */
        __HAL_UNLOCK(&hdma_tx);      

        if(hdma_tx.XferCpltCallback != NULL)
        {
          /* Transfer complete callback */
       //   hdma_tx.XferCpltCallback(&hdma_tx);
        }
                                DMA_Cmd(DMA1_Stream4,DISABLE);
      }
    }
  }
}
此帖出自stm32/stm8论坛
 
 

回复

34

帖子

1

TA的资源

一粒金砂(初级)

板凳
 
此帖出自stm32/stm8论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

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