This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] LAUNCHXL-F2.8379万D:DMA通道2-模式寄存器- PERINTSEL字段

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1096826/launchxl-f28379d-dma-channel-2---mode-register---perintsel-field

部件号:LAUNCHXL-F2.8379万D

您好,

我从技术参考手册中了解到PERINTSEL字段应为 通道号,在本例中为2。

但是,当我使用下面给出的DMA配置函数时

	DMA_configMode(
			DMA_CH2_BASE,
			DMA_TRIGGER_EPWM2SOCA,
			(DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE
					| DMA_CFG_SIZE_16BIT));

DMA通道2未按预期工作。

相反,如果我直接写入寄存器并提供如下所示的值1,它是有效的!

    DmaClaSrcSelRegs.DMACHSRCSEL1.bit.CH2 = DMA_TRIGGER_EPWM2SOCA;
    DmaRegs.CH2.MODE.bit.PERINTSEL = 1;

    DmaRegs.CH2.MODE.bit.PERINTE = 1;
    DmaRegs.CH2.MODE.bit.CHINTE = 0;
    DmaRegs.CH2.MODE.bit.ONESHOT = 0;
    DmaRegs.CH2.MODE.bit.CONTINUOUS = 1;
    DmaRegs.CH2.MODE.bit.DATASIZE = 0;
    DmaRegs.CH2.MODE.bit.CHINTMODE = 0;
    DmaRegs.CH2.MODE.bit.CHINTE = 0;

    DmaRegs.CH2.CONTROL.bit.RUN = 1;

我正在对DMA通道1使用以下代码,它运行良好! 但是,如果我使用相同的代码,将CH1替换为CH2并删除 DMA_initController();& DMA_setEmulation Mode(DMA_emulation_free _run);(因为它已经在通道1初始化函数中完成,通道2不像通道1那样工作。

	DMA_initController();
	DMA_setEmulationMode(DMA_EMULATION_FREE_RUN);

	DMA_configSourceAddress(DMA_CH1_BASE, dma_src);
	DMA_configDestAddress(DMA_CH1_BASE, dma_dst);

	/* Channel 1, McBSPA transmit */
	DMA_configBurst(DMA_CH1_BASE, 1, 1, 0);
	DMA_configTransfer(DMA_CH1_BASE, 10, 1, 0);

	DMA_configMode(
			DMA_CH1_BASE,
			DMA_TRIGGER_EPWM1SOCA,
			(DMA_CFG_ONESHOT_DISABLE | DMA_CFG_CONTINUOUS_ENABLE
					| DMA_CFG_SIZE_16BIT));

	DMA_enableTrigger(DMA_CH1_BASE);
	DMA_disableInterrupt(DMA_CH1_BASE);
	DMA_setInterruptMode(DMA_CH1_BASE, DMA_INT_AT_BEGINNING);

	SysCtl_selectSecMaster(SYSCTL_SEC_MASTER_DMA, SYSCTL_SEC_MASTER_DMA);

	DMA_startChannel(DMA_CH1_BASE);

问题:

1.在使用多个渠道时,是否还有其他需要考虑的问题?

2.使用通道2时PERINTSEL的值是多少?

此致,

Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha,
    查看TRM,我发现PERINTSEL位字段在此设备上已过时,而是使用DMACHSRCSEL。  尽管在使用中已弃用,但我怀疑有一些功能会提供您提及的行为。  让我尝试用我们的驱动程序LIB示例重现该问题,我可以评论潜在问题。  我同意,有了驱动程序,就像更改参数中的DMA通道一样简单。  我会在明天之前尝试向您提供更多信息。

    最佳,
    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha,

    PERINTSEL应始终设置DMA Channel Number (DMA通道号),因此对于CH2,此字段应设置为“2”。  您是否可以使用原始代码检查是否是这种情况?  驾驶员应负责处理此问题。

    我唯一能想到的另一件事是,如果DMA通道1已配置为优先模式,并且它一直在运行,这不会给通道2一个启动的机会。

    最佳,

    Matthew

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Matthew,您好!

    CH1PRIORITY为零(CH1与其他信道具有相同的优先级)

    唯一能产生不同的值是PERINTSEL,使其2不 会生成EPWM2输出,该输出使用使用 DMA Ch2访问的样本数组中的值,而将1写入它将使其工作。

    此致,

    Rashmitha

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Rashmitha,

    正如Matt所说,对于Ch2,PERINTSEL应该是2。

    对于DMA通道1和通道2,EPWM1SOCA是否触发源? 如果是这样,CH1和CH2将同时接收DMA触发器,并且由于没有启用CH1高优先级,因此它将遵循循环,并且CH1将优先于CH2。 CH2仅在CH1完成其突发后启动。

    我尝试使用软件触发器配置CH1和CH2,并且能够使用PERINTSEL =2 (对于CH2)使CH1和CH2正常工作。

    您是否检查了DmaCh2Regs.control.PERINTFLG是否设置为1? (这将确认CH2触发待处理。

    此致,

    Manoj