华大单片机HC32F460开发

Viewed 6

准备工作

  • DDL库:HC32F460_DDL_Rev3.2.0

DMA开发注意事项

  • DMA每次传输完成后需要重新设置源地址和目标地址,如果是递增或者递减模式

通过DMA发送SPI数据

初始化,一定要注意中断号DMA_TX_IRQ_NUM不要和其他的中断定义冲突

/* DMA definition */
#define DMA_UNIT                        (CM_DMA1)
#define DMA_CLK                         (FCG0_PERIPH_DMA1 | FCG0_PERIPH_AOS)
#define DMA_TX_CH                       (DMA_CH0)
#define DMA_TX_TRIG_CH                  (AOS_DMA1_0)
#define DMA_TX_INT_CH                   (DMA_INT_TC_CH0)
#define DMA_TX_INT_SRC                  (INT_SRC_DMA1_TC0)
#define DMA_TX_IRQ_NUM                  (INT006_IRQn)
#define SPI_TX_EVT_SRC                  (EVT_SRC_SPI2_SPTI)

static void DMA_TransCompleteCallback(void)
{
    DMA_ClearTransCompleteStatus(DMA_UNIT, DMA_TX_INT_CH);
    enRxCompleteFlag = true;
}

void LCD_ST7789_gpio_dma_init()
{
    stc_dma_init_t stcDmaInit;
    stc_irq_signin_config_t stcIrqSignConfig;
    /* DMA configuration */
    FCG_Fcg0PeriphClockCmd(DMA_CLK, ENABLE);
    (void)DMA_StructInit(&stcDmaInit);
    stcDmaInit.u32IntEn       = DMA_INT_ENABLE;
    stcDmaInit.u32BlockSize  = 1UL;
    stcDmaInit.u32TransCount = EXAMPLE_SPI_BUF_LEN;
    stcDmaInit.u32DataWidth  = DMA_DATAWIDTH_8BIT;
    /* Configure TX */
    stcDmaInit.u32SrcAddrInc  = DMA_SRC_ADDR_INC;
    stcDmaInit.u32DestAddrInc = DMA_DEST_ADDR_FIX;
    stcDmaInit.u32SrcAddr     = (uint32_t)(0);
    stcDmaInit.u32DestAddr    = (uint32_t)(&SPI_UNIT->DR);
    if (LL_OK != DMA_Init(DMA_UNIT, DMA_TX_CH, &stcDmaInit)) {
        for (;;) {
        }
    }
    AOS_SetTriggerEventSrc(DMA_TX_TRIG_CH, SPI_TX_EVT_SRC);

    /* DMA receive NVIC configure */
    stcIrqSignConfig.enIntSrc    = DMA_TX_INT_SRC;
    stcIrqSignConfig.enIRQn      = DMA_TX_IRQ_NUM;
    stcIrqSignConfig.pfnCallback = &DMA_TransCompleteCallback;
    (void)INTC_IrqSignIn(&stcIrqSignConfig);
    NVIC_ClearPendingIRQ(stcIrqSignConfig.enIRQn);
    NVIC_SetPriority(stcIrqSignConfig.enIRQn, DDL_IRQ_PRIO_DEFAULT);
    NVIC_EnableIRQ(stcIrqSignConfig.enIRQn);

    /* Enable DMA and channel */
    DMA_Cmd(DMA_UNIT, ENABLE);
    DMA_ChCmd(DMA_UNIT, DMA_TX_CH, ENABLE);
}

发送数据

uint8_t LCD_ST7789SpiDma_wBuffer(uint8_t *pData, uint16_t len)
{
    enRxCompleteFlag = false;
    SPI_Cmd(SPI_UNIT, DISABLE);
    DMA_ChCmd(DMA_UNIT, DMA_TX_CH, DISABLE);
    DMA_SetSrcAddr(DMA_UNIT, DMA_TX_CH, (uint32_t)pData);
    DMA_SetTransCount(DMA_UNIT, DMA_TX_CH, len);
    /* Enable DMA channel */
    DMA_ChCmd(DMA_UNIT, DMA_TX_CH, ENABLE);
    
    /* Enable SPI */
    SPI_Cmd(SPI_UNIT, ENABLE);
    /* Waiting for completion */
    while (RESET == enRxCompleteFlag) {
    }

    return 1;
}
0 Answers
Related