注册 登录
查看: 945|回复: 50

山外大哥,看门狗例程是不是有问题啊,来看一下,谢谢!

[复制链接]
发表于 2014-9-14 09:14:04 | 显示全部楼层 |阅读模式
  1. /*!
  2. *     COPYRIGHT NOTICE
  3. *     Copyright (c) 2013,野火科技
  4. *     All rights reserved.
  5. *     技术讨论:野火初学论坛 http://www.chuxue123.com
  6. *
  7. *     除注明出处外,以下所有内容版权均属野火科技所有,未经允许,不得用于商业用途,
  8. *     修改内容时必须保留野火科技的版权声明。
  9. *
  10. * @file       main.c
  11. * @brief      野火K60 平台主程序
  12. * @author     野火科技
  13. * @version    v5.0
  14. * @date       2013-08-28
  15. */

  16. #include "common.h"
  17. #include "include.h"

  18. /*!
  19. *  @brief      main函数
  20. *  @since      v5.0
  21. *  @note       看门狗测试代码
  22. */
  23. void main(void)
  24. {
  25.     uart_init(UART3,115200);
  26.     printf("\n*****看门狗测试*****\n");

  27.     wdog_init_ms(1000) ;        //初始化看门狗,调整这里的时间,看看每次复位的时间是否与设定的相同(如果时间太短,复位时初始化时间比较长,误差比较大的)
  28.     while(1)
  29.     {
  30.         DELAY_MS(500);
  31.         wdog_feed();  printf("喂狗了,汪汪~~\n\n");     //注释与没注释,可以看到复位与没复位的(通过串口助手)
  32.     }
  33. }
把这个程序下载到无线调试器里,怎么会出现,一直没喂狗的现象,程序一直在复位,一直在发   *****看门狗测试*****   ?????????????
回复

使用道具 举报

发表于 2014-9-14 09:24:46 | 显示全部楼层
不懂 帮顶~~~~~走过路过,不能错过
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 09:28:38 | 显示全部楼层
Rococo 发表于 2014-9-14 09:24
不懂 帮顶~~~~~走过路过,不能错过

我记得程序里有个BUG关于看门狗的,导致,狗被饿死了
回复 支持 反对

使用道具 举报

发表于 2014-9-14 09:39:17 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:28
我记得程序里有个BUG关于看门狗的,导致,狗被饿死了

我在找K60的历程 你能不能发我一份 论坛那个帖子我进不去...
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 09:39:32 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:28
我记得程序里有个BUG关于看门狗的,导致,狗被饿死了

刚才那个例程里的BUG修改过来了,就正常了。可是我把wdog_init_ms(1000) ; 初始化1S,然后我在PIT0中断里了,500ms喂狗一次,怎么会出现,程序没有复位,但是串口不发数据了???还是飞控的程序
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 09:42:10 | 显示全部楼层
Rococo 发表于 2014-9-14 09:39
我在找K60的历程 你能不能发我一份 论坛那个帖子我进不去...

http://pan.baidu.com/s/1kTC7KnP
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 09:43:57 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:42
http://pan.baidu.com/s/1kTC7KnP

这个链接好像不行,刚创建的分享就没了
回复 支持 反对

使用道具 举报

发表于 2014-9-14 09:45:33 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:43
这个链接好像不行,刚创建的分享就没了

打不开..挂掉了 扣扣945436110  麻烦发个我吧~~?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 09:46:21 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:43
这个链接好像不行,刚创建的分享就没了

里面只有程序

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2014-9-14 11:20:55 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 09:28
我记得程序里有个BUG关于看门狗的,导致,狗被饿死了

看门狗的例程,是有bug,看bug汇总。
【一天攻破K60】 BUG 汇总 - 一天攻破K60 - 山外-vcan123论坛 http://vcan123.com/forum.php?mod=viewthread&tid=1294&ctid=1
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-14 11:23:45 | 显示全部楼层
Rococo 发表于 2014-9-14 09:39
我在找K60的历程 你能不能发我一份 论坛那个帖子我进不去...

http://pan.baidu.com/share/link?shareid=914452108&uk=235751603
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 12:06:09 | 显示全部楼层

刚才那个例程里的BUG修改过来了,就正常了。可是我把wdog_init_ms(1000) ; 初始化1S,然后我在PIT0中断里,500ms喂狗一次,怎么会出现,程序没有复位,但是串口不发数据了???还是飞控的程序
回复 支持 反对

使用道具 举报

发表于 2014-9-14 12:19:16 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 12:06
刚才那个例程里的BUG修改过来了,就正常了。可是我把wdog_init_ms(1000) ; 初始化1S,然后我在PIT0中断里 ...

你500ms就喂狗,当然不会复位啊。串口不能发送和接收,你在线调试一下。建议你看看iar调试视频。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:12:13 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 12:19
你500ms就喂狗,当然不会复位啊。串口不能发送和接收,你在线调试一下。建议你看看iar调试视频。

当我把看门狗注释掉后,又可以串口发送数据了,看门狗怎么会影响串口呢?、
回复 支持 反对

使用道具 举报

发表于 2014-9-14 16:14:37 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:12
当我把看门狗注释掉后,又可以串口发送数据了,看门狗怎么会影响串口呢?、

你有没有在线调试过?看看能不能执行到串口发送那个函数。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:23:33 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 16:14
你有没有在线调试过?看看能不能执行到串口发送那个函数。

  1. /*!
  2. *  @brief      解锁看门狗
  3. *  @since      v5.0
  4. */
  5. void wdog_unlock(void)
  6. {
  7.     //此函数不能单步执行

  8.     //WDOG_UNLOCK 寄存器里描述,连续向此寄存器写入0xC520、0xD928即可解锁,
  9.     //中间不得超过20个时钟周期,因此需要先关总中断
  10. #if  (defined(__ICCARM__) || defined(__CC_ARM))
  11.     uint8 tmp = __get_BASEPRI();        //__get_BASEPRI 是 IAR 自带 intrinsics.h 里定义 ,用于获取 中断状态(MDK也支持)
  12.     //用于返回寄存器 PRIMASK 的值(1bit)
  13.     //1表示关中断,0表示开中断
  14. #else
  15.     uint8 tmp = 0;                      //默认表示开中断
  16. #endif


  17.     //关闭总中断,否则有可能没法在 20个周期内连续写入 WDOG_UNLOCK
  18.     DisableInterrupts;

  19.     //解锁 看门狗
  20.     WDOG_UNLOCK = 0xC520;
  21.     WDOG_UNLOCK = 0xD928;

  22.     if(tmp == 0)
  23.     {
  24.         EnableInterrupts;
  25.     }
  26. }
好像是这段代码问题,在看门狗初始化,关闭了所有的中断,而我的程序都在中断里执行
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:24:15 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 16:14
你有没有在线调试过?看看能不能执行到串口发送那个函数。

UART中断接收都不行了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:28:43 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:24
UART中断接收都不行了

在每次喂狗时也关了次中断
  1. /*!
  2. *  @brief      喂狗
  3. *  @since      v5.0
  4. */
  5. void wdog_feed(void)
  6. {
  7.     //此函数不能单步执行

  8.     //WDOG_REFRESH 寄存器里描述,连续向此寄存器写入0xA602 、0xB480即可解锁,
  9.     //中间不得超过20个时钟周期,因此需要先关总中断
  10. #if  (defined(__ICCARM__) || defined(__CC_ARM))
  11.     uint8 tmp = __get_BASEPRI();        //__get_BASEPRI 是 IAR 自带 intrinsics.h 里定义 ,用于获取 中断状态(MDK也支持)
  12.     //用于返回寄存器 PRIMASK 的值(1bit)
  13.     //1表示关中断,0表示开中断
  14. #else
  15.     uint8 tmp = 0;                      //默认表示开中断
  16. #endif

  17.     //关闭总中断,否则有可能没法在 20个周期内连续写入 WDOG_UNLOCK
  18.     DisableInterrupts;

  19.     //更新 看门狗(喂狗)
  20.     WDOG_REFRESH = 0xA602;
  21.     WDOG_REFRESH = 0xB480;


  22.     if(tmp == 0)
  23.     {
  24.         EnableInterrupts;
  25.     }
  26. }


回复 支持 反对

使用道具 举报

发表于 2014-9-14 16:39:09 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:24
UART中断接收都不行了

喂狗过程是会暂时关闭中断,你把工程发上来,我调试一下看看。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:46:37 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 16:39
喂狗过程是会暂时关闭中断,你把工程发上来,我调试一下看看。

http://pan.baidu.com/s/1i3mTxC5
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:47:55 | 显示全部楼层

我刚才又把程序改过来了,怎么程序又恢复到原先的状态了,程序写的太脆弱了,现在收发又有问题了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:50:51 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:47
我刚才又把程序改过来了,怎么程序又恢复到原先的状态了,程序写的太脆弱了,现在收发又有问题了

收发没有问题,这程序写的太奇葩了,程序下载进去后,的断一次电,再重新上电就正常了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 16:52:10 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:50
收发没有问题,这程序写的太奇葩了,程序下载进去后,的断一次电,再重新上电就正常了

初始化看门狗在主函数里面,喂狗在interrupt C文件里
回复 支持 反对

使用道具 举报

发表于 2014-9-14 17:12:03 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 16:52
初始化看门狗在主函数里面,喂狗在interrupt C文件里

嗯嗯,我等下看看是什么问题。先下载来看看。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 17:18:55 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 17:12
嗯嗯,我等下看看是什么问题。先下载来看看。

恩,好的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 19:21:53 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-14 17:12
嗯嗯,我等下看看是什么问题。先下载来看看。

发现是什么问题了吗?
回复 支持 反对

使用道具 举报

发表于 2014-9-14 19:34:58 | 显示全部楼层
快乐的味道92 发表于 2014-9-14 19:21
发现是什么问题了吗?

还没测,在外面。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-14 21:07:47 | 显示全部楼层

奥奥,知道了,有空你就测一下吧
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-15 12:40:34 | 显示全部楼层

现在知道,加了看门狗是什么原因导致程序不能正常工作????
回复 支持 反对

使用道具 举报

发表于 2014-9-15 13:34:31 | 显示全部楼层
快乐的味道92 发表于 2014-9-15 12:40
现在知道,加了看门狗是什么原因导致程序不能正常工作????

我测试了,可以正常运行啊。
不过我是屏蔽了你的I2C代码。
有可能是这段代码执行时间过长,导致没按时喂狗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-15 13:52:02 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-15 13:34
我测试了,可以正常运行啊。
不过我是屏蔽了你的I2C代码。
有可能是这段代码执行时间过长,导致没按时 ...

MPU6050读取数据的I2C吗?
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-15 13:53:55 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-15 13:34
我测试了,可以正常运行啊。
不过我是屏蔽了你的I2C代码。
有可能是这段代码执行时间过长,导致没按时 ...

屏蔽了,程序就残废了增大看门狗初始化时间呢,然后把喂狗时间也还长点,不知道行不行,我试过初始化为2秒,1秒喂狗还不行。
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-15 13:55:25 | 显示全部楼层
快乐的味道92 发表于 1410760435
屏蔽了,程序就残废了增大看门狗初始化时间呢,然后把喂狗时间也还长点,不知道行不行,我试过初始化为2秒,1秒喂狗还不行。
这里提供一个思路给你,就是喂狗时间有问题。

另外,一般喂狗,都不会在中断里进行喂狗的,而是在主函数里喂狗的!
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

发表于 2014-9-15 15:07:57 | 显示全部楼层
快乐的味道92 发表于 2014-9-15 13:53
屏蔽了,程序就残废了增大看门狗初始化时间呢,然后把喂狗时间也还长点,不知道行不行,我试过初始化为2 ...

你找找是什么原因导致喂狗时间超时啊。
山外哥也说到了,喂狗不要在中断里进行,不然哪怕跑飞了,也能够喂狗。那样还不如不要看门狗。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-15 15:39:27 | 显示全部楼层
虚竹 发表于 2014-9-15 15:07
你找找是什么原因导致喂狗时间超时啊。
山外哥也说到了,喂狗不要在中断里进行,不然哪怕跑飞了,也能够 ...

那我把喂狗放在主函数里,怎么知道什么时候喂狗,而且主函数里只有一个while(1);中断一直在打断主函数
来自安卓客户端来自安卓客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-15 15:46:14 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-15 13:55
这里提供一个思路给你,就是喂狗时间有问题。

另外,一般喂狗,都不会在中断里进行喂狗的,而是在主函数 ...

那我把喂狗放在主函数里,怎么知道什么时候喂狗,而且主函数里只有一个while(1);中断一直在打断主函数
回复 支持 反对

使用道具 举报

发表于 2014-9-15 17:14:12 | 显示全部楼层
快乐的味道92 发表于 2014-9-15 15:46
那我把喂狗放在主函数里,怎么知道什么时候喂狗,而且主函数里只有一个while(1);中断一直在打断主函数[/b ...

如果你不太懂得用看门狗,就不建议用看门狗,否则程序很不稳定。

首先,中断本来就应该快速执行,快速退出的。不应该在中断里执行过长的代码。
你可以增大超时喂狗时间,缩短喂狗时间,确保能及时喂狗。while 循环里加个延时,和喂狗也行

回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 12:54:37 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-15 17:14
如果你不太懂得用看门狗,就不建议用看门狗,否则程序很不稳定。

首先,中断本来就应该快速执行,快速 ...

SD实验山中,如果往里面写入数据,需要调用哪个函数:f_write???????????
The f_write writes data to a file.
FRESULT f_write (  FIL* fp,          /* [IN] Pointer to the file object structure */  const void* buff, /* [IN] Pointer to the data to be written */  UINT btw,         /* [IN] Number of bytes to write */  UINT* bw          /* [OUT] Pointer to the variable to return number of bytes written */);

ParametersfpPointer to the open file object structure.buffPointer to the data to be written.btwSpecifies number of bytes to write in range of UINT type.bwPointer to the UINT variable to return the number of bytes written. The value is always valid after the function call regardless of the result.还是这个:
f_puts
The f_puts function writes a string to the file.
int f_puts (  const TCHAR* str, /* [IN] String */  FIL* fp           /* [IN] File object */);
ParametersstrPointer to the null terminated string to be written. The terminator character will not be written.fpPointer to the open file object structure.
Return Value
When the function succeeded, it returns number of characters written. When the write operation is aborted due to disk full or any error, an EOF (-1) will be returned.
When FatFs is configured to Unicode API (_LFN_UNICODE == 1), character encoding on the srting fuctions, f_putc(), f_puts(),f_printf() and f_gets(), is also switched to Unicode. The character encoding on the file to be read/written via those functions is selected by _STRF_ENCODE option.

Description
The f_puts() function is a wrapper function of f_write() function.

QuickInfo
Available when _FS_READONLY == 0 and _USE_STRFUNC is 1 or 2. When it is set to 2, '\n's contained in the string are converted to '\r'+'\n'.



回复 支持 反对

使用道具 举报

发表于 2014-9-16 12:55:58 | 显示全部楼层
快乐的味道92 发表于 1410843277
SD实验山中,如果往里面写入数据,需要调用哪个函数:f_write???????????The f_write writes data to a file.FRESULT f_write (  FIL* fp,          /*  Pointer to the file object structure */  const void* buff, /*  Pointer to the data to be written */  UINT btw,         /*  Number of bytes to wr ...
是调用f_write,我们有例程的。

新的问题,最好发个新帖子。不然一个帖子混太多问题,不利于别人搜索。
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 13:04:29 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-16 12:55
是调用f_write,我们有例程的。

新的问题,最好发个新帖子。不然一个帖子混太多问题,不利于别人搜索。

奥奥,知道了,例程里,只调用调用了写入字符串的函数f_puts,如果我想把内存卡里写入这样格式的数据:需要调用写字母函数,写数据函数,写字符串函数吗?

ACC_X,ACC_Y,ACC_Z,GYR_X,GYR_Y,GYR_Z,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,


包括换行(逗号为英文格式),因为这种格式的TXT保存后,在在电脑端,只要把文件的名修改为.csv格式,就可以直接用EXCEL打开,而且便于MATLAB分析。
回复 支持 反对

使用道具 举报

发表于 2014-9-16 13:05:45 | 显示全部楼层
快乐的味道92 发表于 1410843869
奥奥,知道了,例程里,只调用调用了写入字符串的函数f_puts,如果我想把内存卡里写入这样格式的数据:需要调用写字母函数,写数据函数,写字符串函数吗?

ACC_X,ACC_Y,ACC_Z,GYR_X,GYR_Y,GYR_Z,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-169,74,
1765,-1424,7361,-52,-16 ...
可以调用写入字符串的函数f_puts

如果你的是变量,可以用sprintf转换为字符串,再写入
来自PC客户端 来自PC客户端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 13:08:19 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-16 13:05
可以调用写入字符串的函数f_puts

如果你的是变量,可以用sprintf转换为字符串,再写入

奥奥,上面几个就是变量,需要把写入数据的函数放在中断里,隔一段时间把这几个变量,按这种格式写入SD卡中。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 14:52:49 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-16 13:05
可以调用写入字符串的函数f_puts

如果你的是变量,可以用sprintf转换为字符串,再写入

例程里定义含有100个元素的buff[100]是干什么用的?好像后面的程序代码没有用到,只有memset(buff,0,BUFF_SIZE);用到了
  1.     FIL     fdst;   //文件
  2.     FATFS   fs;     //文件系统
  3.     uart_init(UART3,115200);
  4.     uint32 size, sizetmp;
  5.     int res;
  6.     char *str = "感谢您选用 野火Kinetis开发板 !^_^\n野火初学123论坛:chuxue123.com";
  7.     uint8 buff[BUFF_SIZE];

  8.     memset(buff,0,BUFF_SIZE);

  9.     f_mount(0, &fs);                                                               //挂载文件系统


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 14:56:16 | 显示全部楼层
快乐的味道92 发表于 2014-9-16 14:52
例程里定义含有100个元素的buff[100]是干什么用的?好像后面的程序代码没有用到,只有memset(buff,0,BUFF ...

SD卡操作时不用初始化吗?
回复 支持 反对

使用道具 举报

发表于 2014-9-16 14:58:31 | 显示全部楼层
快乐的味道92 发表于 2014-9-16 14:56
SD卡操作时不用初始化吗?

当然要初始化啊,不是有例程的吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 15:10:01 | 显示全部楼层
汤静云 发表于 2014-9-16 14:58
当然要初始化啊,不是有例程的吗?

初始化 SD卡 在 f_open 上执行, 什么时候关闭文件f_close(&fdst); 不执行关闭文件时,数据保存了吗?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 15:40:49 | 显示全部楼层
山外メ雲ジ 发表于 2014-9-16 13:05
可以调用写入字符串的函数f_puts

如果你的是变量,可以用sprintf转换为字符串,再写入

sprintf((char *)SD_buff,"%s%d",str2,i);         //把str和i合并成一个字符串到buff里,再进行发送这个函数的参数,str2和i(str是字符串,i是个float数据)的前后顺序有要求吗?
写成这个样子sprintf((char *)SD_buff,"%s%d",i,str2);  是不是把str和i合并成一个字符串到buff里,再进行发送合并成一个字符串到buff里,再进行发送。
可不可以达到这样的效果:当char *str = “,”;i = 11.3875

使用sprintf((char *)SD_buff,"%s%d",str2,i); 时 得到的SD_Buff[] = ",11.3875"


使用sprintf((char *)SD_buff,"%s%d",i,str2); 时 得到的SD_Buff[] = "11.3875,"
(注意一个逗号在前,一个逗号在后)
回复 支持 反对

使用道具 举报

发表于 2014-9-16 15:44:32 | 显示全部楼层
sprintf 的用法跟 pritf 几乎相同的啊,感觉你不会用。

%s %d 这些都是按顺序对应后面的不同变量
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 15:52:52 | 显示全部楼层
荆怀卉 发表于 2014-9-16 15:44
sprintf 的用法跟 pritf 几乎相同的啊,感觉你不会用。

%s %d 这些都是按顺序对应后面的不同变量

不好意思,之前用过,只是sprintf没有我想象的那么强大而已,这样我就得迫不得已改变SD卡的存储方式了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-9-16 15:54:01 | 显示全部楼层
快乐的味道92 发表于 2014-9-16 15:52
不好意思,之前用过,只是sprintf没有我想象的那么强大而已,这样我就得迫不得已改变SD卡的存储方式了

每次想SD卡中写入数据都要执行这句吗?f_sync(&fdst);
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回列表 返回顶部