jennyzhaojie 发表于 2021-3-19 00:22

【RISC-V MCU CH32V103测评】实时标记文件创建时间

本帖最后由 jennyzhaojie 于 2021-3-19 00:23 编辑

<p>上次提过,在U盘的例程中其新建的文件日期是认为设置的,而非实时时间,因此在识读文件创建日期不能当真。</p>

<p>那是否能为创建的文件添加上实时的时间呢?</p>

<p>方法是启用MCU内部的RTC计时器,当然在使用时你要为RTC配置一个后备电池,否则即使有了RTC的帮助,也奈何不了没电的制约。</p>

<p>为了达到实时标记时间的目的,首要的是在U屏读写的例程中添加RTC计时程序,其运行效果如图1所示。</p>

<p></p>

<p>图1 添加RTC计时功能</p>

<p>&nbsp;</p>

<p>其后,是验证原来的U盘读写功能是否会受到影响,经实际验证,其执行效果如图2至图4所示。</p>

<p>这说明U盘的读写功能是不受影响的,且生成文件的时间是实时标记的。</p>

<p>有了这个基础,后续我们还可以将其用到数据的采集与记录方面。</p>

<p></p>

<p>图2 文件创建时刻的跟踪处理</p>

<p>&nbsp;</p>

<p></p>

<p>图3 文件的相关属性</p>

<p>&nbsp;</p>

<p></p>

<p>图4 文件的写入内容</p>

<p>&nbsp;</p>

<p>实现演示效果的程序为:</p>

<pre>
<code class="language-cpp">int main()
{
    UINT8 s, c, i,x,y;
    UINT16 TotalCount;
    UINT32 l;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    printf("SystemClk:%d\r\n",SystemCoreClock);
    Delay_Ms( 200 );
    printf("RTC Test\r\n");
    RTC_Init();
    printf("USBHD HOST Test\r\n");
    USBHD_ClockCmd(RCC_USBCLKSource_PLLCLK_1Div5,ENABLE);
    pHOST_RX_RAM_Addr = RxBuffer;
    pHOST_TX_RAM_Addr = TxBuffer;
    USB_HostInit();
    CHRV3LibInit();
    printf( "Wait Device In\r\n" );
    while(1)
    {
       s = ERR_SUCCESS;
       if ( R8_USB_INT_FG &amp; RB_UIF_DETECT )
       {
           R8_USB_INT_FG = RB_UIF_DETECT ;
           s = AnalyzeRootHub( );
           if ( s == ERR_USB_CONNECT )
           {
              printf( "New Device In\r\n" );
              FoundNewDev = 1;
           }
           if( s == ERR_USB_DISCON )
           {
              printf( "Device Out\r\n" );
           }
       }
     printf("%d-%d-%d  %d  %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.week,calendar.hour,calendar.min,calendar.sec );
       Delay_Ms(1000);
       if ( FoundNewDev || s == ERR_USB_CONNECT )
       {
           FoundNewDev = 0;
          Delay_Ms( 200 );
           s = InitRootDevice( Com_Buffer );
           if ( s == ERR_SUCCESS )
           {
              // U盘操作流程:USB总线复位、U盘连接、获取设备描述符和设置USB地址、可选的获取配置描述符,之后到达此处,由CH103子程序库继续完成后续工作
              CHRV3DiskStatus = DISK_USB_ADDR;
              for ( i = 0; i != 10; i ++ )
              {
                  printf( "Wait DiskReady\r\n" );
                  s = CHRV3DiskReady( );    //等待U盘准备好
                  if ( s == ERR_SUCCESS )
                  {
                     break;
                  }
                  else
                  {
                     printf("%02x\r\n",(UINT16)s);
                  }
                  Delay_Ms( 50 );
              }
              if ( s == ERR_MISS_DIR || s == ERR_MISS_FILE )
              {
                     printf( "Find No File And Create\r\n" );
                     strcpy( (PCHAR)mCmdParam.Create.mPathName, "/NEWFILE.TXT" );
                     s = CHRV3FileCreate( );
                     mStopIfError( s );
                     printf( "ByteWrite\n" );
                     i = sprintf( (PCHAR)buf,"Note: \xd\xa这个程序是以字节为单位进行U盘文件读写,简单演示功能。\xd\xa");  /*演示 */
                     for(c=0; c&lt;10; c++)
                     {
                         mCmdParam.ByteWrite.mByteCount = i;
                         mCmdParam.ByteWrite.mByteBuffer = buf;
                         s = CHRV3ByteWrite( );
                         mStopIfError( s );
                         printf("成功写入 %02X次\r\n",(UINT16)c);
                     }
                    printf( "Modify\r\n" );
                     mCmdParam.Modify.mFileAttr = 0xff;
                     mCmdParam.Modify.mFileTime = MAKE_FILE_TIME( calendar.hour, calendar.min, calendar.sec );
                     mCmdParam.Modify.mFileDate = MAKE_FILE_DATE( calendar.w_year, calendar.w_month, calendar.w_date );
                     mCmdParam.Modify.mFileSize = 0xffffffff;
                     i = CHRV3FileModify( );
                     mStopIfError( i );
                     printf( "Close\r\n" );
                     mCmdParam.Close.mUpdateLen = 1;
                     i = CHRV3FileClose( );
                     mStopIfError( i );
                     printf("%d-%d-%d  %d  %d:%d:%d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.week,calendar.hour,calendar.min,calendar.sec );
                  }
              }
           }
       }
       Delay_Ms( 100 );  // 模拟单片机做其它事
       SetUsbSpeed( 1 );  // 默认为全速
    }
}</code></pre>

<p>&nbsp;</p>

qwqwqw2088 发表于 2021-3-19 07:41

<p>看来CH32V10创在建的文件添加上实时的时间没问题</p>

<p>为什么要为RTC配置一个后备电池呢</p>

zhwps 发表于 2021-3-19 11:20

<p>看来CH32V10创在建的文件添加上实时的时间没问题</p>

<p>为什么要为RTC配置一个后备电池呢?这个耗电厉害吗????</p>

jennyzhaojie 发表于 2021-3-19 11:56

qwqwqw2088 发表于 2021-3-19 07:41
看来CH32V10创在建的文件添加上实时的时间没问题

为什么要为RTC配置一个后备电池呢

<p>因为RTC也是微小的电能维持着时钟不停摆,否则时钟停摆了时间还有啥用呀?</p>

jennyzhaojie 发表于 2021-3-19 11:59

zhwps 发表于 2021-3-19 11:20
看来CH32V10创在建的文件添加上实时的时间没问题

为什么要为RTC配置一个后备电池呢?这个耗电厉害吗?? ...

<p>具体没计量过,应该不会太高吧,它的作用就相当于电脑中维持配置的纽扣电池。</p>

w494143467 发表于 2021-3-19 16:16

<p>感谢分享!不错哈!</p>

jennyzhaojie 发表于 2021-3-19 18:30

w494143467 发表于 2021-3-19 16:16
感谢分享!不错哈!

<p>感谢支持!</p>

freebsder 发表于 2021-3-19 23:03

<p>谢谢分享!</p>

jennyzhaojie 发表于 2021-3-20 09:53

freebsder 发表于 2021-3-19 23:03
谢谢分享!

<p>多谢支持!</p>
页: [1]
查看完整版本: 【RISC-V MCU CH32V103测评】实时标记文件创建时间