打印
[STM32L4+]

【STEVAL-STWINKT1B测评】使用sd卡记录传感器STTS751的数据

[复制链接]
495|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xhackerustc|  楼主 | 2024-9-8 20:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式


STEVAL-STWINKT1B开发板有一个sd卡槽,据原理图可知信号都接入了主控STM32L4R9ZIJ6的sdmmc控制器,所以我们可以记录数据到sd卡上。这个功能其实fp-sns-datalog2/已经全部做好,可以通过fp-sns-datalog2/Utilities/cli_example中的程序控制fp-sns-datalog2固件记录哪些哪些传感器到sd卡,也可以通过usb直传。所以这篇评测如果用fp-sns-datalog2固件也是不用写任何代码的,不过咱们挑战下写点裸机代码试试吧。

fp-sns-datalog2基于ThreadX全家桶,所以文件系统部分用的FileX,咱们想在裸机上实现sd卡记录传 感器数据功能可以用开源的FatFs,FatFs的相应移植(主要就是sd_diskio.c)其实STM32CubeL4已经做好了,我们直接用就可以了。不过需要改下ffconf.h, 把_USE_STRFUNC打开,这是为了下面用f_printf打印传感器数据到文件用的

-#define _USE_STRFUNC    0
+#define _USE_STRFUNC    1



本次测试以STTS751传感器为例,改下stts751_read_data_polling()函数,让它不仅仅打印读到的传感器数据且返回数据给调用者:
float stts751_read_data_polling(void)
{
    /* Read output only if not busy */
    uint8_t flag;
    stts751_flag_busy_get(&dev_ctx, &flag);

    if (!flag) {
      /* Read temperature data */
      memset(&data_raw_temperature, 0, sizeof(int16_t));
      stts751_temperature_raw_get(&dev_ctx, &data_raw_temperature);
      temperature_degC = stts751_from_lsb_to_celsius(
                           data_raw_temperature);
      sprintf((char *)tx_buffer, "stts751 Temperature [degC]:%3.2f\r\n",
              temperature_degC);
      tx_com(tx_buffer, strlen((char const *)tx_buffer));
      return temperature_degC;
    }
    return 0;
}



下面照着STM32CubeL4的Projects/STM32L4R9I-EVAL/Applications/FatFs/FatFs_uSD_Standalone/为例子写sd初始化、FatFs挂载、文件打开等等,相关代码如下:

  if (FATFS_LinkDriver(&SD_Driver, SDPath) != 0) {
    printf("FATFS Link Driver error\n");
    Error_Handler();
  }

  SD_Initialize();

  /* Make sure that the SD detection IT has a lower priority than the Systick */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0x0E ,0);

  if(!BSP_SD_IsDetected())
    Error_Handler();

  if(f_mount(&SDFatFs, (TCHAR const*)SDPath, 0) != FR_OK)
    Error_Handler();

  if(f_open(&MyFile, "STWIN_SENSORS.TXT", FA_CREATE_ALWAYS | FA_WRITE) != FR_OK)
    Error_Handler();



万事具备现在可以读取记录啦
 while (1) {
    float val;

    val = stts751_read_data_polling();
    if (val > 0)
      f_printf(&MyFile, "%f\n", val);
    HAL_Delay(1000);
  }


这是每行记录一次数据,一秒记录一次,此数据记录在linux下可以用gunplot画图。多个传感器以此类推不过就是f_printf那里多打印几个。至此我们也实现了使用sd卡记录传感器数据的功能。但是这个功能要做到性能最高功耗最低要做很多事,比如传感器读取应该变成中断驱动的异步方式,sd卡写入这里就应该是一个线程等消息或FIFO,做到最后就是fp-sns-datalog2的样子。


使用特权

评论回复
沙发
AdaMaYun| | 2024-9-9 16:14 | 只看该作者
在linux下可以用gunplot画图?导出细节?

使用特权

评论回复
评论
xhackerustc 2024-9-9 19:38 回复TA
这个文件都是这样的格式: 32.75 32.6 33.58 一行一个数据,gunplot很适合给这种数据画图,都不需要用awk处理 
板凳
呐咯密密| | 2024-9-9 17:20 | 只看该作者
这个SD卡设计的很人性化

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

20

主题

62

帖子

0

粉丝