Stm32 SD卡文件名作为日期戳

Stm32 SD卡文件名作为日期戳,stm32,sd-card,Stm32,Sd Card,我使用的是STM32F072RB核子板,我已经将SD卡breatkout板与之连接。 我能够读/写一个文本文件,我也使用RTC。项目更像是一个数据记录器。 我已经将LM35与STM32模拟引脚连接,并且我能够用时间戳记录数据 接下来我要尝试的是文件名,比如“MAY09_00.TXT”。要获得如上所述的文件名,我必须读取RTC日期和时间,然后将其放入文件名中。问题是,当我读取日期(在uint8_t中)并将其强制转换为(char)时,它使用ASCII字符值,而不是作为字符的日期。这似乎是一个典型的问

我使用的是STM32F072RB核子板,我已经将SD卡breatkout板与之连接。 我能够读/写一个文本文件,我也使用RTC。项目更像是一个数据记录器。
我已经将LM35与STM32模拟引脚连接,并且我能够用时间戳记录数据

接下来我要尝试的是文件名,比如“MAY09_00.TXT”。要获得如上所述的文件名,我必须读取RTC日期和时间,然后将其放入文件名中。问题是,当我读取日期(在uint8_t中)并将其强制转换为(char)时,它使用ASCII字符值,而不是作为字符的日期。这似乎是一个典型的问题,我曾尝试在网上查找,但没有找到多少帮助。我知道我正在寻找像itoa()这样的函数,但这些函数实际上是针对标准C库的。我不知道ST是否为他们的MCU提供了这样的实用程序库

char *fname;
char filename[12] = {' ',' ',' ',' ',' ','_','0','0','.','T','X','T'};

HAL_RTC_GetTime(&hrtc, &time3, RTC_FORMAT_BIN);
  HAL_RTC_GetDate(&hrtc, &date, RTC_FORMAT_BIN);  

  if(date.Month == 1)
  {
    fname = "JAN ";
  }
  else if(date.Month == 2)
  {
    fname = "FEB ";
  }
  else if(date.Month == 3)
  {
    fname = "MAR ";
  }
  else if(date.Month == 4)
  {
    fname = "APR ";
  }
  else if(date.Month == 5)
  {
    fname = "MAY ";
  }

  if(date.Date < 60)
  {
    int i = 0; int j = 0;
    int len = 0;
    for(i=0; *(fname) != NULL; i++)
    {
      filename[i] = *(fname);
      if(*(fname)==' ')
      {
        filename[i] = '0';
      }
      fname++;
    }
    filename[4] = (date.Date); // when I use today's date 9, it takes /t instead of '9'
  }
char*fname;
字符文件名[12]={'','','','','','0','0','T','X','T'};
HAL_RTC_GetTime(&hrtc,&time3,RTC_格式_BIN);
HAL_RTC_GetDate(&hrtc,&date,RTC_格式_BIN);
如果(日期.月份==1)
{
fname=“JAN”;
}
否则如果(日期.月份==2)
{
fname=“FEB”;
}
否则,如果(日期.月份==3)
{
fname=“MAR”;
}
否则,如果(日期.月份==4)
{
fname=“APR”;
}
否则,如果(日期.月份==5)
{
fname=“MAY”;
}
如果(日期<60)
{
int i=0;int j=0;
int len=0;
对于(i=0;*(fname)!=NULL;i++)
{
文件名[i]=*(fname);
如果(*(fname)='')
{
文件名[i]=“0”;
}
fname++;
}
filename[4]=(date.date);//当我使用今天的日期9时,它需要/t而不是'9'
}

以下是完整的逻辑。以下逻辑用于两位数的日期

dt = date.Date;
dt = (dt % 10);
dt &= 0x0f;
dt |= 0x30;
filename[3] = (char) dt;

dt2 = date.Date;
dt2 = (dt2 / 10);
dt2 &= 0x0f;
dt2 |= 0x30;
filename[4] = (char) dt2;

解决了。用于将一位数十进制转换为ascii字符的逻辑。首先执行{num&=0x0F},然后执行{num |=0x30},然后强制转换为{(char)num}