请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
器件型号: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;
此致、
问题