STM32 SD 卡(SPI)未在中断中写入

问题描述 投票:0回答:1

我正在研究 STM32F103 又名 Bluepill。我将在人体上使用我的项目,因此它应该紧凑(即不通过电缆连接到计算机)。

我每 10 毫秒就有一个芯片的外部中断。我得到四个 28 位值。我将它们连接成一个字符串,并以 115200 bps 的速度通过 UART 发送。它是这样工作的,但我需要它像我之前所说的那样紧凑。我使用 HC05 蓝牙模块无线发送数据,但无论我如何尝试,它都会丢失数据。因此决定使用 SPI(如数据记录器)将它们保存在 SD 卡中。我使用 FatFs 库。

首先,我做了一个简单的例子。我在轮询模式下使用 ADC 采集了 10000 个数据,并立即将它们保存在循环中,以查看使用 LED 切换保存的速度,速度非常快(比 10 毫秒还要快)。

我正在使用这段代码写入SD卡:

      res= f_mount(&fs, "", 0);
      res= f_open(&fil, "write.txt", FA_OPEN_ALWAYS | FA_WRITE | FA_READ);
      res= f_lseek(&fil, fil.fsize);
      res= f_write(&fil, adc1char , strlen(adc1char), (void *)&bw);
      res= f_close(&fil);

然后尝试将其实现到我的原始代码中。写在外部中断中。但这不起作用。这不是写作。如果我在主循环 while(1) 中写入它,它会写入一些数据,但少于原始数据,并且会重复(重写)其中很多数据。

您认为问题出在哪里?我该如何解决?预先感谢。

stm32 interrupt sd-card fatfs hc-05
1个回答
0
投票

我的猜测是,这些函数 - f_mount()、f_open() 等 - 也依赖于一些中断,并且它被你调用的具有更高或相同优先级的中断阻止。

因此,快速解决方法是找到该中断并将其设置为比您的中断更高的优先级。

但是,通常从 ISR 调用冗长的函数不是一个好主意。通常的模式是仅使用中断来移动必要的数据并设置信号/标志,然后在 main() 中处理这些信号/标志。您需要注意原子性,即必须以一致的方式更改必须形成一致组的变量,以便在任何时候发生中断时都不会“看到”不一致的状态。处理这个问题的常见方法是使用环形缓冲区。

此外,您不能仅仅因为您在一种特定设置中“测试”了 SD 卡,就认为它存储的数据始终低于 10 毫秒。使用文件系统可能会导致需要在文件系统库内部执行一系列写入操作,并且 SD 卡本身也可能决定执行冗长的维护操作。

JW

© www.soinside.com 2019 - 2024. All rights reserved.