<?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>Kinetis Microcontrollers中的主题 Re: KL25Z DMA With TPM Problems</title>
    <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1259716#M60144</link>
    <description>&lt;P&gt;I found the solution to both problems.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For the errant 42 nS pulse on the associated PWM pin, the I/O pin associated with TPM1 channel 0 should not be enabled until AFTER the TPM is initialized. There’s absolutely nothing in the Reference Manual that I could find that indicates this is the case, but it fixed the problem. So, my code in main() was changed to:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;InitMCG();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;EnableModuleClocks();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitTPM();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitIOPorts();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitDMA();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The issue with the DMA was about as subtle. The CHF flag in the TPM is set when a "event" occurs. For a channel configured as EPWM, this happens when the counter matches the value in CnV. Apparently, the TPM, even when initialized with a 0% duty cycle ends up setting the Channel Flag (CHF) in the TPMx_CnSC register. Evidently this creates an “extra” DMA request and write to the CnV register immediately after enabling the DMA channel. Clearing this flag just before enabling the DMA channel fixed the problem! So the DMA init code becomes:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;DMAMUX0_CHCFG0 = 0x00;&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; // disable DMA channel 0.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_SAR0 = (int)DMATable;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set up DMA source address register.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DAR0 = (int)&amp;amp;TPM1_C0V;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set up DMA destination address reg.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DSR_BCR0 = sizeof(DMATable);&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of bytes to xfer.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DCR0 = 0x60640080;&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; // enable peripheral request (ERQ=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // cycle steal (CS=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // auto-align (AA=0)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source increment (SINC=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source size 16-bit (SSIZE=10)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination increment (DINC=0)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination size 16-bit (SSIZE=10),&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable request (D_REQ=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;TPM1_C0SC |= 0x80;&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; // clear the CHF flag before enabling DMA.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMAMUX0_CHCFG0 = DMAMUX_CHCFG_ENBL_MASK | TPM1Ch0Slot; // enable DMA channel 0 for TPM1 channel 0.&lt;/FONT&gt;&lt;/P&gt;</description>
    <pubDate>Fri, 09 Apr 2021 13:39:52 GMT</pubDate>
    <dc:creator>gordondoughman</dc:creator>
    <dc:date>2021-04-09T13:39:52Z</dc:date>
    <item>
      <title>KL25Z DMA With TPM Problems</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258832#M60123</link>
      <description>&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif"&gt;I have a project where I am attempting to use the TPM, configured for edge aligned PWM, to produce a series of 24 timed pulses, using the DMA to write new values to the TPM CnV register for each pulse. I'm having a couple of problems with which I need help.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif"&gt;I have the PWM set up as follows:&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;TPM1_SC = 0x0008;&lt;BR /&gt;TPM1_C0SC = 0x29;&lt;BR /&gt;TPM1_MOD = 29;&lt;BR /&gt;TPM1_C0V = 0;&lt;BR /&gt;SIM_SOPT2 |= 0x01000000; // select MCGPLLCLK/2 for TPM clock.&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;When the &lt;FONT face="courier new,courier"&gt;SIM_SOPT2 &lt;/FONT&gt;register is written, a 42 nS pulse (i.e. one TPM module clock) appears on the associated output pin. Does anyone have any ideas why this is happening and how to eliminate it?&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Second, I have the DMA set up as follows:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;const unsigned short DMATable [] = {8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,15,15,15,15,15,15,15,15,0};&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;DMAMUX0_CHCFG0 = 0x00;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // disable DMA channel 0.&lt;BR /&gt;DMA_SAR0 = (int)DMATable;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set up DMA source address register.&lt;BR /&gt;DMA_DAR0 = (int)&amp;amp;TPM1_C0V; &amp;nbsp; &amp;nbsp; &amp;nbsp; // set up DMA destination address register.&lt;BR /&gt;DMA_DSR_BCR0 = sizeof(DMATable); // number of bytes to xfer.&lt;BR /&gt;DMA_DCR0 = 0x60640080; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // enable peripheral request (ERQ=1)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // cycle steal (CS=1)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // auto-align (AA=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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source increment (SINC=1)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source size 16-bit (SSIZE=10)&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination increment (DINC=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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination size 16-bit (SSIZE=10),&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;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable request (D_REQ=1)&lt;BR /&gt;DMAMUX0_CHCFG0 = DMAMUX_CHCFG_ENBL_MASK | TPM1Ch0Slot; // enable DMA channel 0 for TPM1 channel 0.&lt;BR /&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;As the &lt;FONT face="courier new,courier"&gt;DMATable &lt;/FONT&gt;shows, 16 pulses, 8 TPM module clocks wide followed by 8 pulses, 15 TPM module clocks wide should appear on the associated TPM pin. Finally, the DMA transfers a value of zero to&amp;nbsp;&lt;FONT face="courier new,courier"&gt;C0V&lt;/FONT&gt; to have the PWM output remain at zero. However, instead of 16 pulses 8 TPM module clocks wide, only 15 pulses are appearing, followed by the 8 longer pulses.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;Does anyone have any ideas what might be going on here?&lt;/P&gt;</description>
      <pubDate>Thu, 08 Apr 2021 10:58:26 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258832#M60123</guid>
      <dc:creator>gordondoughman</dc:creator>
      <dc:date>2021-04-08T10:58:26Z</dc:date>
    </item>
    <item>
      <title>Re: KL25Z DMA With TPM Problems</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258868#M60124</link>
      <description>&lt;P&gt;Module clocks should be enabled before configuring modules.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 08 Apr 2021 12:05:35 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258868#M60124</guid>
      <dc:creator>bobpaddock</dc:creator>
      <dc:date>2021-04-08T12:05:35Z</dc:date>
    </item>
    <item>
      <title>Re: KL25Z DMA With TPM Problems</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258924#M60125</link>
      <description>&lt;P&gt;I've tried that and it still generates the 42 nS pulse on the output pin. I moved the line:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;SIM_SOPT2 |= 0x01000000; // select MCGPLLCLK/2 for TPM clock.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;to the function &lt;FONT face="courier new,courier"&gt;EnableModuleClocks()&lt;/FONT&gt; which is called in &lt;FONT face="courier new,courier"&gt;main()&lt;/FONT&gt; before the call to &lt;FONT face="courier new,courier"&gt;InitTPM()&lt;/FONT&gt;.&lt;/P&gt;&lt;P&gt;Any other suggestions?&lt;/P&gt;</description>
      <pubDate>Thu, 08 Apr 2021 13:30:54 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1258924#M60125</guid>
      <dc:creator>gordondoughman</dc:creator>
      <dc:date>2021-04-08T13:30:54Z</dc:date>
    </item>
    <item>
      <title>Re: KL25Z DMA With TPM Problems</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1259099#M60127</link>
      <description>&lt;P&gt;Ok, continued to work on the errant 42 nS pulse issue, I was able to fix the problem by NOT initializing the I/O Ports until after configuring the TPM. In main() the calls were rearranged to:&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;InitMCG();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize the MCG to use the external 8MHz crystal.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;EnableModuleClocks(); // enable clocks to all modules we'll use.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitTPM();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // initialize the TPM for edge aligned mode.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitIOPorts();&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // go initialize the I/O ports we'll use.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitDMA();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="arial,helvetica,sans-serif"&gt;Where&amp;nbsp;&lt;FONT face="courier new,courier"&gt;InitIOPorts()&lt;/FONT&gt; contains the following line:&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;PORTA_PCR12 = 0x00000300; // put TPM1_CH0 out on pin PTA12.&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&lt;FONT face="arial,helvetica,sans-serif"&gt;I'm not sure why this is required to prevent a "glitch" on the associated TPM pin. I couldn't find anything in the KL25Z Reference Manual stating this requirement.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;&lt;FONT face="arial,helvetica,sans-serif"&gt;Still having the DMA issue and would appreciate any suggestions.&lt;/FONT&gt;&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;</description>
      <pubDate>Thu, 08 Apr 2021 19:40:32 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1259099#M60127</guid>
      <dc:creator>gordondoughman</dc:creator>
      <dc:date>2021-04-08T19:40:32Z</dc:date>
    </item>
    <item>
      <title>Re: KL25Z DMA With TPM Problems</title>
      <link>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1259716#M60144</link>
      <description>&lt;P&gt;I found the solution to both problems.&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;For the errant 42 nS pulse on the associated PWM pin, the I/O pin associated with TPM1 channel 0 should not be enabled until AFTER the TPM is initialized. There’s absolutely nothing in the Reference Manual that I could find that indicates this is the case, but it fixed the problem. So, my code in main() was changed to:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;InitMCG();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;EnableModuleClocks();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitTPM();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitIOPorts();&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;InitDMA();&lt;/FONT&gt;&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;The issue with the DMA was about as subtle. The CHF flag in the TPM is set when a "event" occurs. For a channel configured as EPWM, this happens when the counter matches the value in CnV. Apparently, the TPM, even when initialized with a 0% duty cycle ends up setting the Channel Flag (CHF) in the TPMx_CnSC register. Evidently this creates an “extra” DMA request and write to the CnV register immediately after enabling the DMA channel. Clearing this flag just before enabling the DMA channel fixed the problem! So the DMA init code becomes:&lt;/P&gt;&lt;P&gt;&amp;nbsp;&lt;/P&gt;&lt;P&gt;&lt;FONT face="courier new,courier"&gt;DMAMUX0_CHCFG0 = 0x00;&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; // disable DMA channel 0.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_SAR0 = (int)DMATable;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set up DMA source address register.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DAR0 = (int)&amp;amp;TPM1_C0V;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // set up DMA destination address reg.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DSR_BCR0 = sizeof(DMATable);&amp;nbsp;&amp;nbsp;&amp;nbsp; // number of bytes to xfer.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMA_DCR0 = 0x60640080;&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; // enable peripheral request (ERQ=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // cycle steal (CS=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // auto-align (AA=0)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source increment (SINC=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // source size 16-bit (SSIZE=10)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination increment (DINC=0)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // destination size 16-bit (SSIZE=10),&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&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;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Disable request (D_REQ=1)&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;TPM1_C0SC |= 0x80;&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; // clear the CHF flag before enabling DMA.&lt;/FONT&gt;&lt;BR /&gt;&lt;FONT face="courier new,courier"&gt;DMAMUX0_CHCFG0 = DMAMUX_CHCFG_ENBL_MASK | TPM1Ch0Slot; // enable DMA channel 0 for TPM1 channel 0.&lt;/FONT&gt;&lt;/P&gt;</description>
      <pubDate>Fri, 09 Apr 2021 13:39:52 GMT</pubDate>
      <guid>https://community.nxp.com/t5/Kinetis-Microcontrollers/KL25Z-DMA-With-TPM-Problems/m-p/1259716#M60144</guid>
      <dc:creator>gordondoughman</dc:creator>
      <dc:date>2021-04-09T13:39:52Z</dc:date>
    </item>
  </channel>
</rss>

