本帖最后由 Sam131208 于 2023-7-7 15:12 编辑
如下图,传输数据到DAC,用tim2做触发,tim2比较中断24KHZ, tim2比较中断正常进入。但是DMA中断一直没有。 换了DMA软件触发就正常了。
static void start_dma(en_dma_channel_t ch, const void *src, const void *dst, uint16_t blk_size)
{
stc_dma_cfg_t DmaInitStruct;
Sysctrl_SetPeripheralGate(SysctrlPeripheralDma, TRUE); ///< 使能DMA模块的外设时钟
DDL_ZERO_STRUCT(DmaInitStruct); //结构体变量值清零
DmaInitStruct.enMode = DmaMskBlock; ///< 选择块传输
DmaInitStruct.u16BlockSize = 1; ///< 块传输个数
DmaInitStruct.u16TransferCnt = blk_size; ///< 块传输次数,一次传输数据大小为 块传输个数*BUFFER_SIZE
DmaInitStruct.enTransferWidth = DmaMsk16Bit; ///< 传输数据的宽度,此处选择字(16Bit)宽度
DmaInitStruct.enSrcAddrMode = DmaMskSrcAddrInc; ///< 源地址自增
DmaInitStruct.enDstAddrMode = DmaMskDstAddrFix; ///< 目的地址自增
DmaInitStruct.enDestAddrReloadCtl = DmaMskDstAddrReloadDisable; ///< 禁止重新加载传输目的地址
DmaInitStruct.enSrcAddrReloadCtl = DmaMskSrcAddrReloadDisable; ///< 使能重新加载传输源地址
DmaInitStruct.enSrcBcTcReloadCtl = DmaMskBcTcReloadDisable; ///< 使能重新加载BC/TC值
DmaInitStruct.u32SrcAddress = (uint32_t)src; ///< 源地址
DmaInitStruct.u32DstAddress = (uint32_t)dst; ///< 目标地址:DAC_DHR12R0
DmaInitStruct.enRequestNum = DmaTIM2ATrig; ///< 设置TIM2A触发
DmaInitStruct.enTransferMode = DmaMskOneTransfer; ///< 传输一次,DMAC传输完成时清除CONFA:ENS位
DmaInitStruct.enPriority = DmaMskPriorityFix; ///< 各通道固定优先级,CH0优先级 > CH1优先级
Dma_InitChannel(ch,&DmaInitStruct); ///< 初始化dma通道0
Dma_EnableChannelIrq(ch); //传输成功完成时产生中断
EnableNvic(DMAC_IRQn,IrqLevel3,TRUE); //NVIC对应DMAC中断位使能
Dma_Enable(); ///< 使能DMA
Dma_EnableChannel(ch); ///< 使能DMA通道0
}
|