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.

[参考译文] TM4C123GH6PM:使用 UDMA 进行 ADC0采样会使 TIMTER PWM 信号中止

Guru**** 2535650 points
Other Parts Discussed in Thread: EK-TM4C1294XL

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1119302/tm4c123gh6pm-adc0-sampling-with-udma-killed-a-timter-pwm-signal

器件型号:TM4C123GH6PM
主题中讨论的其他器件:TM4C123EK-TM4C1294XL

我使用4个计时器作为 PWM 模式。

每个定时器都有自己的 DMA 中断信号来将1个项目从内存传输到自己的匹配寄存器来改变占空比。

这运行正常。 但当我激活 UDMA 以进行 ADC 采样到存储器时。 我的计时器 PWM 信号有时不会在一个 PWM 周期内运行。

为什么? 我对它进行了大量测试、以找到误差。 我的想法不好。

这是一张图片。 故障发生在通道5 PB4 LED2上。 周期内的周期完全为高电平。 当 UDMA 信号延迟时、匹配寄存器中的值较旧。

邮政编码是否有用? 超过3000行代码的应用。

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

    您好!

     我不确定问题是什么。 我没有发现这样的问题。 您能否回答几个问题、以便我更好地澄清您的应用?

     -您在整个应用中使用了多少个 uDMA 通道?  

     -您的采集数据中有哪些 PB7、PB5、PB1和 PB3? 这些信号是如何生成的? 您将其表示为 PB7 DMA、依此类推。 这些信号是否也是通过使用 uDMA 生成的?

     -您使用的是哪些 uDMA 通道? 您还可以回答您使用的计时器模块。  

     UDMA 通道的优先级是多少? 默认情况下、信道索引的优先级越低。 因此、ADC SS0的优先级低于定时器3、但高于定时器0。 但您也可以将通道设置为高优先级。 请参阅以下说明。

    9.2.2优先级
    UDMA 控制器根据通道编号和优先级为每个通道分配优先级
    通道的电平位。 通道编号0具有最高优先级、也是通道编号
    通道的优先级会降低。 每个通道都有一个优先级位来提供两个
    优先级:默认优先级和高优先级。 如果设置了优先级位、则该通道具有
    优先级高于所有其他通道的默认优先级。 如果多个通道设置为高优先级、
    然后、通道编号用于确定所有高优先级通道之间的相对优先级

     -对于 PB4 LED2、您能否将其设置为更高优先级、同时将其他通道设置为更低(默认为哪一个)优先级? 您是否会看到任何不同的行为? 我想知道优先级是否会产生影响?

     -为了进行实验、您可以将每个 PWM 的周期设置为更宽的周期、还是至少设置为 PB4 LED2的周期? 我想知道 UDMA 在周期结束前是否有足够的时间写入匹配寄存器?  

     -为方便实验,是否可以 用 另 一个定时器来取代 PB4 (我想用 T1CCP0表示 PB4)? 例如、在 PC0上、将 T1CCP0替换为 T4CCP0?  现在您使用的是所有端口 B 引脚。 只是想知道故障引脚是否从 PortB 移出到另一个引脚、如 PortC0。  

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

    感谢您的快速反馈。

    我偶尔会遇到与所有4个计时器相同的问题。

    但是、只有当我同时通过 UDMA 使用 ADC0进行记录时。

    我 已经努力处理优先事项,但没有成功。

    我使用 GPIO 的计时器 PWM 输出、并为 UDMA 请求建立到另一个 GPIO 的线桥。

    因此、每个 uDMA 请求可以传输一个数据单元。因为 GPIO 端口能够使用单个请求。 这些信号用于 uDMA 请求。

    编辑:

    很抱歉、我没有回答您的所有问题。

    我对 PWM 信号使用4个 uDMA 通道、对从 ADC 通过 uDMA 传输到存储器的数据进行采样的通道使用1个。

    PB7、PB5、PB1和 PB3 这些信号由定时器产生。  

    //需要桥接:Pb7 <--> PA7

    //需要桥接:Pb5 <--> PC7

    //需要桥接:PB1 <--> PD3

    //需要桥接:Pb3 <--> PF2

    //计时器0A 是数据信号1:Pb6

    // Timer 0B 是到 GPIO 的 UDMA 触发信号:Pb7

    //定时器1A 是数据信号2:PB4

    // Timer 1B 是到 GPIO 的 UDMA 触发信号:Pb5

    //计时器2A 是数据信号3:PB0

    //计时器2B 是到 GPIO 的 uDMA 触发信号:PB1

    //计时器3A 是数据信号4:PB2

    // Timer 3B 是到 GPIO 的 UDMA 触发信号:Pb3

    我使用 uDMA 通道:4、6、7、17用于信号、14用于 ADC0

    代码:

    void uDMAGPIOAIntHandler(void)
    {
        //
        // 1 uDMA Channel = 16 Bytes
        // Byte 0 - 3 = Source End Pointer
        // Byte 4 - 7 = Destination End Pointer
        // Byte 8 - B = Control Word <--- We need this adress offset
        // Byte C - F = Unused
        //
        // uDMA Channel 4 Primary = 4 * 16 + 8 = 72
        // uDMA Channel 4 Alternate = (32 + 4) * 16 + 8 = 584
        //
        
        if (uDMAControlTable[72] == 0 && uDMAControlTable[584] == 0)
        {
            // ------------------------------------------------------------
            //
            // Timer 0A counter value
            //
                // TIMER0_BASE = 0x40030000
                // TIMER_O_TAV = 0x00000050
                //             = 0x40030050
            // (*((volatile uint32_t *)0x40030050))
            //
            // ------------------------------------------------------------
            while ((*((volatile uint32_t *)0x40030050)) > SIGNAL_1)
            {
                // ...waiting the signal is 0
            }
            
            // ------------------------------------------------------------
            //
            //MAP_TimerDisable(TIMER0_BASE, TIMER_BOTH);
            //
                // TIMER0_BASE = 0x40030000
                //
                // TIMER_O_CTL = 0x0000000C
                // 
                // TIMER_CTL_TAEN = 0x00000001
                // TIMER_CTL_TBEN = 0x00000100
            (*((volatile uint32_t *)0x4003000C)) &= ~0x00000101;
            // 
            // ------------------------------------------------------------
            
            // ------------------------------------------------------------
            //
            // Timer counter value reset
            //
                // TIMER0_BASE = 0x40030000
            
                // TIMER_O_TAV = 0x00000050
                // TIMER_O_TBV = 0x00000054
            (*((volatile uint32_t *)0x40030050)) = 0x00000000;
            (*((volatile uint32_t *)0x40030054)) = 0x00000000;
            //
            // ------------------------------------------------------------
        }
        
        if (uDMAControlTable[72] == 0)
        {
            DEBUG_PE2 = GPIO_PIN_2; // DMA Pri
        }
        if (uDMAControlTable[584] == 0)
        {
            DEBUG_PE3 = GPIO_PIN_3; // DMA Alt
        }
        
        DEBUG_PE2 = 0; // DMA Pri
        DEBUG_PE3 = 0; // DMA Alt
        uDMADoneCounter = tick10ms;
    }

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

    您好!

     您有3000多行代码、 我在几个小时的阅读之后确实很难继续。 这就是我目前为止理解的基于 PB7 -> PA7 -> PB6的内容。

     使用 Timer0_B 在 PB7上生成 PWM。

     PB7连接到配置为 GPIO 输入的 PA7。

     3、PA7将触发通道4上的 uDMA 传输。

     UDMA 通道4配置为从存储器传输到 Timer0_A 的匹配寄存器、该匹配寄存器配置为 PB6引脚上的 PWM。

     我真的不明白为什么您需要使用 GPIO 将 PB7连接到 PA7以实现 UDMA 触发。 为什么不考虑将 Timer0_B 配置为周期性超时并让超时直接触发通道19上的 UDMA。 使用通道19更改 PB6的 timer0_A 占空比。  

     我也不了解诸如 uDMAGPIOAIntHandler 之类的 ISR。 为什么需要它们? 如果 PA7被用作 uDMA 请求、它甚至不应该生成一个中断、对吧? 在什么情况下、PA7不会生成 UDMA 请求并生成中断。 在 ISR 中、我看到您在其字段上手动操作 uDMA 控制表。 我没有看到有人这样做。 我觉得这是很有风险的。 当 您在 ISR 中写入控制信息时、如何保证中间的 UDMA 内核不会使用这些信息。 控制表应在 UDMA 设置开始时初始化。 您为什么需要对表进行操作、以及要更改的内容?

     我还对您的 ADC 设置有三个注释。

     1.为什么要使用  ADC_TRIGGER_AUSE? 我建议您使用具有更好控制功能的计时器触发器或处理器触发器、尤其是对于您所拥有的复杂应用。  

     2.为什么 在步骤3和步骤7的代码中要有两次 ADC_CTL_IE。 您正在尝试为每个序列发生器生成两个 UDMA 请求? 为什么?  您应该移除步骤3中的 ADC_CTL_IE。  

     3.您没有指定哪个步骤是序列发生器中的最后一个步骤。 这不奏效。 请参阅 TivaWare 中的 ADC 示例。  您需要具有步骤7的 ADC_CTL_END 标志。  

    MAP_ADCSequenceConfigure (ADC0_BASE、0、ADC_TRIGGER_AUSE_0);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、0、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、1、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、2、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、3、ADC_CTL_CH5 | ADC_CTL_IE);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、4、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、5、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、6、ADC_CTL_CH5);
    MAP_ADCSequenceStepConfigure (ADC0_BASE、0、7、ADC_CTL_CH5 | ADC_CTL_IE);

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

     1. You use Timer0_B to generate a PWM on PB7.
    
      2. The PB7 is connected to PA7 configured as an GPIO input.
    
      3. PA7 will trigger a uDMA transfer on channel 4.
    
      4. uDMA channel 4 is configured to transfer from memory to the match register of Timer0_A which is configured for PWM on PB6 pin.

    没错。

    I really don't understand why you need to connect PB7 to PA7 for a uDMA trigger using GPIO. Why don't you consider to configure Timer0_B for periodic timeout and let the timeout directly trigger uDMA on channel19. Use channel 19 to change the duty cycle of timer0_A for PB6. 

    我还首先尝试了一个直接带有 UDMA 的计时器。 但我无法将 UDMA 配置为每个请求只发送一个项目。 在第589页的文档中、表格中显示 GP 定时器不会创建单个请求事件。 因此、我不得不思考一些问题。 我想到了使用 GPIO 作为 UDMA 单次请求。

    I also don't understand about the ISR such as uDMAGPIOAIntHandler. Why are they needed? If PA7 is used as uDMA request, it should not even generate an interrupt, correct? Under what circumstances will PA7 not generate uDMA request and generate interrupt instead. In the ISR, I see you manipulate the uDMA control table manually on their fields. I have not seen anyone doing this. I feel it is quite risky. How can you guarantee the control information is not used by the uDMA kernel in the middle while you are writing to them in the ISR. The control table is meant to be initialized in the beginning of uDMA setup. Why do you need to manipulate the table anyway and what are trying to change?

    我需要 ISR uDMAGPIOAIntHandler 来关闭信号。 一旦 UDMA 主和副传输完成、我就关闭计时器。
    因为这必须非常快地完成、所以我决定在这部分代码中不使用 TivaWare Lib。
    但我不更改 UDMA 结构。 我在 uDMA 结构中检查2个状态。 并关闭计时器。

    1. Why do you want to use ADC_TRIGGER_ALWAYS? I will suggest you use a timer trigger or processor trigger with better control especially for a complex application like you have. 

    感谢您的提示。 此外、还计划在未来使用计时器控制 ADC。 使用 ADC 的电流配置、采样率为31250赫兹。
    因为我要录制音乐、所以我需要44.100 Hz。 但现在31250赫兹已经足够了。
    触发器始终仅意味着 ADC 使用其设置的时钟或?

     2. Why do you have ADC_CTL_IE twice in your code for step 3 and step 7. You are trying to generate two uDMA requests per sequencer? Why? You should remove the ADC_CTL_IE for step 3. 

    我是这样做的、因为这是我理解的。 如果我想在更长的时间内连续记录。 现在有1024个样本。 然后、我必须像这样配置它。 我知道采样序列发生器应始终用50%的时间进行清空、以便可以再次填充其他50%的时间。  

    编辑:

    我已经对此进行了测试。 现在、我的录制需要两倍的时间。 需要32、6ms。 为什么会这样呢?

    问题没有解决。

    3. You didn't specify which step is the last step in the sequencer. This will not work. Please refer to ADC example in TivaWare. You need to have a ADC_CTL_END flag for step 7. 

    现在我不确定、但我将再次查看我的代码的旧版本。

    编辑:我使用它。 问题不会消失。

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

    您好!

     我的理解是、如果没有到 ADC 的 uDMA、8个 PWM (其中4个用作 UDMA 请求的触发器、另4个是具有可变占空比的实际 PWM)工作正常。 请再次确认是否是这种情况。  

     您能否提供一些数据点?  

     -仅 ADC 运行的 uDMA 和禁用计时器的所有其他 uDMA 通道时,用于 ADC 传输的 uDMA 是否会成功工作? 我想知道的是、您对 ADC 的 uDMA 设置是正确的。 如果它正在工作、并且我们已经知道 在没有 ADC 的情况下8 PWM 正常工作、那么这意味着软件方面很可能不是问题。 如果这确实不是软件问题、那么我认为这更是性能问题、TM4C123可能已达到一些性能瓶颈。 请注意、它不仅是 UDMA 传输、而且还需要在时间范围(44kHz)内对 CPU 进行所有数据后处理、以执行该操作可能已达到一些性能瓶颈。  

     -如果您从较少数量的 PWM 开始、会发生什么情况? 请仅尝试 一个 UDMA 通道、其中 PB7上的 timer0_B PWM -> PA7 -> UDMA 通道4 -> PB6上的 timer0_A PWM。 您是否会发现只有两个 uDMA 通道-通道4和通道 14存在问题?

     -逐步将 uDMA 通道的总数从2增加到3。 这次、您还将启用 UDMA 通道5。 这意味着通道4、5和14同时运行。 您是否会发现3个通道存在问题?

     您可以继续增加另一个频道。 您何时开始发现问题? 我希望您确认、随着通道的增加、问题就越明显。 相反、很少有通道出现问题。 如果您说无论通道数量如何、您都将始终看到问题、则需要返回软件端。  

     您不仅使用 ADC0,还使用 ADC1? 禁用 ADC1会产生影响吗?

     -您有 TM4C129 LaunchPad 吗? TM4C129是一款性能高于 TM4C123的处理器。 我很想知道 TM4C129是否有相同的问题。 如果 TM4C129可以在没有报告问题的情况下运行相同的代码、则很明显这是一个性能问题。  

     -我知道44kHz 是音频应用的理想采样频率。  您是否在实验中尝试过22kHz 或更低频率? 您是否会看到相同的问题? 我再次尝试确定是否达到某种性能瓶颈。  

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

    再次感谢您的帮助。
    我不知道错误在哪里。 软件或硬件、已经有点绝望了。
    今天我又花了一整天的时间。 以进一步缩小误差范围。 实际上、我已经没有使用4个 LED 信号、而是只使用1个 LED 信号时间。 但仍然是相同的误差图。
    但是、我现在可以说、如果我返回到较旧的软件版本。 然后继续。 但在这个较旧的软件版本中、我只能创建1个 LED 信号。 但我可以创建1个 LED 信号、并同时使用 UDMA 和 ADC0进行采样。
    没有错误。 这种气味可能是软件错误。 由于具有1个 LED 信号的旧软件版本和具有 ADC0采样的 UDMA 工作正常、但具有1个 LED 和 UDMA 的新软件版本不工作。
    软件配置不同。

    void GPIOPortBIntHandler(void)
    {
        MAP_GPIOIntClear(GPIO_PORTB_BASE, GPIO_INT_DMA);
        uDMADoneCounter = tick10ms;
        
        DEBUG_PE1 = GPIO_PIN_1; // DMA INT
        
        if ((uDMAChannelModeGet(UDMA_CH5_GPIOB | UDMA_PRI_SELECT) ==
                                UDMA_MODE_STOP))
        {
            DEBUG_PE3 = GPIO_PIN_3; // PRI STOPPED
        }
        if ((uDMAChannelModeGet(UDMA_CH5_GPIOB | UDMA_ALT_SELECT) ==
                                     UDMA_MODE_STOP))
        {
            DEBUG_PE4 = GPIO_PIN_4; // ALT STOPPED
        }
        
        DEBUG_PE1 = 0; // DMA INT
        DEBUG_PE3 = 0; // PRI STOPPED
        DEBUG_PE4 = 0; // ALT STOPPED
    }

    这有点不同。

    我只使用 Timer1、PB4是 LED 数据信号。 PB0通过电缆与 PB5相连。 UDMA 请求的寄存器。

    在这里、我也不会关闭 LED 信号。 LED 芯片在占空比为1-2%时未看到信号。

    这些是我的新发现。

    My understanding is that without the uDMA to ADC, the 8 PWMs (4 of them are used as a trigger for uDMA request and the other 4 are the real PWM with variable duty cycle) are working correctly. Please confirm again if this the case. 

    是的、没错。  我进行记录并等待它准备就绪。 然后我发送 LED 数据。

     Can you provide some data points? 

    您是指来自 ADC0的记录数据? 它来自麦克风。

    With only uDMA for ADC operating and all other uDMA channels for timers are disabled, will uDMA for ADC transfer work successfully?

    是的。

    What I want to know is that your uDMA setup for ADC is correct. If it is working and we already know the fact that the 8 PWM are working correctly without the ADC, then it means the software side is most likely not a problem. If it is truly not a software issue then I feel it is more a performance issue where TM4C123 may have reached some performance bottleneck. Note it is not just uDMA transfers but also all the data post processing the CPU within the timeframe (44kHz) is needed to perform that may have reached some performance bottleneck. 

    这也是我的想法、但如上所述。 如果我使用较旧的软件版本。 我能否使用1个 LED 数据信号与 ADC0同时采样。 使用具有4个 LED 数据信号的较新软件时、即使只激活了1个 LED 信号、它也不起作用。

    What will happen if you start with fewer number of PWM? Please try only one uDMA channel where timer0_B PWM on PB7 -> PA7 -> uDMA channel 4 -> timer0_A PWM on PB6. Will you see problem with only two uDMA channels - channel 4 and channel  14?

    我 今天已经尝试过这种方法。 但没有取得成功。

    Gradually increase the total number of uDMA channels from 2 to 3. This time you will also enable for uDMA channel 5. This means you have channel 4, 5 and 14 operating at the same time. Will you see problem with 3 channels?

    我现在还没有完成、因为1个信号已经不起作用。

    You can go on to increase another channel. When will you start to see problem? What I want you to confirm is that as more channels are introduced, the more apparent the problem will be. On the contrary, no problem is observed with few channels. If you say that you will always see problem no matter the number of channels then need to go back to the software side. 

    我也曾考虑过这一点。 但是、即使使用一个通道、它也不起作用。

    You not only use ADC0 but also ADC1? Will disabling ADC1 make a difference?

    因此、我一直使用 ADC0、即使对于较旧的软件版本也是如此。 ADC1现在在代码中是新的。 但目前尚未使用。 它只为未来做好准备。 可能评估2个麦克风。

    Do you have a TM4C129 LaunchPad? TM4C129 is a higher performance processor than TM4C123. I'm curious to know if TM4C129 has the same issue. If TM4C129 can run the same code without the reported issue then it is clear that it is a performance issue. 

    抱歉、不可以

    编辑:

    我刚刚查看了 EK-TM4C1294XL 的文档。 第682页的表中显示不可能有单个请求。 GPIO 和计时器都无法实现。

    I understand 44kHz is the ideal sampling frequency for audio application.  Have you tried 22kHz or lower as an experiment? Will you see the same problem? Again, I'm trying to determine if some sort of performance bottleneck is reached. 

    不可以。我明天可以尝试一下。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="512790" url="~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm -based-microcontrollers-forum/1119302/tm4c123gh6M-ADC0-sampling-with -udma-kided-a-timter-pwm-signal/4152287#4152287、但如果我现在可以说是旧版本、我可以返回到旧版本软件。] 然后继续。 但在这个较旧的软件版本中、我只能创建1个 LED 信号。 但我可以创建1个 LED 信号、并同时使用 UDMA 和 ADC0进行采样。

    如果旧版本同时使用1个 LED 信号和 ADC、我建议您返回到旧版本、并再次确认它仍然正常工作。 确认它按预期工作后、您将一次为2个 LED 添加通道、然后为3个 LED 添加通道、以此类推。 我认为这是最安全的方法。 当您开始使用简单的东西并开始工作、然后逐渐增加通道数量时、调试过程会更加容易。  

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

     I also don't understand about the ISR such as uDMAGPIOAIntHandler. Why are they needed? If PA7 is used as uDMA request, it should not even generate an interrupt, correct? Under what circumstances will PA7 not generate uDMA request and generate interrupt instead. In the ISR, I see you manipulate the uDMA control table manually on their fields. I have not seen anyone doing this. I feel it is quite risky. How can you guarantee the control information is not used by the uDMA kernel in the middle while you are writing to them in the ISR. The control table is meant to be initialized in the beginning of uDMA setup. Why do you need to manipulate the table anyway and what are trying to change?

    我没有完全理解您的意思。 我认为这是因为我只读了、所以这不是问题。

    我删除这些直接查询时。 问题也没有解决。

    我的意思是这些行: if (uDMAControlTable[72]=0 && uDMAControlTable[584]=0)....

      I really don't understand why you need to connect PB7 to PA7 for a uDMA trigger using GPIO. Why don't you consider to configure Timer0_B for periodic timeout and let the timeout directly trigger uDMA on channel19. Use channel 19 to change the duty cycle of timer0_A for PB6.

    这是可行的吗?
    但我希望每个 UDMA 请求只发送一个项目。
    我曾尝试过一次,但没有成功。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="512790" URL"~/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm -based-microcontrollers-forum/1119302/tm4c123gh6M-ADC0-sampling-with -udma-killed-a-timter-wm-sense/4157819#CONTROLQ=4u72[quale]&trale= DMA7819] (引用表=157819=[trines&trines&trines&trines&trines&trines&trines&trines&trines...[

    我不太确定为什么要检查整个主控制字和副控制字(整个32位)是否为零? 控制字有很多控制字段、为什么需要全部为0?

    [~删除这些直接查询后,引用 userid="512790" URL"/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1119302/tm4c123gh6M-ADC0-sample-wdma-ked-a-timer-pwm-sense/4157819#4157819]i。" 问题也没有解决。[/引述]

    很高兴这能解决您的问题。  

    [引用 userid="512790" URL"~μ C/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1119302/tm4c123gh6M-ADC0-sampling-with -udma-kated-a-timter-pwm-signal/4157819#4157819#4157819]单个项目、但我只希望发送一个 UDMA 请求。
    我尝试过一次,但没有成功。[/引述]

    看起来计时器模块只生成突发请求。 根据数据表、如果您将仲裁大小配置为1、则即使是突发类型、它也只应传输一个项目。 但是、这可能对您不起作用。 原因是、在一个项目被转出后、如果没有更高优先级的信道需要服务、它将尝试传输剩余的项目。 您可能还需要将项目数量设置为1。 您需要确定您的应用是否可以适应此限制。 否则、您需要使用当前的操作-将 PWM 路由到 GPIO 输入、并使用 GPIO 生成单个请求。  

    猝发请求
    当检测到猝发请求时、μ μDMA 控制器将传输的数据单元数
    仲裁数目或传输中剩余的数据单元数中的较小值。 因此、仲裁
    大小应与外设在时可以容纳的数据项数相同
    发出突发请求。 例如、UART 模块根据 FIFO 触发器产生猝发请求
    电平。 在这种情况下、仲裁数目应设置为 FIFO 可以传输的数据量
    触发电平的情况下运行。 猝发传输一旦开始就会运行到完成、并且无法完成
    中断、即使是由更高优先级的通道中断。 突发传输在比的时间短的时间内完成
    相同数量的非突发传输。

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

    感谢您的帮助!

    您能否确认不允许对 UDMA 控制表进行读取访问? 除通过驱动程序库外。

    I'm not too sure why are you checking for the entire primary and alternate control word (the entire 32 bit) to be zero? The control word has many control fields and why do you need all of them to zeros?

    我想使用此命令来查看传输是否就绪。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="512790" URL"~μ C/support/microcontrollers/arm-based microcontrollers-group/arm -based-microcontrollers/f/arm -based-microcontrollers-forum/1119302/tm4c123gh6M-ADC0-sampling-with -udma-kided-a-timter-pwm-sense/4158546#4158546#4uDMA 是否允许访问 UDMA 表?] 除通过驱动程序库之外。[/quot]

    我看不到为什么您的自定义代码无法读取控制表。 在传输过程中写入控制表可能会导致问题、但这不是您所做的。  

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

    抱歉、错误未消失。
    正如您所写的那样。 我将 LED 信号从4减少到3、然后减少到2、再减少到1。 我无法通过执行此操作来修复错误。
    如果我同时发送 ADC0音乐样本、然后同时发送 LED 信号、则计时器的错误才会出现。
    只要我发送 LED 信号而不使用 ADC0对音乐进行采样、计时器就会运行。

    我有2个计时器问题。
    一个周期完全消失。 如上图所示。 (PB4 LED 2)。
    或 UDMA 不能及时更新匹配寄存器。

    什么会导致计时器周期故障?

    如果我使用 LED 信号、即 Timer1A 和 Timer1B、同时使用 ADC0样本。 这是否是性能问题?

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

    我想您在下面写下了您的旧版本代码 、它适用于带有 UDMA+ADC0的一个 LED。  

    "但是、我现在可以说、如果我返回到较旧的软件版本。 然后继续。 但在这个较旧的软件版本中、我只能创建1个 LED 信号。 但我可以创建1个 LED 信号、并同时使用 UDMA 和 ADC0进行采样。"