<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Circular DMA Buffer in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/2035630#M67232</link>
    <description>&lt;P&gt;Hi Hui,&lt;/P&gt;&lt;P&gt;Nevermind, I understood it.&lt;/P&gt;&lt;P&gt;Is there way to configure the modulo for a buffer that is not power of 2 ?!&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;</description>
    <pubDate>Wed, 29 Jan 2025 12:52:47 GMT</pubDate>
    <dc:creator>user_244572</dc:creator>
    <dc:date>2025-01-29T12:52:47Z</dc:date>
    <item>
      <title>Circular DMA Buffer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293187#M11884</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I am using flextimer and configured them to trigger DMA when it reach a rising edge in the channel interrupt. I defined a specific size of the DMA buffer, which gives me some problems, as I don't know how many inputs i get.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;First question: Is it possible somehow to make a circular DMA buffer? and how?&lt;/P&gt;&lt;P&gt;Second question: If I want to clear the DMA and start all over before the buffer is full, how do I do this in a correct way? Right now I have to initialize the controller again.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I posted my code for initializing the DMA, I hope someone can help me out.&lt;/P&gt;&lt;P&gt;I have a DMA buffer which has 2048 elements of uint16.&lt;/P&gt;&lt;P&gt;I am working on a K60 MCU using uTasker.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks in advance. &lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;PRE __default_attr="c++" __jive_macro_name="code" class="jive_text_macro jive_macro_code _jivemacro_uid_13851043622261130" jivemacro_uid="_13851043622261130"&gt;
&lt;P&gt;&lt;/P&gt;
&lt;/PRE&gt;&lt;P&gt;// Configure DMA multiplexer and DMA controller&lt;/P&gt;&lt;P&gt;void dma_init(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp; POWER_UP(6, SIM_SCGC6_DMAMUX0);&lt;/P&gt;&lt;P&gt;&amp;nbsp; POWER_UP(7, SIM_SCGC7_DMA);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMAMUX0_CHCFG0 = (DMAMUX_CHCFG_SOURCE_FTM0_CH0 | DMAMUX_CHCFG_ENBL);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* No link channel to channel, number of transactions */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_CITER_ELINKNO = buffer_size; // Current Minor Loop Link, Major Loop Count&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_BITER_ELINKNO = buffer_size; // Beginning Minor Loop Link, Major Loop Count&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* transfer, making only a single minor loop necessary to complete a major loop */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SADDR = (uint32)(&amp;amp;FTM0_C0V); // Set the Source Address&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SOFF = 0; // Source offset disabled &lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_SLAST = 0; // Last Source Address Adjustment - No adjust needed&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DADDR = (uint32)dma_buf; // Set the Destination Address &lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DOFF = sizeof(uint16); // Destination offset 2 bytes (Increments the address after transaction)&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_DLASTSGA = -(sizeof(uint16)*(buffer_size)); // Last Destination Address Adjustment (2 byte * array size)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_NBYTES_MLNO = sizeof(uint16); // Transfer 2 bytes per transaction (16 bit)&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /* Source and Destination Modulo off, source and destination size 1 = 16 bits */&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_TCD0_ATTR =&amp;nbsp; DMA_TCD_ATTR_SSIZE_16_BIT | DMA_TCD_ATTR_DSIZE_16_BIT;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; DMA_ERQ |= DMA_ERQ_ERQ0; // Enable DMA request on channel 0 &lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 22 Nov 2013 07:18:05 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293187#M11884</guid>
      <dc:creator>kenrenjen</dc:creator>
      <dc:date>2013-11-22T07:18:05Z</dc:date>
    </item>
    <item>
      <title>Re: Circular DMA Buffer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293188#M11885</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;1. The circular DMA buffer is eanabled via set TCD Transfer Attributes (DMA_TCDn_ATTR) register [SMOD] &amp;amp; [DMOD] bits.&lt;/P&gt;&lt;P&gt;Please check attached example code, which is using circular DMA buffer to do eDMA performance test.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;2. You can disable the DMA trigger source(disable FTM DMA trigger) and move data from the buffer. After that, you can enable the DMA trigger again.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Wish it helps.&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 29 Nov 2013 07:18:06 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293188#M11885</guid>
      <dc:creator>Hui_Ma</dc:creator>
      <dc:date>2013-11-29T07:18:06Z</dc:date>
    </item>
    <item>
      <title>Re: Circular DMA Buffer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293189#M11886</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi Ma Hui,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I referred your demo code. And initial the lpuart as below. But I cannot receive anything in g_ui8RxBuffer[], am I lost something? By the way, because our protocol is based on 16-bit big-endian mode, could I configure kEDMATransferSize_1Bytes to kEDMATransferSize_2Bytes and make transform from big-endian to little-endian in 16-bit type? &lt;/P&gt;&lt;P&gt;Thanks in advance!&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;void InitUartDrv(void)&lt;/P&gt;&lt;P&gt;{&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t dmaBaseAddr;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t dmaChannel;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; uint32_t baseAddr = g_lpuartBaseAddr[0];&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * initial lpuart driver for commlink&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp; lpuartUserConfig.clockSource = kClockLpuartSrcPllFllSel;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lpuartUserConfig.baudRate = 2000000;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lpuartUserConfig.bitCountPerChar = kLpuart8BitsPerChar;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lpuartUserConfig.parityMode = kLpuartParityDisabled;&lt;/P&gt;&lt;P&gt;&amp;nbsp; lpuartUserConfig.stopBitCount = kLpuartOneStopBit;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; eDmaUserConfig.chnArbitration = kEDMAChnArbitrationRoundrobin;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; EDMA_DRV_Init(&amp;amp;eDmaState, &amp;amp;eDmaUserConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * @ ToDo: allocate eDMA channel dynamically&lt;/P&gt;&lt;P&gt;&amp;nbsp; * both for lpuart transmit and receive&lt;/P&gt;&lt;P&gt;&amp;nbsp; * Channel 0 - LPUART RX&lt;/P&gt;&lt;P&gt;&amp;nbsp; * Channel 1 - LPUART TX&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp; LPUART_DRV_EdmaInit(0, &amp;amp;lpuartEdmaState, &amp;amp;lpuartUserConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp; * re-initial RX to use eDMA + circular buffer&lt;/P&gt;&lt;P&gt;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaBaseAddr = VIRTUAL_CHN_TO_EDMA_MODULE_REGBASE(lpuartEdmaState.edmaLpuartRx.channel);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dmaChannel = VIRTUAL_CHN_TO_EDMA_CHN(lpuartEdmaState.edmaLpuartRx.channel);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Setup destination */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetDestAddr(dmaBaseAddr, dmaChannel, (uint32_t)(&amp;amp;g_ui8RxBuffer[0]));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetDestOffset(dmaBaseAddr, dmaChannel, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetDestLastAdjust(dmaBaseAddr, dmaChannel, 0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Setup source */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetSrcAddr(dmaBaseAddr, dmaChannel, LPUART_HAL_GetDataRegAddr(baseAddr));&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetSrcOffset(dmaBaseAddr, dmaChannel, 0);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetSrcLastAdjust(dmaBaseAddr, dmaChannel, 0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /* Setup transfer properties */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetNbytes(dmaBaseAddr, dmaChannel, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetChannelMinorLink(dmaBaseAddr, dmaChannel, 0, false);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetMajorCount(dmaBaseAddr, dmaChannel, 1);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetAttribute(dmaBaseAddr, dmaChannel, kEDMAModuloDisable, kEDMAModulo1Mbytes, kEDMATransferSize_1Bytes, kEDMATransferSize_1Bytes);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetScatterGatherCmd(dmaBaseAddr, dmaChannel, false);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_HAL_HTCDSetDisableDmaRequestAfterTCDDoneCmd(dmaBaseAddr, dmaChannel, false);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; /*&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Finally, enable the LPUART receiver&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; * Enable DMA trigger when receive data register full&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; */&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPUART_HAL_SetRxDmaCmd(baseAddr, true);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; LPUART_HAL_SetReceiverCmd(baseAddr, true);&lt;/P&gt;&lt;P&gt;}&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;B.R.&lt;/P&gt;&lt;P&gt;Jin Xin&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Fri, 19 Jun 2015 01:49:38 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/293189#M11886</guid>
      <dc:creator>jinxin_cn</dc:creator>
      <dc:date>2015-06-19T01:49:38Z</dc:date>
    </item>
    <item>
      <title>Re: Circular DMA Buffer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/2035552#M67231</link>
      <description>&lt;P&gt;Hi Hui,&lt;/P&gt;&lt;P&gt;Can you tell me how did you set the Source and the Destination modulo value ?&lt;/P&gt;&lt;P&gt;I am trying to configure DMA on my side for a circular buffer transfer as well.&lt;/P&gt;&lt;P&gt;I have a u16 source array of [12] and a u16 destination variable.&lt;/P&gt;&lt;P&gt;Target is s32k322.&lt;/P&gt;&lt;P&gt;Thanks in advance.&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jan 2025 10:34:49 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/2035552#M67231</guid>
      <dc:creator>user_244572</dc:creator>
      <dc:date>2025-01-29T10:34:49Z</dc:date>
    </item>
    <item>
      <title>Re: Circular DMA Buffer</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/2035630#M67232</link>
      <description>&lt;P&gt;Hi Hui,&lt;/P&gt;&lt;P&gt;Nevermind, I understood it.&lt;/P&gt;&lt;P&gt;Is there way to configure the modulo for a buffer that is not power of 2 ?!&lt;/P&gt;&lt;P&gt;Thanks,&lt;/P&gt;</description>
      <pubDate>Wed, 29 Jan 2025 12:52:47 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/Circular-DMA-Buffer/m-p/2035630#M67232</guid>
      <dc:creator>user_244572</dc:creator>
      <dc:date>2025-01-29T12:52:47Z</dc:date>
    </item>
  </channel>
</rss>

