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.

[参考译文] TMS320F280025C-Q1:DMA 读取 GPIO 引脚的当前状态?

Guru**** 2442090 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/996239/tms320f280025c-q1-dma-reading-current-status-of-the-gpio-pin

器件型号:TMS320F280025C-Q1

您好、支持团队、

我可以使用 DMA 读取 ADC 结果、然后我想读取 GPIO 引脚的状态。

但是、当我在下面的代码中将 DMA 源"&AdcaResultRegs.ADCRESULT0"替换为"&GpioDataReadRegs.GPADAT_R"或"&GpioDataRegs.GPADAT.All"时、我无法获得正确的引脚状态。
虽然有高引脚和低引脚、整个寄存器被读取为0。

在使用 DMA 读取 GPIO 引脚状态时、我是否应该考虑任何因素?

读取 ADC 结果代码=>正常工作

EALLOW;

  // DMA_configAddresses DMA channel 1 set up for ADCA
  /* Set up SOURCE address. */
  DmaRegs.CH2.SRC_BEG_ADDR_SHADOW = (u32)&AdcaResultRegs.ADCRESULT0;
  /* Point to beginning of source buffer */
  DmaRegs.CH2.SRC_ADDR_SHADOW = (u32)&AdcaResultRegs.ADCRESULT0;

  /* Set up DESTINATION address. */
  DmaRegs.CH2.DST_BEG_ADDR_SHADOW = (u32)u16AdcByDma;
  /* Point to beginning of destination buffer */
  DmaRegs.CH2.DST_ADDR_SHADOW = (u32)u16AdcByDma;

  // Set up BURST registers.
  DmaRegs.CH2.BURST_SIZE.bit.BURSTSIZE = 0u; // Number of words(X-1) x-ferred in a burst.
  DmaRegs.CH2.SRC_BURST_STEP = 0u;// Increment source addr between each word x-ferred.
  DmaRegs.CH2.DST_BURST_STEP = 0u;// Increment dest addr between each word x-ferred.

  // Set up TRANSFER registers.
  DmaRegs.CH2.TRANSFER_SIZE = 99u;  // Number of bursts per transfer, DMA interrupt will occur after completed transfer.
  DmaRegs.CH2.SRC_TRANSFER_STEP =  0u;// TRANSFER_STEP is ignored when WRAP occurs.
  DmaRegs.CH2.DST_TRANSFER_STEP =  1;// TRANSFER_STEP is ignored when WRAP occurs.

  /* disable wrapping */
  DmaRegs.CH2.SRC_WRAP_SIZE = 0xFFFFu;
  DmaRegs.CH2.DST_WRAP_SIZE = 0xFFFFu;

  // Set up trigger selection in the CMA/CLA trigger source selection registers. These are considered part of system control.
  DmaClaSrcSelRegs.DMACHSRCSEL1.bit.CH2 =  DMA_TRIGGER_ADCA1;

  // Set peripheral interrupt select bits to the channel number (legacy bits - hard coded to channel)
  DmaRegs.CH2.MODE.bit.PERINTSEL = 2u;

  // Write the configuration to the mode register.
  DmaRegs.CH2.MODE.bit.DATASIZE = 0u;   /* DMA transfers 16 bits at a time. */
  DmaRegs.CH2.MODE.bit.CONTINUOUS = 1u;
  DmaRegs.CH2.MODE.bit.ONESHOT = 0u;

  // Set the peripheral interrupt trigger enable bit.
  DmaRegs.CH2.MODE.bit.PERINTE = 1u;
  
    DmaRegs.CH2.MODE.bit.OVRINTE = 0u;
  /* the DMA channel interrupt will be generated at the end of the transfer */
  DmaRegs.CH2.MODE.bit.CHINTMODE = 1u;

  PieVectTable.DMA_CH2_INT = &dmach2ISR;  /* Map ISR functions */

  DmaRegs.CH2.MODE.bit.CHINTE = 1u; /* enableInterrupt */

  /* Write a one to the clear bit to clear the peripheral trigger flag. */
  // Clear any spurious flags: Interrupt flags and sync error flags
  DmaRegs.CH2.CONTROL.bit.PERINTCLR = 1u;
  DmaRegs.CH2.CONTROL.bit.ERRCLR = 1;

  CPU_EnableIRQ(INT_DMA_CH2);            /* Enable DMA 1 Interrupt */

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

读取引脚状态代码=>读取全部0

  /* Set up SOURCE address. */
  DmaRegs.CH2.SRC_BEG_ADDR_SHADOW = (u32)&GpioDataReadRegs.GPADAT_R;
  /* Point to beginning of source buffer */
  DmaRegs.CH2.SRC_ADDR_SHADOW = (u32)&GpioDataReadRegs.GPADAT_R;

  /* Set up SOURCE address. */
  DmaRegs.CH2.SRC_BEG_ADDR_SHADOW = (u32)&GpioDataRegs.GPADAT.all;
  /* Point to beginning of source buffer */
  DmaRegs.CH2.SRC_ADDR_SHADOW = (u32)&GpioDataRegs.GPADAT.all;

此致、

问题

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

    Quy、

    DMA 不能访问 GPIO 寄存器。 因此、您将无法使用 DMA 读取任何 GPIO 寄存器。

    此致、

    曼诺伊

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

    您好、Manoj、

    感谢您的回复、

    我们将找到应用的权变措施

    此致、

    问题