器件型号: MSPM0G3507
ADC_with_DMA_stop_and_start_issues.pdfadc_with_dma_start_stop_issue.zip
您好:
在随附的文件中、我们讨论了 ADC 的问题、还添加了一些示例代码。
请查看并解释或建议修复行为的步骤。
BR
Norbert
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.
器件型号: MSPM0G3507
ADC_with_DMA_stop_and_start_issues.pdfadc_with_dma_start_stop_issue.zip
您好:
在随附的文件中、我们讨论了 ADC 的问题、还添加了一些示例代码。
请查看并解释或建议修复行为的步骤。
BR
Norbert
尊敬的 Norbert:
在第一种情况下、用户清除 ENC 位、可以看到 ADC 出于某种原因执行转换。
我有一个猜测:
ENC 清零后、ADC 有效、等待下一个触发信号。 如果配置的所有通道都需要有效触发器、它将转换一个后续通道。 如果只有最后一个通道配置为有效触发器、则它将在最后一个通道结束。
为了快速验证它、我建议您读取 RIS 位以看看如果您在 MEM0 之后和 MEM1 之前清除 ENC、是否已加载 MEM3。 ->确保在 DMA 完成中断中、您将清除 MEM0~MEM3(通道 0~3)的 RIS 位。
->如果怀疑是正确的、则只有 MEM2 将设置为下一个计时器触发器。 MEM3 将不会被设置。
B.R.
Sal
至于权变措施、我有以下一些建议:
#1 在 ADC 模块中添加禁用 DMA

添加以下内容:
DL_ADC12_disableDMATOR (ADC1、DL_ADC12_DMA_MEM0_RESULT_LOADED <<(num_of_samples-1)); //在最后一次采样时触发
DL_ADC12_disableDMA (ADC1);
ADC 模块中的 DMA 传输。
注意:
我看到您在文档中提到了相关内容、但我没有在 adc_stop () 中看到禁用行为。
生成#2 停止计时器事件以禁用 ADC 转换
停止计时器-> DL_TimerG_disableEvent ->启用计时器。
直接禁用事件可能可以在不停止计时器的情况下工作。
#3 复位 ADC 和 Re 配置 ADC
要停止 ADC:
清除 ENC 位、复位 ADC
若要启动 ADC:
启用 ADC 电源、使用预设参数配置 ADC、设置 ENC 位以接收计时器触发事件
B.R.
Sal
感谢您发送编修。
我是 Norbert 的同事。
在 ENC 清零后、ADC 处于活动状态、接收到下一个触发信号。 如果配置的所有通道都需要有效触发器、它将转换一个后续通道。 如果只有最后一个通道配置为有效触发器、则它将在最后一个通道结束。
是的、这也是我们在屏幕截图中看到的内容。 问题在于参考手册中关于此行为的不明确文档 、这导致花费了大量时间来调查其引起的副作用的根本原因。 我们是否应该期待手册的更新与澄清的解释? “主要问题“的第二点也仍然是开放的。
关于变通办法、下面我有一些建议
您能否澄清一下这些解决方法是否与第一个问题或第二个问题有关?
#1 在 ADC 模块中添加 DMA 禁用
在我们的示例中、我们在 ADC_Stop () 中禁用 DMA 通道、(在第二个“固定“示例中)、在 ADC_Start () 中启用通道之前清除待处理的 DL_ADC12_DMA_MEM3_RESULT_LOADED。 是什么造成了禁用 DMA 触发器的必要性、它应该解决哪些问题? 我们希望对这一制度有更深入的了解、以便更有效地解决今后可能出现的问题。
#2 停止计时器事件生成以禁用 ADC 转换
据我所知,它是 ADC_Stop () 的潜在“替换“,对吧? 来停止触发、而不是 强制 ADC 停止转换? 虽然这是一种稳健的方法、但我们仍然想专注于停止 ADC 本身的方法、而无需与 触发 ADC 的外设交互。
[报价 userid=“522967" url="“ url="~“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1621927/mspm0g3507-adc-does-not-propperly-start-and-stop/6256742 ]#3 重置 ADC 和 Re 配置 ADC这是我们希望在系统中避免的方法。 在我们重新启动 ADC 配置时、ADC 配置必须保持不变。
对文件中的问题 (“主要问题“、“附带问题和澄清“)的答复正在进行中、我们 应该期待这些问题在以后的某个时候得到答复、对吧?
如果您对准备好的文档或代码示例有疑问或不可重现、请告知我们。
BR、
Oleksandr
尊敬的 Oleksandr:
我们是否应该期待手册的更新以及明确的解释? “主要问题“的第二点也仍然是开放的。
当然、 我将在内部讨论、以了解如何添加对此器件的其他说明。 可能优先选择应用手册、因为这是一个独特的应用场景。 请告知我、您是否对本案例有任何新发现。
能否说明这些变通办法是否与第一个问题或第二个问题有关?
建议采用权变措施来解决此特定问题:在触发 DMA 完成中断的最后一个通道之前禁用 ADC 转换可能会导致软件逻辑上的中断时序冲突。
什么也产生了禁用 DMA 触发器的必要性、它应该解决哪些问题? 我们希望对该系统有更深入的了解、以便更有效地解决未来可能出现的问题。
根本原因目前尚不清楚。 我将进行一些实验测试、以挖掘更多详细信息、如果您能分享对建议的一些发现、我会很高兴。
对文档中的问题 (“主要问题“、“附带问题和澄清“)的回答正在进行中、我们应该期待这些问题在稍后的某个时间进行、对吧?
是的、虽然我现在优先考虑 ADC ENC 行为和 DMA 触发逻辑研究。
有关第二个问题的问题->中断丢失、我可以检查以后是否明确阐明了第一个问题。 ->我认为如果第一个问题得到解决,我们可能不会遇到第二个问题,我们可以在以后挖掘。
B.R.
Sal
根本原因目前尚不清楚。 我将进行一些实验测试、以挖掘更多详细信息、如果您能分享对建议的一些发现、我会很高兴。
[/报价]
明白了、感谢您的澄清。 我测试了此建议、发现与 ADC_Stop -> ADC 已停止的“第二个“实现中的行为相同、我在调用停止函数后没有观察到冗余中断。 但是、第二个问题仍然存在: 在随机时间点、ADC 在启动功能之后不会再次启动、并卡在所附文档的“第二个面临的问题(需要重现的条件不明确)“中所述的状态
我们将等待您的进一步澄清,并 在发现更多的情况下通知您。
BR、
Oleksandr
嗨、Alex、Oleksandr、
我做了一些实验来深入分析这一问题。
对于序列模式下的 ADC 行为(下一次转换需要有效的选通信号)、可以通过以下观察结果得出:
当 ADC 在序列模式下被禁用时、它在下一个触发信号处于活动状态、并且在接下来的另一个触发信号处于非活动状态
2.在序列模式下禁用 ADC 时、ADC 可能正在进行转换(当前未采样的转换和下一个有效转换)、然后生成事件(用于中断或 DMA)
3.当 ADC 在序列模式下被禁用、然后被启用时、以下转换从 MEM0 开始、但在序列模式的中间停止。 这意味着、ADC 转换计数不会在禁用 ADC 的情况下清除。 因此 ENC 会在 ADC 转换过程中自动清零
3.a 问题 3 仅在用户未正确禁用事件时发生、如果用户正确清除事件触发器、则问题不会继续存在。
4.在序列模式下禁用 ADC 时、如果有持续发生的事件、则将有 1 个事件待处理以进行 ADC 转换。 启用 ADC 后、转换立即从 MEM0 开始一次、然后等待触发信号。
因此、用户不能立即停止 ADC。 应该添加一些额外的操作来处理 ADC/DMA 状态。
我已创建了一个推荐流程:
void USER_ADC_STOP(void){
// stop event
DL_TimerG_disableEvent(TIMER_0_INST, DL_TIMERG_EVENT_ROUTE_1, (DL_TIMERG_EVENT_ZERO_EVENT));
// stop adc
DL_ADC12_disableConversions(ADC1);
gEnableADC = false;
}
void USER_ADC_START(void){
// enable dma
if(!DL_DMA_isChannelEnabled(DMA, DMA_CH0_CHAN_ID)){
DL_DMA_setSrcAddr(DMA, DMA_CH0_CHAN_ID,
(uint32_t) DL_ADC12_getMemResultAddress(ADC12_0_INST, DL_ADC12_MEM_IDX_0));
DL_DMA_setDestAddr(DMA, DMA_CH0_CHAN_ID, (uint32_t) &gADCSamples[0]);
DL_DMA_setTransferSize(DMA, DMA_CH0_CHAN_ID, ADC_SAMPLE_SIZE);
DL_DMA_enableChannel(DMA, DMA_CH0_CHAN_ID);
}
// start adc
gEnableADC = true;
DL_ADC12_enableConversions(ADC1);
// start event
DL_Timer_clearEventsStatus(TIMER_0_INST, DL_TIMERG_EVENT_ROUTE_1, (DL_TIMERG_EVENT_ZERO_EVENT));
DL_TimerG_enableEvent(TIMER_0_INST, DL_TIMERG_EVENT_ROUTE_1, (DL_TIMERG_EVENT_ZERO_EVENT));
}
void ADC12_0_INST_IRQHandler(void)
{
switch (DL_ADC12_getPendingInterrupt(ADC12_0_INST)) {
case DL_ADC12_IIDX_DMA_DONE:
/* gCheckADC++; */
if(gEnableADC){
/* configure DMA&ADC to start next transfer */
}
break;
default:
break;
}
}
一般来说,我认为混乱的事件系统会导致一些意想不到的观察。
B.R.
Sal
嗨、Sal!
感谢您的研究。
你的第一点和第二点是明确的--它们对应于“ 第一个问题 “从我们的文件中、对吧? 解决方案基本上是忽略带有软件标志的最后一个可能的 IRQ。
第 3 点解释了“ 第二个问题 “从我们的文档中? 我将尝试重新措辞、以检查我是否正确:
在不幸的时序下、由于混乱的事件系统结果(硬件错误,我假设?)、当我们在转换过程中停止 ADC 时、内部计数器不会被清除。 ADC 再次启动后、转换从 MEM0 开始、并且对于配置的转换次数不持续、但对于内部计数器中剩余的量、不会生成 DMA 的触发信号、我们绝不会进入 IRQ 处理程序来准备新序列、我们看到系统卡住了?
设计团队是否会对此进行进一步调查并在未来的勘误修订中进行介绍? 这可能会对使用 ADC 的应用产生很大影响、甚至是事件发布系统的更大问题、影响更多的外设。
使用我们分享的示例、我可以确认在应用计时器事件的启用/禁用后、第二个问题无法重现。
但是、由于 ADC 可以订阅任何事件(不一定是计时器)、因此在这种情况下会产生什么影响? 我很快就测试了一个解决方案、其中我将 DL_TimerG_enableEvent 替换为 DL_ADC12_setSubscriberChanID (timerID)、将 DL_TimerG_disableEvent 替换为 DL_ADC12_setSubscriberChanID (0)、并且该问题至今未重现。 是否可以替代禁用事件发布者?
第 4 点是新的、与触发器和序列的同步有关? 待处理事件是否由 DL_Timer_clearEventStatus 清除?
BR、
Oleksandr
尊敬的 Oleksandr:
您的第一点和第二点是明确的--它们对应于“ 第一个问题 “从我们的文件中、对吧? 解决方案基本上是忽略带有软件标志的最后一个 IRQ。
是的、如果我们确实按下了转换窗口 (us level)、那么我们需要处理正在进行的 ADC 转换。 中断预计会被触发、而停止。
第 3 点解释了“ 第二个问题 “从我们的文档中? 我将尝试重新措辞、以检查我是否正确:
是的、这是我的怀疑。
设计团队是否会对此进行进一步调查并在未来的勘误修订中进行说明? [/报价]是的、我在内部设计团队讨论的第 3 个问题示例中有问题。 ->进行中。
对于此怀疑、我需要多做一些测试用例、然后与设计团队讨论。 ->当我回到办公室时我会跟进。 我是 OOO、在接下来的两周出差。
但由于 ADC 可以订阅任何事件(不一定是计时器)、因此这种情况会有什么影响? 我很快就测试了一个解决方案、其中我将 DL_TimerG_enableEvent 替换为 DL_ADC12_setSubscriberChanID (timerID)、将 DL_TimerG_disableEvent 替换为 DL_ADC12_setSubscriberChanID (0)、并且该问题至今未重现。 是否可以替代禁用事件发布者?它看起来很好。 就像事件通道被禁用(设置为 0)一样、即使计时器连续生成事件、ADC 也不会订阅该事件、并且其内部事件系统保持不变。
第 4 点是新的、与触发器和序列的同步有关? 挂起事件是否由 DL_Timer_clearEventStatus 清除?我认为这是 ADC 事件系统内部的一团糟、因为每个 PWM 周期都会有来自计时器的事件、而禁用 ADC 转换以处理触发事件。
DL_Timer_clearEventStatus 没有帮助。
B.R.
Sal
[/quote]