STM32通过FATFS给文件名写日期,便于数据记录

很奇怪,用之前的在C语言中跑通,在STM32中容易坏死,出现丢内存的情况,具体问题标记,回头在分析,反正是跑不通。在STM32中debug中发现了死机。

这时候看见了一个全新版本,使用mallac,在C语言中跑通了,但是malloc在STM32中不能使用,想一想也是郁闷,例子代码如下:

#include <STDIO.H>
#include <STRING.H>
#include <STDLIB.H>

int main()
{
    char str1[]={"0:/"}; //文件头名,最后汇总在这里,给的空间大一些

    char str2[] = "abcdefg";
    char str3[]={".txt"};//文件尾名
    char *pstr = NULL;


    pstr = (char*)malloc(strlen(str1) + (strlen(str2)) + (strlen(str3))+1);
    strcpy(pstr, str1);
    strcpy((pstr + strlen(str1)), str2);

    strcpy(pstr+strlen(str1)+strlen(str2),str3);
    //strcpy((pstr + strlen(str1))), str2);

    printf("%s",pstr);



    //printf("%s",pstr);

 return 0;
}

由于对stm32 malloc内存使用不熟悉,再次进行调试,使用这个代码,感觉也还不错,在C语言中跑通了,是正确的。STM32不会死机,但是数据不对,其中字符串2重复了了两遍,不知道为啥。debug发现了这个问题。

C语言跑通的版本如下,三字节合并。

#include <stdio.h>
#include <stdlib.h>

void contact(char *str, const char *str1, const char *str2);
char str1[]={"0:/"}; //文件头名,最后汇总在这里,给的空间大一些

char str2[] = "abcdefg";
char str3[]={".txt"};//文件尾名
char str[];
int main()
{



		contact(str, str1, str2);
		contact(str,str,str3);
		printf("%s\n",str);

	return 0;
}

/**
 * Description:字符串连接函数
 */
void contact(char *str, const char *str1, const char *str2)
{
	int i, j;

	for(i = 0; str1[i] != '\0'; i ++)
	{
		str[i] = str1[i];
	}
	for(j = 0; str2[j] != '\0'; j ++)
	{
		str[i + j] = str2[j];
	}
	str[i + j] = '\0';
}

通过debug,对字符格式硬调,最后得到的格式如下。定时器6的代码如下:

#include "timer6.h"
#include "led.h"
#include "malloc.h"
#include "sdio_sdcard.h"  
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"    
#include <string.h>
#include <stdio.h>
#include "rtc.h" 
#include <STDIO.H>
#include <STRING.H>
#include <STDLIB.H>
extern FIL fil;
extern FRESULT res;
extern UINT bww;
extern BYTE buffer;

extern char str_Time[25];
extern _calendar_obj calendar;//时钟结构体 

void contact(char *str, const char *str1, const char *str2,const char *str3);
char str1[3]="0:/"; //文件头名,最后汇总在这里,给的空间大一些

char str2[11] = "abcdefg";
char str3[10]=".txt";//文件尾名
char str[30];
//通用定时器6中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM6_Int_Init(u16 arr,u16 psc)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
  //查查定时器1,2,3,4,5,6,7
	//RCC_APB1PeriphClockCmd,含有定时器2,3,4,5,6,7
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE); //时钟使能 6
	
	//定时器TIM6初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM6, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE ); //使能指定的TIM6中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM6, ENABLE);  //使能TIMx					 
}
//定时器6中断服务程序
void TIM6_IRQHandler(void)   //TIM1中断
{
	if (TIM_GetITStatus(TIM6, TIM_IT_Update) != RESET)  //检查TIM1更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM6, TIM_IT_Update  );  //清除TIMx更新中断标志 
		sprintf(str2,"%2d-%2d-%2d",calendar.w_year,calendar.w_month,calendar.w_date);
		contact(str, str1, str2,str3);
			
		//if(calendar.sec == 45)
		{
				res=f_open (&fil,str,FA_OPEN_ALWAYS|FA_WRITE);//FA_CREATE_ALWAYS,固定文件名
			  //res=f_open (&fil,pstr,FA_OPEN_ALWAYS|FA_WRITE);
				sprintf(str_Time,"%4d-%2d-%2d %2d:%2d:%2d\r\n",calendar.w_year,calendar.w_month,calendar.w_date,calendar.hour,calendar.min,calendar.sec);
				f_lseek (&fil,f_size (&fil)); //文件对象的读写指针移动到文件结束处
				f_write(&fil,str_Time,sizeof(str_Time)-1,&bww);
				f_close(&fil);	
		}

		}
}
/**
 * Description:字符串连接函数
 */

//此段代码有问题,我觉得很奇怪,就这样吧
void contact(char *str, const char *str1, const char *str2,const char *str3)
{
	int i, j,k;

	for(i = 0; str1[i] != '\0'; i ++)
	{
		str[i] = str1[i];
	}
	for(k = 0; str3[k] != '\0'; k ++)
	{
		str[i + k] = str3[k];
	}
//	for(k = 0; str3[k] != '\0'; k ++)
//	{
//		str[i + j + k] = str3[k];
//	}

	str[i + j + k] = '\0';
}

 

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值