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.
工具与软件:
我需要一个环形缓冲器来设置高电平、可以保留来自 ADC 通道的256、当某个值超过某个阈值时、只继续采样192次而不是停止。
我使用中断来使它缓慢运行、但现在我想看看它的运行速度有多快。
在可能的最大速度下执行此操作。 我想先回答这个问题、然后再浏览完相关文档(需要解析的内容很多)。 几个问题...
1) 1)首先、我需要注意、我没有外部时钟、因此我认为我限制在32MHz CPUCLK 和 ULPCLK 在这些限制下、ADC 的最大吞吐量是多少?
2)附带问题、我使用 SysConfig 设置芯片、现在我看到有人参考了模拟配置器、是推荐配置器而不是其他配置器? 我尚未安装模拟配置器、我尚未了解它的功能或如何与 CCS 配合使用。
3) 3)我在填充环形缓冲区、FIFO 或 DMA 方面的最佳选择是什么? 我可以想象从 FIFO 中调用、检查阈值、然后将其放入我自己的缓冲区。 如果我从 FIFO 中获取、我想我能够以最大采样速度执行该操作吗?
4) 4)如果我使用 FIFO、我怎么知道 FIFO 中有多少商品? 我看到 CCS 函数 DL_ADC12_getFIFOData、我在技术参考中看到了寄存器、但我看不到计数。 我也看不到数据格式。 在另一篇 e2e 文章中、我看到了有关数据的数据有效位的一些内容、但我看不到它。
5) 5)我需要使用 DMA 吗? 您将如何使用 DMA 执行诸如环形缓冲器之类的操作、以及是否会中断样本? (我可以想象设置一个 DMA 来处理32个样本、然后在完成后移动缓冲区位置并重新启用 DMA、然后在这段时间内我可以尝试遍历前面的样本以查看是否需要停止。
6) 6)无论我如何获取数据、我都在想象 ADC 样本会自动运行、哪种方法最好? 我已经将 ADC 设置为触发计时器中断、但然后我必须查看 ADC 中断以便允许它再次采样、这是必要的步骤吗? 或者是否有办法让 ADC 持续工作?
您好!
1) 1) ADC 通道的总转换时间与两部分相结合:ADC 采样+ ADC 转换:
2) 模拟配置器专为实现 MSPM0评估的一些简单模拟外设连接而设计、不建议将其用于工程师开发。
3) 4)我们只能获得 FIFO 状态(如满、空)、你可以在 FIFO 中提取数据、直到它获得空状态
5) 5)是的、我认为您的建议没有问题、DMA 可以在没有 CPU 的情况下实现数据传输。 但存在一个问题、DMA 目标地址可以设置为固定地址或增加1、2。、但我认为它不能满足您的环形缓冲区函数要求。
6) 6)您可以使用计时器来持续触发 ADC 采样、并且在 ADC 模块中、您只需启用"REPEAT MODE"、而且它可以连续转换、无需任何其他"启用"操作。
此致、
Pengfei
我希望在任何答案中提供详细信息。
1) 1)如果转换花费1us、那么 ADC 怎么会是4Msps?
3/4)什么寄存器和位? 您能否指出文档和 CCS 名称?
6)你能告诉我如何做这件事吗? 在 SLAU846B 中、我看到"重复模式"只有一个位置、在它周围、有重复模式的参考、但是不知道如何操作。 在 SysConfig 中、我按我的最佳猜测设置了 ADC、并让其在发生事件、来自计时器的事件时触发、但 FIFO 数据始终为0、我不确定如何判断转换是否触发。
您好!
1)我的意思是"小于"1us ,实际上确切的转换时间是12*1/CMD->0.15us 80MHz。 您可以参考 TRM 10.2.8采样触发源和采样模式 了解 ADC 采样时序的更多详细信息。
3) 4)很抱歉我需要更新、FIFO 空或满状态只能通过 OVIFG 和 UVIFG 标志进行检查。 您可以使用 ADC 结果加载中断或 DMA 来获取结果。
6) 6)可以在 SysConfig 中配置重复模式。 在重复模式下、ADC 转换将始终启用、且可在触发信号处连续触发 ADC 采样。 对于计时器事件触发器配置、我想您可以参考示例 adc12_synchronous trigger_event_lp_MSPM0G3507_nortos_ticlang。
此致、
Pengfei
3/4
a)您能详细了解这一点吗? 如果 FIFO 中只有当您下溢或等待 FIFO 溢出时、唯一的方法就是尝试读取 FIFO、这是毫无意义的。
b) DAC 的 FIFO 在可配置级别具有中断、这也会起作用、该 FIFO 可用于 ADC 吗?
c) ADC FIFO 多大?
D)如果我无法直接使用 FIFO、那么需要 DMA、我看到存在一个示例、但我需要知道的是、DMA 完成后 FIFO 会发生什么情况。 例如、如果 FIFO 为8深度、DMA 设置为16、那么当我获得 DMA 完成中断时、假设我排队等待一个进程以处理新数据。 我会将 DMA 目标移动到一个新位置并再次启用 DMA、但到目前为止、出现了2个 ADC 样本、它们是否覆盖了现有缓冲区中的任何内容? 他们迷路了吗? 它们在 FIFO 中正在等待? 并将在重新启用 DMA 后立即传输?
您好!
b) ADC 可以使用"结果加载"来触发中断或 DMA 操作。
c) ADC FIFO 由 ADC MEMRES 进行组织、MSPM0G3507 ADC 模块中有6 * 32位 FIFO。
d) 我们提供了一份具有 ADC 的 MSPM0 DMA 乒乓应用手册来回答您的问题:具有 ADC 的 DMA 乒乓(修订版 A)
此致
Pengfei
b)
我不知道你在建议什么,通常当使用 FIFO 时,它是因为有一些延迟,直到你有时间从它拉数据,在那一点,你不知道有多少在其中。 这就是使 FIFO 有用的信息。
c)
您能向我介绍一下 FIFO 组织和使用的文档吗? 您是说存在6深32位宽的单 FIFO 吗?
d)
感谢您指出这个示例、我没有意识到 MSP_subsystem 有示例(与我之前查找的文件夹相似:driverlib)
我想我能够在我的代码中实现这一点、我不能确定、因为当我获取样本时、它们看起来有点滑稽。
我将尝试减慢采样的信号、以便更好地了解问题是什么、但我也对示例有很多问题。
它将 DMA 样本计数设置为6并将启用 DMA 触发器设置为 Mem11、为什么以及有什么效果?
5)
这是我想做的,所以我想详细说明我想说什么...
我将会得到一个大小为 16x32个样本的环形缓冲区、而不是假设512个样本的环形缓冲区。 其中的 DMA 将为32、每次 DMA 完成时、我都会转到16个块的下一个。 重新写入块、直到我希望它停止。
为了将处理时间保持在最低、我想使用:
12.2.12.2窗口比较器
ADC 中有一个可用的窗口比较器单元
通过这种方法、我不必查看所有数据、可以使用窗口比较器来了解何时停止采样。
a)与我所描述的内容有关的任何问题?
b)如何在 SysConfig 中启用比较器? 我看到它作为 ADC 的中断输出、但我无法选择它(我必须先插入它?)
您好!
首先让我回答您的一些问题:
C)您可以参考 TRM 10.2.12.3 DMA 和 FIFO 操作 .
5A) 我不确定您的窗口比较器的输入是多少? 要何时停止 ADC 转换?
5 b)您可以参考我们的 COMP SDK 示例、它可以来自外部引脚或 DAC 或 OPA 输出。
此致、
Pengfei
3/4
c)
它是 TRM 10.2.12.3. ? 人们应该如何知道这些文档在哪里。 如果我在 google 上搜索、我只会找到一个 E2E 参考、但没有链接。 在 MSPM0_SDK_MSPM0中进行搜索 User_Guide 时没有显示任何内容。 说实话、我想我忽略了 TI 的开发工作的总体规划。 我试着从数据表和技术参考开始、SDK 有很多文件夹、是否有其他位置可以了解如何导航 SDK? 我看到了顶级用户指南。
一般来说,我很沮丧,如果我需要实施的东西,我必须花几个小时搜索它的参考。
您有什么有用的建议吗?
5)
我指出的部分是:
ADC 中有一个可用的窗口比较器单元可用于检查输入信号是否存在
设置的预定义阈值内。 进入 MEMRES 或 FIFO 的 ADC 结果就是得到的结果
以便对照窗口比较器的阈值进行检查。
我刚找到 ad12_window_comparator、它使用了我想要的功能。 (几乎)
我尚未编译测试、因为这需要对我的代码进行相当大的修改。 令我担忧的是、此功能现在具有额外的"触发模式"、似乎表明除非满足窗口关键字、否则样本可能无法流向 FIFO? (完全不是我需要的、我只想接收中断)
您好!
#1对于 ADC FIFO 信息、抱歉、我使用了较旧版本的技术参考手册。 您可以参阅 MSPM0 G 系列80MHz 微控制器的12.2.12.3 DMA 和 FIFO 操作技术参考手册(修订版 B)。
#2要快速开始使用 CCS/SysConfig/MSPM0 SDK、您可以参考 MSPM0设计流程指南(修订版 D)。 它包括"必须开始使用 MSPM0 "的一些分步介绍。
#3 "触发模式"是说是否需要满足"触发源"条件才能使 ADC 阶跃到下一个转换。 如果您使用此示例的默认配置、 ADC 将在生成第一个软件触发器(DL_ADC12_startConversion (ADC12_0_INST);)后持续采样。
此致、
Pengfei
我实施了一些具有256 DW 缓冲器的代码、并正在执行16DW DMA 来填充(每次将指针32 (16位)样本提前)。
它大部分工作正常、但我在数据中看到了一些奇怪的问题。
为了尝试消除以下问题:如何推进指针、何时并重新启动 DMA、我将 DMA 大小更改为满缓冲区、我尚未完全验证我的设置是否正确、但该错误的显示方式、我想您可能已经有了一个想法...
底部是我收到的数据、顶部是我进行几次数据交换后显示的数据。
在我看来、有趣的是数量大约为6、DMA Samples Count 为6。 有时数据的顺序正确、有时则不正确。
有什么建议吗?
您好!
我得到的观点是、如果我们更改某些结果顺序、结果将变得平滑。 但我看到"错误数据"量不是确切的6 (某些时间5或7从图片)。 我不确定是不是由 DMA 引起的。
您能否提供您的 DMA 的配置? (源地址和目标地址、这些地址的增量)
我认为、通过将 DMA 大小配置为一个较大的大小(例如您将大小配置为缓冲区)并再次测试、结果可能会显示"错误数据"是否与 DMA 大小相关。
此致、
Pengfei
那是全尺寸的 DMA 传输、尽管在调试中我看到了一些我没想到的其他东西。
我很惊讶在我的中断例程中 DMA 完成
我做的第一件事
DL_ADC12_stopConversion (ADC12_1_INST);
之后、在设置下一个 DMA 之后会用到
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
DMA 在我执行 startConversion 之前完成、我在 Studio 中单步执行这一行、DMA 大小变为零、缓冲区数据发生了变化。 如果我停止转换、原本预计 FIFO 中不会有数据进入、因此 DMA 将无法继续运行。 对此有什么想法吗?
关于未命中排序数据、这里是转储、这有您请求的内容吗?
e2e.ti.com/.../ti_5F00_setup.txt
尊敬的 WorkerBee:
我从这个问题中假设:我们的 DMA 使用它的"DMASZx = Zero"作为传输完成中断的触发条件。 因此、如果您不再次重新配置 DMA 通道、整个中断将保持被设置状态。
您可以在 DMA 完成中断中尝试以下步骤(关于 DMA):
此致、
Pengfei
我想我的问题没有明确...
主要的问题不是我不能让 DMA 去或完成,它的中间的数据似乎错了顺序,你请求我提供的设置。 如果您看的话、这种转移应该非常大、并且错误顺序在它的中间多次发生。
我问了另一个问题,但这更多的是好奇心。 同样、这不是 DMA 不会出现的问题、我说的是、转换停止时、当我启用通道时、似乎 ADC 仍在运行、DMA 已完成、但我想、如果我有 DL_ADC12_stopConversion、DMA 和转换直到我再次开始转换才会做任何事情。 您可以忽略这个问题、因为它没有凹凸
尊敬的 WorkerBee:
我想您可以清楚地描述您的问题。
对于主要问题、抱歉、我不知道为什么结果目前会出现错误的订单。 如需详细了解 DMA 配置、SysConfig 和源代码可能会有所帮助。 我想知道的是 DMA 地址配置以及如何在 DMA 完成后更新地址。
对于另一个问题、我理解您的观点。 请看我最后的答复。 我是说"DMA 完成"是通过 DMA 大小减小到零来触发的。 因此、如果 在最后一次 DMA 完成后没有通过 DL_DMA_setTransferSize ()重新配置 DMA 大小、则"DMA Complete"可能会再次发生、因为 DMA 大小保持为零。 所以我建议您在 DMA 完成中断中重新配置 DMA 地址和大小。
此致、
Pengfei
对于背景信息、基本上如果您还没有弄清楚、我要将其用作逻辑分析仪、捕获波形。 我设置了触发值和类型、以及在触发1/4、1/23/4之前的存储量。 因此、我使用窗口中断来决定在发生后要继续捕获多少数据。
我想我提供的寄存器转储中包含了有关这两者的信息、它显示了我的所有 DMA 和 ADC 设置。 您可以在启用 DMA 和开始转换前了解其设置情况。
那么、关于顺序错误的数据、我将通过一些额外的代码信息来跟进。
关于另一个问题、我想说的是、我已经完成了... 我可以看到大小不为零、然后在调试器中我单步执行 DMA 启用后、我可以查看寄存器和大小变为零以及缓冲区中有新数据。 因此、停止转换似乎不会停止样本发生、而且一旦我启用通道、它就会完成、因为样本仍在发生。
我的代码有点复杂,但我将尝试总结步骤... 我可以给你我的代码,但我不希望完整的代码公开,如果你有另一种联系方式。
设置:
DL_ADC12_disableDMA (ADC12_1_INST);
DL_ADC12_stopConversion (ADC12_1_INST);
DL_DMA_setSrcAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t) DL_ADC12_getFIFOAddress (ADC12_1_INST));
DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&pbuffer_[0]);
DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、ADC_FIFO_SAMPLES);
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
DL_ADC12_configWinCompLowThld (ADC12_1_INST、0x0);
DL_ADC12_configWinCompHighThld (ADC12_1_INST、0x800);
DL_ADC12_startConversion (ADC12_1_INST);
DL_ADC12_enableDMA (ADC12_1_INST);
窗口中断时:
我计算要在结束数据采集之前传输多少次 DMA 突发。
DL_ADC12_configWinCompLowThld (ADC12_1_INST、0xFFFF);
DL_ADC12_configWinCompHighThld (ADC12_1_INST、0x0);
(我的窗口中断是 在两者都为 true 时发生、不应发生这种情况、所以基本而言禁用窗口中断)
在 DMA 完成中断上并且我的缓冲区的最后一部分已经传输:
DL_ADC12_disableDMA (ADC12_1_INST);
DL_ADC12_stopConversion (ADC12_1_INST);
关于 DMA 完成且最后一个部分尚未转移
next_+= ADC_SAMPLE_SIZE;//dma 刚刚完成、因此使索引前进
if ((next_+ ADC_SAMPLE_SIZE)> length_) next_= 0;//如果下一个索引加上缓冲区大小超过缓冲区长度、则将其设置回0
DL_DMA_setDestAddr (DMA、DMA_CH0_CHAN_ID、(uint32_t)&pbuffer_[next_]);
DL_DMA_setTransferSize (DMA、DMA_CH0_CHAN_ID、ADC_FIFO_SAMPLES);//??? 需要这个吗??
DL_DMA_enableChannel (DMA、DMA_CH0_CHAN_ID);
DL_ADC12_enableDMA (ADC12_1_INST);//??是否需要???
正如我前面所说的、本设计旨在将大缓冲区拆分为许多较小的传输(这样我就有一些触发粒度、我可以使用窗口触发以在它周围选择一些量...
在"Setup"注释中、我禁用 DMA、以便可以取消任何现有操作并完全重新启动。 如果捕获操作处于活动状态但从未触发、则有人想要重新启动它。
尊敬的 WorkerBee:
[报价 userid="558080" url="~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1473483/mspm0g3507-configuration-for-max-adc-throughput/5695429 #5695429"]我可以看到大小不为零、然后在调试器中我单步执行 DMA 启用后、我可以查看寄存器情况、大小变为零以及缓冲区有新数据。 因此、停止转换似乎不会停止采样、而且我一启用通道就完成了、因为采样仍在进行。我很抱歉误解了您的澄清。 并且感谢你的耐心,简单的设置,你附加的代码似乎很好. 我曾请求与您建立友谊、您可以发送我的示例、这样我就可以更方便地重现您的问题并进行进一步分析(SysConfig 配置也是一个重要部分)。
顺便说一下、我这边的另一个假设是、如果 DMA 大小小于 FIFO 大小、则可能在您停止 ADC 转换之前、ADC 会持续采样(如果采样率非常高)并且 FIFO 已满或接近满。 所以、在您启用 DMA 和转换后、DMA 传输就完成了。
谢谢、此致、
Pengfei
我采用了取样的乒乓、并对其进行了微小的修改(速度、哪个通道)
我跑了2个断点(先填充一次弹球、然后弹球)
然后从调试程序中复制值并将其粘贴到 Excel 中进行创建:
e2e.ti.com/.../adc_5F00_dmg_5F00_ping_5F00_pong_5F00_512fast.zip
问题似乎重现了、因此这应该很容易让您处理。
谢谢你。
尊敬的 WorkerBee:
非常受欢迎。 我将根据该示例进行测试并进行更新。
此致、
Pengfei
尊敬的 WorkerBee:
感谢您的示例确定问题。 我还可以在本示例中重现相同的问题。
实际上、在该示例中应用了高采样频率时会发生该问题。 根本原因是:
有关 DMA 传输完成后运行的 ADC 的另一个问题是 ADC 模块的正常操作。 因为我们将 ADC 配置为重复模式、并且就在"DL_ADC12_startConversion ()"之后、ADC 将持续采样和转换、直到 DL_ADC12_stopConversion ()被执行。
此致、
Pengfei
e2e.ti.com/.../e2e_5F00_adc_5F00_dma_5F00_ping_5F00_pong_5F00_512fast.zip
更好、仍然有几个问题。
实际采样周期是多少? 我想我在 SysConfig 中看到它、但现在看不到。
存在"所需采样时间"、如果我将其设置为0、则表示实际值为0。。。 它不能是0、对吧?
采样时间如何转换为采样周期?
在运行乒乓测试时、我想 Ping 和 Pong 之间会丢失数据。
我运行测试、发现 Ping 和 Pong 之间缺少12个样本。 (512标记前后的周期较短。
忽略红线、我想我已经读到 Vref 需要时间来稳定、我假设 这就是发生的事情。 因此、我并不担心。
尊敬的 Worcurbee:
很抱歉这么晚才回复。
存在"所需采样时间"、如果我将其设置为0、则表示实际值为0... 它不能是0对吗?
"Desired Sample Time"用于设置采样计时器计数器值、不能为零。
一个完整的 ADC 采样过程为"采样+转换"、在本例中、在一个转换完成后、下一次采样继续。 在本例中、由于 ADCCLK 为32MHz、因此转换约为6个 ADCCLK 周期(187ns)、采样时间设置为250ns、且不同样本之间有一个周期、因此采样时间约为500ns。 并不存在采样周期的确切值。 如果希望以高精度采样周期进行采样、可能需要使用计时器事件触发器。
当我运行乒乓测试时、我认为 Ping 和 Pong 之间数据丢失了。
在该示例中、在 MCU 重新配置 DMA 期间、ADC 采样数据将丢失。 因此、乒乓传输过程中可能会丢失一些数据。
此致、
Pengfei
那么、有人如何获取所有数据呢?
一般而言、乒乓缓冲器的作用是在处理另一个缓冲器时填充其中一个缓冲器。
写入几个寄存器以启动下一个 DMA 所需的时间应该远远少于 ADC FIFO 填满所需的时间。
关于 DMA... 是否有 DMA 引擎/第二个处理器执行此操作、或者此代码是否真正在处理器上运行?
我有一个 FIFO 问题、我会很快就回复另一个。
尊敬的 WorkerBee:
Unknown 说:写入几个寄存器以启动下一个 DMA 所需的时间应远小于 ADC FIFO 填满所需的时间。 [报价]不是完全的。 实际上、我们需要考虑进入和退出中断的时间以及 DMA 配置时间。
是否有 DMA 引擎/第二个处理器执行该操作、或者该代码是否真正在该处理器上运行?抱歉、 只有一个处理器。 但我不确定您的意思是"真正的代码"。
此致、
Pengfei
[/quote]