<?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 DMA triggered by a GPIO in Kinetis Microcontrollers</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/DMA-triggered-by-a-GPIO/m-p/668856#M41104</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi community,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It is the third ticket I open.&lt;/P&gt;&lt;P&gt;I dont succedded to work with gpio trigger on DMA.&lt;/P&gt;&lt;P&gt;I'm using Kinetis K64 + SDK 2.1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote a minimalist example, with a very simple memory to memory DMA transfer.&lt;/P&gt;&lt;P&gt;When I start it explicitly with EDMA_StartTransfer(&amp;amp;g_EDMA_Handle) so all is OK and I get the interrupt notification at the end of the transfer.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But when I configured my GPIO pin to be a trigger ( like that):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_SetPinInterruptConfig(ADS_PORT, N_DRDY_PIN, kPORT_DMAFallingEdge);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PORT_SetPinMux(ADS_PORT, N_DRDY_PIN, kPORT_MuxAsGpio);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;GPIO_PinInit(ADC_GPIO, N_DRDY_PIN, &amp;amp;config);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnableIRQ(ADC_PORT_IRQ);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;and the DMAMUX0 like:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_Init(DMAMUX0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_SetSource(DMAMUX0, 0, kDmaRequestMux0PortD);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_EnableChannel(DMAMUX0, 0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_GetDefaultConfig(&amp;amp;userConfig);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_Init(DMA0, &amp;amp;userConfig);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_CreateHandle(&amp;amp;g_EDMA_Handle, DMA0, 0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_SetCallback(&amp;amp;g_EDMA_Handle, _edma_cb, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_PrepareTransfer(&amp;amp;transferConfig, srcAddr, sizeof(srcAddr[0]), destAddr, sizeof(destAddr[0]),&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(srcAddr[0]), sizeof(srcAddr), kEDMA_MemoryToMemory);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_SubmitTransfer(&amp;amp;g_EDMA_Handle, &amp;amp;transferConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It doesnt work me at all .... &lt;/P&gt;&lt;P&gt;Note that I checked with scope the interrupts and this is working.&lt;/P&gt;&lt;P&gt;Where should be configured the trigger please.&lt;/P&gt;&lt;P&gt;Please help.&lt;/P&gt;&lt;P&gt;I don't found in the datasheet how the DMA can be hardware triggered. The only trigger the datasheet talks is in DMAMUX.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Thu, 13 Jul 2017 15:05:59 GMT</pubDate>
    <dc:creator>mikaelelharrar</dc:creator>
    <dc:date>2017-07-13T15:05:59Z</dc:date>
    <item>
      <title>DMA triggered by a GPIO</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/DMA-triggered-by-a-GPIO/m-p/668856#M41104</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;P&gt;Hi community,&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It is the third ticket I open.&lt;/P&gt;&lt;P&gt;I dont succedded to work with gpio trigger on DMA.&lt;/P&gt;&lt;P&gt;I'm using Kinetis K64 + SDK 2.1.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;I wrote a minimalist example, with a very simple memory to memory DMA transfer.&lt;/P&gt;&lt;P&gt;When I start it explicitly with EDMA_StartTransfer(&amp;amp;g_EDMA_Handle) so all is OK and I get the interrupt notification at the end of the transfer.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;But when I configured my GPIO pin to be a trigger ( like that):&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PORT_SetPinInterruptConfig(ADS_PORT, N_DRDY_PIN, kPORT_DMAFallingEdge);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;PORT_SetPinMux(ADS_PORT, N_DRDY_PIN, kPORT_MuxAsGpio);&lt;BR /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;GPIO_PinInit(ADC_GPIO, N_DRDY_PIN, &amp;amp;config);&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;EnableIRQ(ADC_PORT_IRQ);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;and the DMAMUX0 like:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_Init(DMAMUX0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_SetSource(DMAMUX0, 0, kDmaRequestMux0PortD);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; DMAMUX_EnableChannel(DMAMUX0, 0);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_GetDefaultConfig(&amp;amp;userConfig);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_Init(DMA0, &amp;amp;userConfig);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_CreateHandle(&amp;amp;g_EDMA_Handle, DMA0, 0);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_SetCallback(&amp;amp;g_EDMA_Handle, _edma_cb, NULL);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_PrepareTransfer(&amp;amp;transferConfig, srcAddr, sizeof(srcAddr[0]), destAddr, sizeof(destAddr[0]),&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizeof(srcAddr[0]), sizeof(srcAddr), kEDMA_MemoryToMemory);&lt;BR /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; EDMA_SubmitTransfer(&amp;amp;g_EDMA_Handle, &amp;amp;transferConfig);&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;It doesnt work me at all .... &lt;/P&gt;&lt;P&gt;Note that I checked with scope the interrupts and this is working.&lt;/P&gt;&lt;P&gt;Where should be configured the trigger please.&lt;/P&gt;&lt;P&gt;Please help.&lt;/P&gt;&lt;P&gt;I don't found in the datasheet how the DMA can be hardware triggered. The only trigger the datasheet talks is in DMAMUX.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Thanks&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 13 Jul 2017 15:05:59 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/DMA-triggered-by-a-GPIO/m-p/668856#M41104</guid>
      <dc:creator>mikaelelharrar</dc:creator>
      <dc:date>2017-07-13T15:05:59Z</dc:date>
    </item>
    <item>
      <title>Re: DMA triggered by a GPIO</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/DMA-triggered-by-a-GPIO/m-p/668857#M41105</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;&lt;SPAN&gt;This is the code used in the uTasker project to trigger DMA transfers from port changes. This particular reference shows how to cause a second GPIO (port mirroring) to follow a port input by each change triggering a suitable DMA transfer. Complete code is available in the open source uTasker project at &lt;/SPAN&gt;&lt;A class="jive-link-external-small" href="https://community.nxp.com/external-link.jspa?url=http%3A%2F%2Fwww.utasker.com%2Fkinetis.html" rel="nofollow" target="_blank"&gt;http://www.utasker.com/kinetis.html&lt;/A&gt;&lt;SPAN&gt; (search for the define DMA_PORT_MIRRORING in Port_Interrupts.h; the GPIO is configured for DMA triggering in kinetis_PORTS.h and the DMA controller set up in kinetis_DMA.h).&lt;/SPAN&gt;&lt;BR /&gt;Apart from the limitation of the DMA channel used the code is target independent and so operates on all Kinetis parts with DMA.&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;INTERRUPT_SETUP interrupt_setup;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // interrupt configuration parameters&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;interrupt_setup.int_type = PORT_INTERRUPT;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // identifier to configure port interrupt&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;interrupt_setup.int_port&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = PORTB;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // the port that the interrupt input is on&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;interrupt_setup.int_port_bits&amp;nbsp; = PORTB_BIT16;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // UART input pin on FRDM-K64F&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;interrupt_setup.int_port_sense = (IRQ_BOTH_EDGES | PULLUP_ON | PORT_DMA_MODE); // DMA on both edges&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;interrupt_setup.int_handler = 0;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // no interrupt handler when using DMA&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;// Configure the DMA trigger from the UART input pin change to toggle an alternative port so that the input signal is mirrored to that output without CPU intervention&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;//&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;static const unsigned long ulOutput = PORTC_BIT16;&amp;nbsp; // the output to be mirrored to&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;fnConfigDMA_buffer(9, DMAMUX0_CHCFG_SOURCE_PORTB, sizeof(ulOutput), (void *)&amp;amp;ulOutput, (void *)&amp;amp;(((GPIO_REGS *)GPIOC_ADD)-&amp;gt;PTOR), (DMA_FIXED_ADDRESSES | DMA_LONG_WORDS), 0, 0); // use DMA channel 9 without any interrupts (free-runnning)&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;&lt;SPAN style="font-family: courier new,courier,monospace; font-size: 12px;"&gt;fnConfigureInterrupt((void *)&amp;amp;interrupt_setup);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // configure interrupt&lt;/SPAN&gt;&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Note that the DMAMUX trigger is selected as &lt;STRONG&gt;DMAMUX0_CHCFG_SOURCE_PORTB&lt;/STRONG&gt; and that only one such DMA trigger is available on each of the GPIO ports (whereby ports are A, B, C, D etc.).&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Regards&lt;/P&gt;&lt;P&gt;&lt;/P&gt;&lt;P&gt;Mark&lt;/P&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 13 Jul 2017 22:51:53 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/DMA-triggered-by-a-GPIO/m-p/668857#M41105</guid>
      <dc:creator>mjbcswitzerland</dc:creator>
      <dc:date>2017-07-13T22:51:53Z</dc:date>
    </item>
  </channel>
</rss>

