你好呀!
长时间的监听者,第一次的调用者。
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支配的情况下进行调整。也许有人可以启发我。