准备工作
- 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;
}