大家好!
这是我的第一篇文章,我希望有人可以帮助我解决这个非常奇怪的问题,我现在挣扎了大约2个月。
我试图在不使用 Bit-Bang (这是我为客户定制的协议、不使用任何标准总线、如 I2C、SPI、UART 等)的情况下、通过 GPIO 控制一些数据交换、差不多就像一个"多"单线协议。
为此、我将基于 driverlib 开发一个定制驱动程序、因为无法使用高级驱动程序、 基本上、我想使用散聚 DMA 传输、方法是创建一个任务列表、列出通过直接在 GPIO 数据寄存器上写入"1"或"0"直接驱动单独的 GPIO 的 DMA 请求。
为了避免使用 CPU (与电源管理相关的限制非常严格)、我想使用计时器来驱动 DMA、这种方法使用外设散聚模式、 我可以使用计时器的超时中断来触发每个 DMA 任务、并将 GPIO 与计时器同步控制、而无需使用 CPU 处理任何内容或使用软件延迟来满足协议时序。
我想要实现的是控制通信、方法是简单地启动计时器、从而触发 DMA 一次请求一个任务(因此它可以根据协议将单个 GPIO 驱动为高电平或低电平)、并通过在没有任何 CPU 干预的情况下停止计时器来终止它 (可以发送完整的消息以在特定时间内启用和禁用计时器)。
作为我使用本文档的代码的参考:"CC13x2、CC26x2 SimpleLink 无线 MCU 技术参考手册"、其中第14.3.6.6段介绍了外设散聚 DMA、第15.4.5段介绍了计时器触发的 DMA 请求功能。 作为计时器和 DMA 配置的参考代码、我还使用 ADCBufCC26X2驱动器、该驱动器使用基于乒乓模式的 DMA 管理、并且计时器触发 ADC、而不是直接触发 DMA。
我正在使用配置为16位连续计数定时器的 GPTimer 0和 DMA 的通道9 (由 GPT0的超时事件触发)。
一切似乎都很顺利、除了只有在连接了调试器的情况下运行固件时(我使用的是 Launchpad CC1352R1评估板)才能看到数据流、而如果在不调试的情况下运行数据流、DMA 将停止工作 (使用调试配置文件构建的相同固件不进行优化)。
我做了一些测试、同时使用逻辑分析仪来显示信号的状态、并添加了其他一些用作测试信号的 GPIO、以收集有关计时器状态以及中断是否被正确触发的信息。 我还可以使用 UART 控制台来访问寄存器、从而设置/获取寄存器值、以便查看在我未连接调试器时会发生什么情况。
我发现了 DMA 的主要区别是 REQDONE 状态、确切地说:当我激活计时器并且 DMA 开始处理散聚任务列表时、如果我在连接调试器的情况下运行固件、REQDONE 永远不会发生并且一切运行完美; 相反、如果我只需在 IDE 中按下"Stop"按钮、或者如果我在未连接调试器的情况下直接运行固件、则在第一个任务或最多第二个任务之后、REQDONE 会升高并且 DMA 会停止处理其余的任务来停止该序列。
我的问题是:这是预期行为吗? 在没有调试器的情况下运行固件时、我是否需要配置其他配置来避免发生此类事件?
出于 NDA 原因(我是我的客户的顾问)、我无法提供项目的完整源代码、但如有必要、我可以在此处复制/粘贴一些严格与 DMA 和计时器配置相关的部分; 无论如何、为了提供预期结果的样本、我附上了两张逻辑分析仪输出的屏幕截图、第一张是正确的行为(2个 GPIO 和定时器切换轨迹作为参考)和不良行为 (我注册了一个连接到计时器中断的 HWI/SWI 耦合、在 SWI 中、如果 REQDONE 标志提高、我只需重新启用 DMA 通道、但这会在协议中产生差距、因为 HWI 是随机触发的、因此我松散了一些 DMA 事务)。
很抱歉这么长的文本、我想提供尽可能多的信息、非常提前感谢您提出任何建议。
达里奥 
