硬件平台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内存管理的可以看我前一章的记录
实验结果