作者 主题:STM32:调用了I²S回调,但是UART没有显示它 (Read 666 times)

0位成员和1位访客正在查看此主题。

 离线 施沃卡斯

  • 新手
  • 帖子:3
  • 国家:  德
STM32:调用了I²S回调,但是UART没有显示它
« on: 2020年11月12日,上午06:47:10»
你好呀!
长时间的监听者,第一次的调用者。

I'目前,m正在从事一个涉及STM32G031上的数字I²SMEMS麦克风的项目。 DMA使我可以很好地接收数据,但是遇到了一个小的理解问题。

在初始化阶段'm以如下方式启动DMA接收:

代码: [选择]
if (HAL_OK == HAL_I2S_Receive_DMA(&hi2s1, (uint16_t*)i2s_dma_buf, 2)) {
  sprintf(infomsg, "i2s dma ok\r\n");
  HAL_UART_Transmit(&huart1, (uint8_t*)infomsg, strlen(infomsg), 100);
  }

I'm在主while循环中使LED闪烁,以查看一切是否正常。

我还定义了这两个回调,当缓冲区一半或完全填满时应该触发这些回调:

代码: [选择]
void HAL_I2S_RxHalfCpltCallback(I2S_HandleTypeDef* hi2s1) {
sprintf(msg, "half\r\n");
HAL_UART_Transmit(&huart1, (uint8_t*)msg, strlen(msg), 100);
}

void HAL_I2S_RxCpltCallback(I2S_HandleTypeDef* hi2s1) {
sprintf(msg2, "cplt\r\n");
HAL_UART_Transmit(&huart1, (uint8_t*)msg2, strlen(msg2), 100);
}

我的问题是,我从未见过"i2s dma ok"消息出现在重置。而且,我只见过成千上万的"half"串行控制台中的消息,但没有"cplt"s。但是,我认为这两个回调均正常触发,因为如果我将这些UART传输与LED切换开关进行交换,则它们会点亮。

卢卡斯
当我'我试图在那段代码上运行调试器,它就停在了"sprintf(infomsg, 'i2s dma ok\r\n')"行,但串行控制台显示"half",因此DMA似乎正在运行并触发回调。同样,应该闪烁的LED只会点亮一次,永不熄灭。

I'我很确定我对DMA和UART有一些误解,因为它'只是在没有任何CPU支配的情况下进行调整。也许有人可以启发我。
« 上次编辑:2020年11月12日,上午07:51:16 schwukas »
 

 离线 新脑

  • 超级贡献者
  • ***
  • 帖子:1035
  • 国家:  SE
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下方面回复#1: 2020年11月12日,上午08:17:44»
一小部分提示可帮助您向正确的方向移动:
  • 为什么使用sprintf仅复制固定的字符串?它's一个非常慢的函数(即使对于这种简单情况)。
  • 你不'看不到最初的消息"i2s dma ok", why is that?
    考虑一下HAL_I2S_Receive_DMA()函数内部发生的情况以及您的I2S采样频率。在DMA半完成中断或打印输出之前会发生什么?
  • 另外,考虑到与UART的速度有关的每个DMA事务处理的缓冲区有多小:您甚至有时间忽略每个字节中断和全部DMA中断打印一条消息,甚至忽略上述字节重排?
  • GPIO比UART快许多个数量级。
Nandemo wa shiranai wa yo,shitteru koto dake。
 
以下用户感谢这篇文章: 施沃卡斯

 离线 施沃卡斯

  • 新手
  • 帖子:3
  • 国家:  德
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下方面回复#2: 2020年11月12日,上午09:49:02»
嗯,这很有帮助。我对为什么会有些怀疑'就像这样,但是自从我'我对此很陌生,我永远不确定我是否'米假设正确的事情。
  • 我只用一个变量替换了sprintf。那绝对是有道理的,我只是从未真正考虑过。
  • 也摆脱了sprintf()"i2s dma ok"出现。来自python我'我不习惯这么高的速度。
  • 我实际上考虑到并尝试了其他缓冲区大小,但是由于它没有改变,所以我只是认为我的想法是错误的。我从未将其设置为高于1024,也许's why.

我还是看不到"cplt"调试消息,但至少我现在知道为什么。我觉得除了外部手段(逻辑分析仪,示波器)外,'有什么调试DMA的好方法吗? UART太慢,每次回调的LED指示灯闪烁都会减慢所有速度,而每半个回调的LED指示灯都会亮,然后在整个回调过程中都关闭LED指示灯,我只能在高速摄像头上看到它。

I'd想查看dma缓冲区的实际内容,但是现在我觉得使用UART可能会导致错误的结论,因为它比实际DMA传输的速度慢。
« 上次编辑:2020年11月17日,上午07:58:53 schwukas »
 
以下用户感谢这篇文章: 新脑

 离线 si

  • 超级贡献者
  • ***
  • 帖子:7864
  • 国家:  nz
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下方面回复#3: 2020年11月12日,上午10:02:53»
如果您希望在中断/回调触发时向UART发送一些文本。
创建一个全局volatile变量用作标志,在中断中设置标志并在main()中进行发送。

在中断中检查标志的状态,如果= 3,将其设置为1
在void Main()中检查标志是否为= 1(要发送的消息),如果是,则将其设置为2并发送实际的UART消息
在运行频率较低(可能每50毫秒一次)的系统/计时器块中,检查标志以及是否's = 2将其设置回3。

由于消息不会直接在中断内部发送,因此会有一些指令周期的延迟,它将一直等到中断/回调结束(执行返回到主程序)之后。但是,这通常不是问题。
主要优点是它使您可以控制重复率并防止它在发送时尝试再次发送's still sending
您可以根据需要玩一些延迟游戏。

-帖子已被编辑以修复我的第一篇帖子中的错误-
« 上次编辑:2020年11月14日,11:56:14 Psi »
希腊字母'Psi'(不是每平方英寸磅)
 

 离线 新脑

  • 超级贡献者
  • ***
  • 帖子:1035
  • 国家:  SE
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下方面回复#4: 2020年11月12日,上午11:29:44»
嗯,这很有帮助。
很高兴看到那个!
也是psi的好建议(尽管我会在打印后清除变量,是的,可能会漏掉消息,但这可以'在任何情况下都无法提供帮助)。

是的,UART太慢(通常取决于位速率和I2S位时钟!)"see"他所有的采样都是在I2S流上进行的。
如果缓冲区足够长,您可能有时间打印出一小部分样本,您需要进行一些计算。

如果您是新手,请记住另外两点:
  • printf系列通常很大且很慢*
  • 最常见的编程模式之一是尝试避免在中断例程中产生任何繁重的负担:仅让主循环知道什么'发生(例如,标志**缓冲区已准备就绪)并进行处理。如果您想使用实时操作系统,则更推荐这样做。

当然如果你不这样做'如果不中断程序,可以使用调试器查看缓冲区。

*我经常使用的一个非常轻巧且功能强大的printf实现是 这个 .
**请记住对通信变量使用volatile,否则在很多情况下允许编译器优化您的检查!
Nandemo wa shiranai wa yo,shitteru koto dake。
 
以下用户感谢这篇文章: emece67

 离线 施沃卡斯

  • 新手
  • 帖子:3
  • 国家:  德
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下问题上回复#5: 2020年11月23日,上午09:35:39»
感谢你们俩。您的回答确实帮助我更好地理解了整个DMA。它'对我来说这只是一个非常新的概念,后台内容和中断环境'无论如何,都应如此直观。我得到了一些有意义的输出,这是一个很大的安慰。但是,我仍然需要找到一些解决方案,因此,如果出现任何问题,我可能会重用此线程。

现在,我只想提供一些反馈,"closure"。每当我回复线程时,让线程保持开放状态总是让我很烦。
 

 离线 布森

  • 支持者
  • ****
  • 帖子:1836
  • 国家:  我们
回复:STM32:调用了I²S回调,但是UART没有显示它
« 在以下方面回复#6: 2020年12月1日,晚上10:56:23»
你'对所有消息重新使用公共缓冲区。  Try:

代码: [选择]
if (HAL_OK == HAL_I2S_Receive_DMA(&hi2s1, (uint16_t*)i2s_dma_buf, 2)) {
  static const char infomsg[] = "i2s dma ok\r\n";
  HAL_UART_Transmit(&huart1, (uint8_t*)infomsg, sizeof infomsg - 1, 100);
  }

另外,HAL_UART_Transmit()会做什么? 如果放弃任何现有的正在进行的输出,则可能会丢失。
« 上次编辑:2020年12月1日,11:00 pm by bson »
 


分享我

 掘客    Facebook    SlashDot    可口的    Technorati    推特    谷歌    雅虎
中频