stm32f4基于fatfs编写 EXCEL表格并储存与SDNAND中

硬件平台stm32F4
储存芯片 SDNAND或者SD卡都可以
将.csv文件在PC端另存为excel表格即可。
在编写.csv文件的时候 其实跟编写 .txt 文件几乎一模一样,需要注意的是 表格行之间要用 英文 “,” 隔开,然后写完当前行则使用 “\n” ( f_printf(&SDFile, “\n”)😉 将其换行即可。

实验代码如下:

/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "dma.h"
#include "fatfs.h"
#include "sdio.h"
#include "usart.h"
#include "gpio.h"
#include "fsmc.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "malloc.h"
#include "stdio.h"
#include "string.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
FATFS fs;                       /* FatFs 文件系统对象 */
FIL file;                       /* 文件对象 */
FRESULT f_res;                  /* 文件操作结果 */
UINT fnum;                      /* 文件成功读写数量 */
BYTE ReadBuffer[1024] = {0};    /* 读缓冲区 */
BYTE WriteBuffer[] =            /* 写缓冲区 */
    "This is STM32 working with FatFs\r\n";

uint32_t *pArraySram;

uint8_t test_Sram = 0;
uint8_t test_Sram1 = 0;

		//分配一个2维数组的内存

		int dim1 = 30;   // 第一维大小
		int dim2 = 30;   // 第二维大小


		// 分配行指针数组的内存
    char** myArray;
		int8_t ArrayBuf[20];

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
int fputc(int ch, FILE *f)
{
 uint8_t temp[1] = {ch};
 HAL_UART_Transmit(&huart6, temp, 1, 2);
 return ch;
}

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
//HAL_SD_CardInfoTypeDef  SDCardInfo;   
//HAL_SD_CardCIDTypeDef SDCard_CID; 
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_DMA_Init();
  MX_SDIO_SD_Init();
  MX_FATFS_Init();
  MX_USART6_UART_Init();
  MX_FSMC_Init();
  /* USER CODE BEGIN 2 */

//  my_mem_init(SRAMIN);//初始化内部内存池
	my_mem_init(SRAMEX);//初始化外部内存池
	
	//挂载文件系统
	f_res = f_mount(&SDFatFS, "0:/",1);
	HAL_Delay(100);
	if(f_res == FR_NO_FILESYSTEM)
	{
		f_res = f_mkfs("0:/",FM_FAT|FM_SFD,0,&ReadBuffer,sizeof(ReadBuffer));
		HAL_Delay(100);
		if(f_res == FR_OK)
		{
				f_res = f_mount(NULL,"0:/",1);
				f_res = f_mount(&SDFatFS, "0:/",1);
		}
	}
	HAL_Delay(100);

	//三维数组内存分配试验----------------------------------------------------------------

	// 分配第一维
	myArray = (char**)malloc(dim1 * sizeof(char**));

	// 分配剩余的两维
	for (int i = 0; i < dim1; i++)
	{
			myArray[i] = (char*)mymalloc(SRAMEX,dim2 * sizeof(char*));
	}
	
	//创建一个编程页面的 ProgramEdit.csv 表格文件
		f_res = f_open(&SDFile,"ProgramEdit.csv",FA_CREATE_ALWAYS|FA_WRITE);
		if(f_res == FR_OK)
		{
				printf("ProgramEdit.csv Creat secusess!\r\n");
		}
		else
		{
				printf("ProgramEdit.csv Creat fail!\r\n");
		}
		f_res = f_close(&SDFile);//创建完毕后关闭文件
		f_res = f_open(&SDFile,"ProgramEdit.csv",FA_CREATE_ALWAYS|FA_WRITE);//打开创建好的文件
		if(f_res == FR_OK)
		{
			printf("ProgramEdit.csv open secusess!\r\n");
			f_printf(&SDFile,"第一列,第二列,第三列,");

			for (int j = 0; j < dim1; j++) 
			{
				sprintf((char *)&ArrayBuf,"第%d,第%d,第%d,",j+1,j+2,j+3);
				strcpy(myArray[j],(char *)&ArrayBuf);
			}
			
			f_printf(&SDFile, "\n");
			// 写入数组数据
			for (int i = 0; i < dim1; i++) 
			{
					f_printf(&SDFile,"%s",myArray[i]);
					f_printf(&SDFile, "\n");
			}
		}
		else
		{
				printf("ProgramEdit.csv open fail!\r\n");
		}
		f_res = f_close(&SDFile);	
		
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		
		HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
//		printf("hello\r\n");
		HAL_Delay(180);
  }
  /* USER CODE END 3 */
}

若没有移植fatfs文件系统和malloc内存管理的可以看我前一章的记录

实验结果
在这里插入图片描述

  • 2
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一直想弄USB来着,今天就调试了下读U盘程序,自己测试了三个U盘和一个读卡器(U盘为4G、16G、16G,内存卡为2G)均可正常读取。废话不多说,介绍下实现的功能(各功能通过User键切换): 首先来张靓照,屏幕摔了两块,不敢买第三块了,索性拆了以前山寨机上的屏幕,自己做了个转接板,驱动成功(嘿嘿!) 1、读U盘信息,包括PID、VID和制造商等信息,如图: 2、读取U盘容量,用电脑看了下,容量一点不错。还有就是读取文件目录(这里暂时只做了两级显示) 3、创建一个TXT文件,并写入“STM32 Connectivity line Host Demo application using FAT_FS ”,在电脑端打开该TXT文件,其写入字符串正确。 4、显示一张BMP格式的图片(BMP图片显示最直接,就先弄它了),来自于ST 可实际发现,其图片竟然被镜像了,原因还在寻找(估计是驱动有问题)。不管怎样,U盘读成功之后,以后玩Discovery就爽多了,各种图片、音乐甚至是AVI视屏都有可能实现啦!还是那句老话,独乐乐不如众乐乐,代码必须得传上来,嘿嘿! 总结: 欢迎各位坛友在此基础之上完成新的功能,例如MP3格式音乐解码播放(WAV格式音乐毕竟非主流,播放一会主芯片还发热,就不搞WAV了)。还有emWin,我目前只是移植成功了,还没学会如何结合自己的需求进行应用,并且FPU功能的异常断问题还没解决,只能不使用FPU演示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值