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的样子。
|