Преглед на файлове

1.生成日期更新为20221125;
2.实现基于循环缓冲区的FALSH离线数据存储重发,根据配置的FLASH芯片型号自动确定存储容量;
2.增加FATFS,little fs, ring fs第三方中间件;增加SPI接口驱动,W25Q驱动程序;
3.增加队列缓冲区,实现FLASH读写任务,确定FLASH读写任务不影响其它任务的运行;
4.兼容RAM数据缓冲区,上电无FLASH或FLASH异常时启用RAM数据缓冲区;
4.实现补传数据帧头校验,丢弃非法数据;
5.修正车辆破封,其它仓可正常施封;

libo преди 2 години
родител
ревизия
7c040a96e3
променени са 22 файла, в които са добавени 310 реда и са изтрити 162 реда
  1. 1 1
      Inc/DS1302.h
  2. 1 1
      Inc/FreeRTOSConfig.h
  3. 17 1
      Inc/main.h
  4. 2 9
      Src/DS1302.c
  5. 8 3
      Src/KeySlave485.c
  6. 48 4
      Src/TerminalSlave485_jt808.c
  7. 17 15
      Src/freertos.c
  8. 24 31
      Src/main.c
  9. 11 20
      Src/spi.c
  10. 28 1
      dev/dev_spi_sdcard.c
  11. 2 1
      dev/dev_spi_sdcard.h
  12. 105 21
      func/func_fatfs.c
  13. 2 0
      func/func_fatfs.h
  14. 11 29
      func/func_ram_record.c
  15. 1 0
      func/func_ram_record.h
  16. 6 3
      mid_fatfs/fatfs.c
  17. 3 3
      mid_fatfs/fatfs.h
  18. 1 1
      mid_fatfs/ffconf.h
  19. 9 4
      obj/obj_spi_sd_stm32.c
  20. 2 14
      sys/sys_api.h
  21. 10 0
      sys/sys_delay.c
  22. 1 0
      sys/sys_delay.h

+ 1 - 1
Inc/DS1302.h

@@ -46,7 +46,7 @@ uint8_t ds1302_Read_Byte(uint8_t addr);
 void ds1302_Write_Time(uint8_t *Time_buf);
 void ds1302_Read_Time(void);
 void ds1302_Get_Time(uint8_t *time);
-void delay_us(uint32_t us);
+
 
 //ÐÂÔöº¯Êý  ÀîΰÐÞ¸Ä
 void Set_IO_INPUT(void);

+ 1 - 1
Inc/FreeRTOSConfig.h

@@ -103,7 +103,7 @@
 #define configTICK_RATE_HZ                       ((TickType_t)1000)
 #define configMAX_PRIORITIES                     ( 7 )
 #define configMINIMAL_STACK_SIZE                 ((uint16_t)256)
-#define configTOTAL_HEAP_SIZE                    ((size_t)16384+10*1024 +50*1024 )
+#define configTOTAL_HEAP_SIZE                    ((size_t)16384+10*1024 +60*1024 )
 #define configMAX_TASK_NAME_LEN                  ( 16 )
 #define configUSE_16_BIT_TICKS                   0
 #define configUSE_MUTEXES                        1

+ 17 - 1
Inc/main.h

@@ -66,6 +66,7 @@ extern "C" {
 #define REMOTE_IAP_UPDATA 		1 	//是否是远程升级
 #define WATCH_DOG_ON 					1   //是否打开看门狗 //0----关闭看门狗SP706   1----打开看门狗SP706
 #define USE_RAM_RECORD    		1   //是否启用RAM数据缓存重发机制
+#define USE_QUEUE_RECORD			1   //是否启用队列数据缓存重发机制
 
 
 #if REMOTE_IAP_UPDATA>0
@@ -74,8 +75,23 @@ extern "C" {
 #define IR_ROM1 	0x8000000  //APP1
 #endif
 
-#define USE_FATFS_RECORD 			0  //FATFS文件补传功能
+
 #define USE_TIME_FRAM		 			1  //FRAM中存储时间,保证掉电时间连续
+#define USE_SPI_SD 						0  //SPI SD卡功能
+#define USE_SPI_FLASH					1  //SPI FLASH W25QXX功能
+
+
+
+#if 	USE_SPI_SD||USE_SPI_FLASH
+
+#define USE_FATFS_RECORD 			0 //FATFS文件补传功能
+#define USE_LFS_RECORD 				0 //little FS文件补传功能
+#define USE_RFS_RECORD 				1 //RING FS文件补传功能
+#else
+#define USE_FATFS_RECORD 			0  //FATFS文件补传功能
+#define USE_LFS_RECORD 				0 //little FS文件补传功能	
+#define USE_RFS_RECORD 				0 //RING FS文件补传功能
+#endif
 
 extern uint32_t sd000,sd001;//浮点数转换为实时显示的参数,4字节
 extern uint16_t uart4RxCounter; //串口4接收数据计数器

+ 2 - 9
Src/DS1302.c

@@ -1,5 +1,6 @@
 #include "Data_deal.h"
 #include "DS1302.h"
+#include "sys_delay.h"
 uint8_t time_buf[7]  = {0x20,0x20,0x05,0x29,0x17,0x20,0x14}; //初始时间2020年5月29号17点41分14秒 星期五
 
 //DS1302初始化
@@ -55,15 +56,7 @@ void DS1302_IO_OUT(void)
   GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
   HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
 }
-void delay_us(uint32_t us)
-{
-	uint16_t i = 0;
-	i = us*216;
-	while (i--)
-	{
-		__NOP();
-	}
-}
+
 //void delay_us(uint32_t us)
 //{
 //    uint32_t delay = (HAL_RCC_GetHCLKFreq() / 6000000 * us);

+ 8 - 3
Src/KeySlave485.c

@@ -38,7 +38,7 @@ uint8_t product_code[20] = "JL-SIMS-CJ-V2.1";				 //
 uint8_t product_ID[20] = "20210730001";						 //产品ID
 
 char Version_software[30] = "KZB09A0_20220210_Temp1";
-uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20221111};
+uint32_t Version_Soft[8] = {2,2,3,13,1,1,0,20221125};
 
 uint8_t flag_exitReset = 0;	 //终止复位命令
 uint8_t flag_Uart4_Busy = 0; //表明打印机占用了总线,暂停语音播报
@@ -689,11 +689,16 @@ void Mode_key_pageID(void)
 
 				//if (Full_Oil_allinfo.Break_sealing_Id > 0)
 				{
-					if (((Config_info_all.Config_fun_id & 0x08) == 0x08) || (Full_Oil_allinfo.Break_sealing_Id==0)) //==0x08对应于bit3-----可以重复施封
+					//if (((Config_info_all.Config_fun_id & 0x08) == 0x08) || (Full_Oil_allinfo.Break_sealing_Id==0)) //==0x08对应于bit3-----可以重复施封
 					{
 						for (i = 0; i < StoreNumber; i++)
 						{
-							if (((flag_En_BlankSeal == 0x01) || (IO_Date.IO_unload_switch & (1 << i))))
+							if (
+								(((flag_En_BlankSeal == 0x01) || (IO_Date.IO_unload_switch & (1 << i))))
+							&&
+							(((Full_Oil_allinfo.Break_sealing_Id&(1<<i)) == 0)							//判断当前仓是否处于破封状态,boly add 20221121
+							||((Config_info_all.Config_fun_id & 0x08) == 0x08)	)						//==0x08对应于bit3-----可以重复施封
+							)
 							{ //允许空仓施封
 
 								//if ((Full_Oil_allinfo.Break_sealing_Id & (1 << i)) == (1 << i))

+ 48 - 4
Src/TerminalSlave485_jt808.c

@@ -29,6 +29,7 @@
 #include "md5c.h"
 #include "cmsis_os.h"
 #include "func_ram_record.h"
+#include "func_queue_record.h"
 /* Private macro------------------------------------------------------------------------------*/
 /* Private typedef----------------------------------------------------------------------------*/
 #pragma pack(1)
@@ -47,6 +48,7 @@ typedef struct JT808_DATA_OBJ
 	uint32_t back_cnt;					//接收超时计数
 	uint32_t link_cnt;					//连接计数器
 	uint32_t link_ok;						//连接标志位
+
 	
 	SEND_DATA_UNIT_STC send_data;
 }JT808_DATA_OBJ; 
@@ -664,13 +666,36 @@ void jt808_recv_func_DataBack(uint8_t * buf ,uint8_t len)
 	{
 		//清除发送缓冲区数据
 		memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
-		//从内存数据栈中读取缓冲数据
-		read_len = func_ram_record_delete((void *)&(jt808_obj.send_data), DATA_UNIT_SIZE);	
+		
+		
+#if  USE_QUEUE_RECORD==1 
+		if(func_record_queue_flash_get() == true)
+		{
+			read_len = func_record_queue_read((void *)&(jt808_obj.send_data), (uint32_t)DATA_UNIT_SIZE);
+		}
+		else
+#endif		
+		
+#if USE_RAM_RECORD==1
+		{		
+			//从内存数据栈中读取缓冲数据
+			read_len = func_ram_record_delete((void *)&(jt808_obj.send_data), DATA_UNIT_SIZE);		
+		}
+#else
+		{
+		;
+		}		
+#endif
 		
 		if( read_len != DATA_UNIT_SIZE)
 		{
 			memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
 		}
+		else if( jt808_obj.send_data.buf[0] != JT808_FRAM_HEAD_ID)
+		{
+			memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
+		}
+
 		
 		//如果本帧数据重发次数大于5,则清除本帧数据
 		if(jt808_obj.send_data.send_cnt > 5)
@@ -719,7 +744,24 @@ void jt808_save_send_data(uint8_t * buf ,uint16_t len)
 	
 	if(jt808_obj.send_data.flowID != 0)
 	{
-		func_ram_record_write((uint8_t *)&(jt808_obj.send_data) , DATA_UNIT_SIZE);
+		
+#if USE_QUEUE_RECORD==1
+		if(func_record_queue_flash_get() == true)
+		{
+				func_record_queue_write((uint8_t *)&(jt808_obj.send_data) , DATA_UNIT_SIZE);
+		}
+		else
+#endif			
+#if USE_RAM_RECORD==1		
+		{
+				func_ram_record_write((uint8_t *)&(jt808_obj.send_data) , DATA_UNIT_SIZE);
+		}
+#else
+		{
+		;
+		}			
+#endif		
+		
 		memset((void *)&(jt808_obj.send_data), 0x00, sizeof(jt808_obj.send_data));
 	}
 	
@@ -833,9 +875,11 @@ void jt808_DoInternalSensorScanAndPost(void)
 void jt808_InitSensorScanParam(void)
 {
 	uint8_t data[16];
-	
+
+#if USE_RAM_RECORD==1
 	//初始化补传缓冲区内存
 	func_ram_record_init();
+#endif
 	
 	FM25L16B_Read_N_Bytes(FRAM_ADDR_Scan_Param, data, 16);
 	if(data[0] == 0x5A){

+ 17 - 15
Src/freertos.c

@@ -66,19 +66,20 @@
 #include "ScreenMaster485.h"
 #include "Elec_Seal.h"
 #include "Dwin.h"
-#include "func_record.h"
+#include "func_fatfs_record.h"
+#include "func_lfs_record.h"
+#include "func_queue_record.h"
 #include "Data_deal.h"
 #include "DS1302.h"
-//#include "lib_ringfs_example.h"
 #include "DS1302Drv.h"
 #include "usart.h"
 #include <string.h> //memset函数
-
+#include "func_spi_w25qxx.h"
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
 /* USER CODE BEGIN PTD */
-
+#define	DEBUG_FREERTOS_TASK 	0
 /* USER CODE END PTD */
 
 /* Private define ------------------------------------------------------------*/
@@ -436,9 +437,7 @@ static void AppObjCreate (void)
 void MX_FREERTOS_Init(void)
 {
 	/* USER CODE BEGIN Init */
-#if 0
-	lib_ringfs_main();
-#endif	
+
 	/* USER CODE END Init */
 
 	/* USER CODE BEGIN RTOS_MUTEX */
@@ -456,19 +455,22 @@ void MX_FREERTOS_Init(void)
 	/* Create the thread(s) */
 	/* definition and creation of Uart_Comm */
 	//osThreadDef(Uart_Comm, Task_Usart_GetAllSensorData, osPriorityAboveNormal, 0, 512);
+#if DEBUG_FREERTOS_TASK==0
 	osThreadDef(Uart2_Comm, Task_Usart2_Collector, osPriorityAboveNormal, 0, 512 * 2); //20200106李伟更改
 	Uart2_CommHandle = osThreadCreate(osThread(Uart2_Comm), NULL);
 
 	osThreadDef(Uart_Terminal, Task_Usart1_Terminal, osPriorityNormal, 0, 512 * 2); //终端数据通信任务
 	Usart1_TerminalHandle = osThreadCreate(osThread(Uart_Terminal), NULL);
-#if USE_FATFS_RECORD
-	/* definition and creation of Data_Process */
-	if(func_record_fatfs_isOK() == true)
-	{	
-		osThreadDef(task_record, func_record_main, osPriorityNormal, 0, 512 * 4);
+#endif	
+
+#if	USE_RFS_RECORD==1	
+	
+		osThreadDef(task_record, func_record_queue_main, osPriorityNormal, 0, 512 * 16);
 		task_record_Handle = osThreadCreate(osThread(task_record), NULL);
-	}	
 #endif	
+
+	
+#if DEBUG_FREERTOS_TASK==0
 	/* definition and creation of Data_Process */
 	osThreadDef(Data_Process, Task_Usart3_LCD_Update, osPriorityNormal, 0, 512 * 4);
 	Data_ProcessHandle = osThreadCreate(osThread(Data_Process), NULL);
@@ -483,7 +485,8 @@ void MX_FREERTOS_Init(void)
 	osThreadDef(GetCPU_Usage_Process, Task_GetCPU_Usage, osPriorityBelowNormal, 0, 512 * 2);
 	Task_GetCPU_Usage_Handle = osThreadCreate(osThread(GetCPU_Usage_Process), NULL);		
 
-
+#endif
+	
 	AppObjCreate();
 	
 	/* USER CODE END RTOS_THREADS */
@@ -1052,7 +1055,6 @@ void Task_GetCPU_Usage(void const *argument)
 	ds1302_time_init(m_datetime);
 #endif //======USE_TIME_FRAM=============	
 	UNUSED(min);
-
 	
 #if 0	
 	while(1)

+ 24 - 31
Src/main.c

@@ -87,8 +87,8 @@ Note by Daiyf at 2021-2-3
 #include "leaf_ota.h"
 #include "obj_spi_sd_stm32.h"
 #include "func_fatfs.h"
-#include "func_record.h"
-
+#include "func_fatfs_record.h"
+#include "func_spi_w25qxx.h"
 uint32_t sd000,sd001;//浮点数转换为实时显示的参数,4字节
 uint16_t uart4RxCounter=0; //串口4接收数据计数器
   
@@ -166,28 +166,28 @@ int main(void)
 
   /* USER CODE BEGIN SysInit */
 	
-				if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
-        {
-           //这是上电复位
-					PrintCnt=99;
-        }
-        else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
-        {
-           //这是外部RST管脚复位RCC_GetFlagStatus
-					PrintCnt=88;
-        }
-        else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)!= RESET)
-        {
-           ////软件复位
-        }
-				else if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))//独立看门狗复位
-				{
-						;//
-				}
-        //RCC_ClearFlag();//清除RCC中复位标志
-				__HAL_RCC_CLEAR_RESET_FLAGS();//清除所有复位标识,用于复位类型的判断
+	if(__HAL_RCC_GET_FLAG(RCC_FLAG_PORRST) != RESET)
+	{
+		 //这是上电复位
+		PrintCnt=99;
+	}
+	else if (__HAL_RCC_GET_FLAG(RCC_FLAG_PINRST) != RESET)
+	{
+		 //这是外部RST管脚复位RCC_GetFlagStatus
+		PrintCnt=88;
+	}
+	else if (__HAL_RCC_GET_FLAG(RCC_FLAG_SFTRST)!= RESET)
+	{
+		 ////软件复位
+	}
+	else if(__HAL_RCC_GET_FLAG(RCC_FLAG_IWDGRST))//独立看门狗复位
+	{
+			;//
+	}
+	//RCC_ClearFlag();//清除RCC中复位标志
+	__HAL_RCC_CLEAR_RESET_FLAGS();//清除所有复位标识,用于复位类型的判断
   /* USER CODE END SysInit */
-
+	
   /* Initialize all configured peripherals */
   MX_GPIO_Init();
 	HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_2);//看门狗sp706
@@ -220,16 +220,9 @@ int main(void)
 	//HAL_UART_Receive_DMA(&huart2, USART_RX_BUF_U2,Uart2_BUF_SIZE);
   /* USER CODE END 2 */
 	
-#if USE_FATFS_RECORD
-	//add boly 20221014  SD卡 FATFS组件初始化
-	func_fatfs_init();
-	func_fatfs_main();
-	//end boly
-#endif
-
   /* Call init function for freertos objects (in freertos.c) */
   MX_FREERTOS_Init();
-
+	
 	/* 创建互斥信号量 */
 	xSemaphore_uart4 = xSemaphoreCreateMutex();
 

+ 11 - 20
Src/spi.c

@@ -88,27 +88,18 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle)
 	if(spiHandle->Instance==SPI2)
   {
   /* USER CODE BEGIN SPI2_MspInit 0 */
-
-  /* USER CODE END SPI2_MspInit 0 */
-    /* Peripheral clock enable */
-    __HAL_RCC_SPI2_CLK_ENABLE();
-    __HAL_RCC_GPIOB_CLK_ENABLE();
-    /**SPI2 GPIO Configuration   
-		PB12     ------> SPI2_NSS
-    PB13     ------> SPI2_SCK
-    PB14     ------> SPI2_MISO
-    PB15     ------> SPI2_MOSI 
-    */
-    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
-    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
-    GPIO_InitStruct.Pull = GPIO_NOPULL;
-    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
-    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
-    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+	__HAL_RCC_SPI2_CLK_ENABLE();//ʹÄÜSPI4ʱÖÓ	
+#if 0
+		extern void HAL_SPI_MspInit_flash(void);
+		 HAL_SPI_MspInit_flash();
+#elif  1
+		extern void HAL_SPI_MspInit_w25qxx(SPI_HandleTypeDef *hspi);
+		HAL_SPI_MspInit_w25qxx(spiHandle);
 		
-    /* SPI1 interrupt Init */
-    HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0);
-    HAL_NVIC_EnableIRQ(SPI2_IRQn);
+#else		
+		extern void HAL_SPI_MspInit_SDCARD(SPI_HandleTypeDef *hspi);
+		HAL_SPI_MspInit_SDCARD(spiHandle);
+#endif		
   /* USER CODE BEGIN SPI2_MspInit 1 */
 
   /* USER CODE END SPI2_MspInit 1 */

+ 28 - 1
dev/dev_spi_sdcard.c

@@ -55,7 +55,31 @@ SPI_HandleTypeDef hspi2;
 /* USER CODE BEGIN 0 */
 
 /* USER CODE END 0 */
-
+void HAL_SPI_MspInit_SDCARD(SPI_HandleTypeDef *hspi)
+{
+		GPIO_InitTypeDef GPIO_InitStruct = {0};
+	  /* USER CODE END SPI2_MspInit 0 */
+    /* Peripheral clock enable */
+    __HAL_RCC_SPI2_CLK_ENABLE();
+    __HAL_RCC_GPIOB_CLK_ENABLE();
+		__HAL_RCC_GPIOD_CLK_ENABLE();
+    /**SPI2 GPIO Configuration   
+		PB12     ------> SPI2_NSS
+    PB13     ------> SPI2_SCK
+    PB14     ------> SPI2_MISO
+    PB15     ------> SPI2_MOSI 
+    */
+    GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
+    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
+    GPIO_InitStruct.Pull = GPIO_NOPULL;
+    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
+    GPIO_InitStruct.Alternate = GPIO_AF5_SPI2;
+    HAL_GPIO_Init(GPIOB, &GPIO_InitStruct);
+		
+    /* SPI1 interrupt Init */
+    HAL_NVIC_SetPriority(SPI2_IRQn, 0, 0);
+    HAL_NVIC_EnableIRQ(SPI2_IRQn);
+}
 
 void SDCARD_SPI_Init(void)
 {
@@ -91,6 +115,8 @@ void SDCARD_SPI_Init(void)
 }
 
 
+
+
 /**
   * @brief GPIO Initialization Function
   * @param None
@@ -102,6 +128,7 @@ void SDCARD_GPIO_Init(void)
   /* GPIO Ports Clock Enable */
   __HAL_RCC_GPIOD_CLK_ENABLE();
   __HAL_RCC_GPIOB_CLK_ENABLE();
+	__HAL_RCC_GPIOC_CLK_ENABLE();
 
 }
 

+ 2 - 1
dev/dev_spi_sdcard.h

@@ -50,11 +50,12 @@ extern "C" {
 
 /* USER CODE END EM */
 
-
+extern SPI_HandleTypeDef hspi2;
 
 /* Exported functions prototypes ---------------------------------------------*/
 
 /* USER CODE BEGIN EFP */
+void SPI_W25Q_Init(void);
 void SDCARD_GPIO_Init(void);
 void SDCARD_SPI_Init(void);
 /* USER CODE END EFP */

+ 105 - 21
func/func_fatfs.c

@@ -24,15 +24,16 @@
 #if USE_FATFS_RECORD
 
 #include "dev_spi_sdcard.h"
+#include "func_spi_w25qxx.h"
 #include "func_fatfs.h"
-
+#include "func_fatfs_record.h"
 /* Private includes ----------------------------------------------------------*/
 /* USER CODE BEGIN Includes */
 
 /* USER CODE END Includes */
 
 /* Private typedef -----------------------------------------------------------*/
-#define MAX_FILE_COUNT  20
+
 
 /* Private define ------------------------------------------------------------*/
 /* USER CODE BEGIN PD */
@@ -59,10 +60,13 @@ FIL 	testFile;
 uint8_t testBuffer[16] = "SD write success";
 
 
-char 		readbuffer[512];
-
+char 		fatfs_buf[4*1024];
 
-char SDPath[4];
+#if  USE_SPI_SD
+const char FATFS_Path[4] = "0:/"; 					//挂载SD卡 
+#else
+const char FATFS_Path[4] ;//= "1:/"; 					//挂载FLASH.
+#endif
 char readnrf,reafsd;
 
 /* USER CODE END PFP */
@@ -80,18 +84,42 @@ void 	func_fatfs_Get_Capacity(void);
 int func_fatfs_init(void)
 {
 	FRESULT res;
+	 
+	uint8_t format_disk = 0;
 
   /* Initialize all configured peripherals */
-  SDCARD_GPIO_Init();
-  SDCARD_SPI_Init();
-  SDCARD_FATFS_Init();
+	
+  FATFS_Init();
+
+	//res = f_mkfs ( FATFS_Path, FM_ANY, 0, fatfs_buf, sizeof(fatfs_buf));
   /* USER CODE BEGIN 2 */
-	res = f_mount(&fileSystem, (const TCHAR*)&SDPath, 1);
+	res = f_mount(&fileSystem, (const TCHAR*)FATFS_Path, 1);
 	
   if(res != FR_OK)
   {
 			func_record_fatfs_set_OK(false);
 	}
+	if(res == FR_NO_FILESYSTEM)//FLASH磁盘,FAT文件系统错误,重新格式化FLASH
+	{
+//		
+		while(res != FR_OK)
+		{
+			if(format_disk)
+			{
+				func_w25q_erase_ship();
+				format_disk = 0;
+			}
+			
+			if(format_disk)
+			{
+				res = f_mkfs (FATFS_Path, FM_ANY, 0, fatfs_buf, sizeof(fatfs_buf));
+				format_disk = 0;
+			}
+			
+			res = f_mount(&fileSystem, (const TCHAR*)FATFS_Path, 1);
+		};
+		
+	}	
   /* USER CODE END 2 */
 
   /* Infinite loop */
@@ -120,12 +148,27 @@ int func_fatfs_main(void)
 
 typedef struct fatfs_st
 {
-	uint16_t 	TotalSpace;	
+	DWORD 		TotalSpace;	
 	DWORD 		AvailableSize;
 	DWORD 		UsedSize;
 }fatfs_st;
 
-fatfs_st sd_fatfs_st;
+fatfs_st fatfs_run_st;
+
+void func_fatfs_Capacity(void)
+{
+		FATFS *hFatfs = &fileSystem;
+	
+		fatfs_run_st.TotalSpace=((hFatfs->n_fatent - 2) * hFatfs->ssize *hFatfs->csize)/1024;
+		fatfs_run_st.AvailableSize=(hFatfs->free_clst*hFatfs->ssize*hFatfs->csize)/1024;
+		fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;  
+} 
+
+uint32_t func_fatfs_get_free(void)
+{
+	return (fileSystem.free_clst*fileSystem.ssize*fileSystem.csize)/1024;
+}
+
 
 void func_fatfs_Get_Capacity(void)
 {
@@ -136,12 +179,37 @@ void func_fatfs_Get_Capacity(void)
 
 	FRESULT res;
 	
-	res = f_getfree(SDPath, &fre_clust, &fs);  /* 根目录 */
+	res = f_getfree(FATFS_Path, &fre_clust, &fs);  /* 根目录 */
 	if ( res == FR_OK ) 
 	{
-		sd_fatfs_st.TotalSpace=(uint16_t)(((fs->n_fatent - 2) * fs->csize ) / 2 /1024);
-		sd_fatfs_st.AvailableSize=(uint16_t)((fre_clust * fs->csize) / 2 /1024);
-		sd_fatfs_st.UsedSize=sd_fatfs_st.TotalSpace-sd_fatfs_st.AvailableSize;              
+		fatfs_run_st.TotalSpace=(fs->n_fatent - 2);
+		fatfs_run_st.AvailableSize=fre_clust;
+		fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;              
+		/* Print free space in unit of MB (assuming 512 bytes/sector) */
+//		printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB  used.\r\n",TotalSpace, AvailableSize,UsedSize);
+	}
+	else 
+	{
+//		printf("Get SDCard Capacity Failed (%d)\r\n", result);
+	}	
+	return;
+} 
+
+void func_fatfs_Get_Capacity_Sample(void)
+{
+//	FRESULT result;
+//	FATFS FS;
+	FATFS *fs;
+	DWORD fre_clust;	
+
+	FRESULT res;
+	
+	res = f_getfree(FATFS_Path, &fre_clust, &fs);  /* 根目录 */
+	if ( res == FR_OK ) 
+	{
+		fatfs_run_st.TotalSpace=(uint16_t)(((fs->n_fatent - 2) * fs->csize ) / 2 /1024);
+		fatfs_run_st.AvailableSize=(uint16_t)((fre_clust * fs->csize) / 2 /1024);
+		fatfs_run_st.UsedSize=fatfs_run_st.TotalSpace-fatfs_run_st.AvailableSize;              
 		/* Print free space in unit of MB (assuming 512 bytes/sector) */
 //		printf("\r\n%d MB total drive space.\r\n""%d MB available.\r\n""%d MB  used.\r\n",TotalSpace, AvailableSize,UsedSize);
 	}
@@ -165,7 +233,7 @@ FRESULT func_fatfs_miscellaneous(void)
   
   printf("\n*************** 设备信息获取 ***************\r\n");
   /* 获取设备信息和空簇大小 */
-  f_res = f_getfree((TCHAR const*)SDPath, &fre_clust, &pfs);
+  f_res = f_getfree((TCHAR const*)FATFS_Path, &fre_clust, &pfs);
 
   /* 计算得到总的扇区个数和空扇区个数 */
   tot_sect = (pfs->n_fatent - 2) * pfs->csize;
@@ -189,10 +257,10 @@ FRESULT func_fatfs_miscellaneous(void)
       /*  文件定位到文件起始位置 */
       f_res = f_lseek(&file,0);
       /* 读取文件所有内容到缓存区 */
-      f_res = f_read(&file,readbuffer,f_size(&file),&fnum);
+      f_res = f_read(&file,fatfs_buf,f_size(&file),&fnum);
       if(f_res == FR_OK)
       {
-        printf("》文件内容:\n%s\n",readbuffer);
+        printf("》文件内容:\n%s\n",fatfs_buf);
       }
     }
     f_close(&file);    
@@ -300,7 +368,7 @@ FRESULT func_fatfs_scan_files (char* path)
         path[i] = 0;         
         //打开失败,跳出循环        
         if (res != FR_OK) 
-					break; 
+					break;			
       } 
 			else 
 			{ 
@@ -344,18 +412,34 @@ void func_fatfs_ReadDirTest(char*path)
 }
 
 
+char*  pstr = 0;
+char*  pidx = 0;
+void func_record_fatfs_str(void)
+{
+	char  str_name[] ="20221112.TXT" ;
 
+	while(1)
+	{
+		pstr =  strstr(str_name,FILE_START);
+		
+		pidx =  strstr(str_name,FILE_END);
+		UNUSED(pstr);
+		UNUSED(pidx);
+	}
+}
+
+#if 0
 static int qsort_cmp(const void *a,const void *b)
 {
     return strcmp(( char * ) a, (const char* )b);
 }
-
+#define MAX_FILE_COUNT 20
 char fileList[MAX_FILE_COUNT][30];//保存文件名
-
 void func_fatfs_dir_qsort(uint32_t fcount)
 {
 	qsort(fileList, fcount, sizeof(fileList[0]), qsort_cmp);
 }
+#endif
 
 #endif //--------------------------USE_FATFS_RECORD------------------------------
 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

+ 2 - 0
func/func_fatfs.h

@@ -62,6 +62,8 @@ int func_fatfs_main(void);
 FRESULT func_fatfs_miscellaneous(void);			//FatFs多项功能测试
 FRESULT func_fatfs_file_check(void);				//文件信息获取
 FRESULT func_fatfs_scan_files (char* path); //递归扫描FatFs内的文件
+void func_fatfs_Get_Capacity(void);
+uint32_t func_fatfs_get_free(void);
 /* USER CODE END EFP */
 
 /* Private defines -----------------------------------------------------------*/

+ 11 - 29
func/func_ram_record.c

@@ -27,25 +27,7 @@
 #include "main.h"
 
 
-#if USE_RAM_RECORD==0
-void 		 func_ram_record_init(void)											//¼Ç¼Îļþ³õʼ»¯
-{
-	return;
-}
-uint32_t func_ram_record_write(uint8_t *buf ,uint32_t len)
-{
-	return 0;
-}
-uint32_t func_ram_record_read(uint8_t *buf ,uint32_t len)
-{
-	return 0;
-}
-uint32_t func_ram_record_delete(uint8_t *buf,uint32_t len)
-{
-	return 0;
-}
-
-#else
+#if USE_RAM_RECORD==1
 
 #include "Data_deal.h"
 /* Private includes ----------------------------------------------------------*/
@@ -112,30 +94,30 @@ typedef struct record_test_object
 	uint32_t 	cnts;
 	uint8_t 	test_flag;
 	char 			buf[32];
-}record_test_OBJ;
+}record_ram_OBJ;
 	
-record_test_OBJ record_test_obj;
+record_ram_OBJ record_ram_obj;
 
 void func_ram_record_test(void)
 {	
 	
-	record_test_obj.cnts++;
-	sprintf(record_test_obj.buf,"XX%08xXX",record_test_obj.cnts);
-	switch(record_test_obj.test_flag)
+	record_ram_obj.cnts++;
+	sprintf(record_ram_obj.buf,"XX%08xXX",record_ram_obj.cnts);
+	switch(record_ram_obj.test_flag)
 	{
 		case 0:
 		{
-			func_ram_record_write((uint8_t *)record_test_obj.buf ,strlen(record_test_obj.buf));
+			func_ram_record_write((uint8_t *)record_ram_obj.buf ,strlen(record_ram_obj.buf));
 		}break;
 		case 1:
 		{
-			func_ram_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
-			func_ram_record_delete((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
-			func_ram_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
+			func_ram_record_read	((uint8_t *)record_ram_obj.buf ,sizeof(record_ram_obj.buf));
+			func_ram_record_delete((uint8_t *)record_ram_obj.buf ,sizeof(record_ram_obj.buf));
+			func_ram_record_read	((uint8_t *)record_ram_obj.buf ,sizeof(record_ram_obj.buf));
 		}break;
 		default:
 		{
-			func_ram_record_read((uint8_t *)record_test_obj.buf ,sizeof(record_test_obj.buf));
+			func_ram_record_read	((uint8_t *)record_ram_obj.buf ,sizeof(record_ram_obj.buf));
 		}break;
 		
 	}

+ 1 - 0
func/func_ram_record.h

@@ -28,6 +28,7 @@ extern "C" {
 #endif
 
 /* Includes ------------------------------------------------------------------*/
+#include <stdint.h>
 #include "stm32f7xx_hal.h"
 #include "fatfs.h"
 /* Private includes ----------------------------------------------------------*/

+ 6 - 3
mid_fatfs/fatfs.c

@@ -27,11 +27,14 @@ FIL USERFile;       /* File object for USER */
 
 /* USER CODE END Variables */
 
-void SDCARD_FATFS_Init(void)
+void FATFS_Init(void)
 {
   /*## FatFS: Link the USER driver ###########################*/
-  retUSER = FATFS_LinkDriver(&USER_Driver, USERPath);
-
+#if  USE_SPI_FLASH>0   //SPI FLASH W25QXX¹¦ÄÜ
+	retUSER =  FATFS_LinkDriverEx(&W25Q_Driver, USERPath, 1);	
+#elif USE_SPI_SD>0   //SPI FLASH W25QXX¹¦ÄÜ
+	retUSER =  FATFS_LinkDriverEx(&sdcard_Driver, USERPath, 1);
+#endif
   /* USER CODE BEGIN Init */
   /* additional user code for init */     
   /* USER CODE END Init */

+ 3 - 3
mid_fatfs/fatfs.h

@@ -25,8 +25,8 @@
 
 #include "ff.h"
 #include "ff_gen_drv.h"
-#include "user_diskio.h" /* defines USER_Driver as external */
-
+#include "w25qxx_diskio.h" /* defines W25Q_Driver as external */
+#include "sdcard_diskio.h" /* defines USER_Driver as external */
 /* USER CODE BEGIN Includes */
 
 /* USER CODE END Includes */
@@ -36,7 +36,7 @@ extern char USERPath[4]; /* USER logical drive path */
 extern FATFS USERFatFS; /* File system object for USER logical drive */
 extern FIL USERFile; /* File object for USER */
 
-void SDCARD_FATFS_Init(void);
+void FATFS_Init(void);
 
 /* USER CODE BEGIN Prototypes */
 

+ 1 - 1
mid_fatfs/ffconf.h

@@ -114,7 +114,7 @@
 */
 
 #define _USE_LFN     0    /* 0 to 3 */
-#define _MAX_LFN     255  /* Maximum LFN length to handle (12 to 255) */
+#define _MAX_LFN     64  /* Maximum LFN length to handle (12 to 255) */
 /* The _USE_LFN switches the support of long file name (LFN).
 /
 /   0: Disable support of LFN. _MAX_LFN has no effect.

+ 9 - 4
obj/obj_spi_sd_stm32.c

@@ -5,14 +5,14 @@
 /* are platform dependent.                                               */
 /*-----------------------------------------------------------------------*/
 #include "obj_spi_sd_stm32.h"
-
+#include "dev_spi_sdcard.h"
 /*--------------------------------------------------------------------------
 
  Module Private Functions
 
  ---------------------------------------------------------------------------*/
  
-extern SPI_HandleTypeDef hspi2;
+//extern SPI_HandleTypeDef hspi2;
 
 #define SD_SPIDriver	  hspi2 
 
@@ -24,16 +24,21 @@ static BYTE CardType; /* b0:MMC, b1:SDC, b2:Block addressing */
 
 static BYTE PowerFlag = 0; /* indicates if "power" is on */
 
+
+
+
 static
 void SELECT(void)
 {
-	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
+	//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_RESET);
+	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_RESET);
 }
 
 static
 void DESELECT(void)
 {
-	HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
+	//HAL_GPIO_WritePin(GPIOB, GPIO_PIN_12, GPIO_PIN_SET);
+	HAL_GPIO_WritePin(GPIOC, GPIO_PIN_12, GPIO_PIN_SET);
 }
 
 static

+ 2 - 14
sys/sys_api.h

@@ -3,20 +3,8 @@
 #include "stm32f7xx.h"
 #include "core_cm7.h"
 #include "stm32f7xx_hal.h"
-//////////////////////////////////////////////////////////////////////////////////	 
-//本程序只供学习使用,未经作者许可,不得用于其它任何用途
-//ALIENTEK STM32H7开发板
-//系统时钟初始化	
-//正点原子@ALIENTEK
-//技术论坛:www.openedv.com
-//创建日期:2017/6/7
-//版本:V1.0
-//版权所有,盗版必究。
-//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
-//All rights reserved
-//********************************************************************************
-//修改说明
-//无
+
+
 //////////////////////////////////////////////////////////////////////////////////  
 
 //0,不支持os

+ 10 - 0
sys/sys_delay.c

@@ -195,6 +195,16 @@ void sys_delay_ms(u16 nms)
 	for(i=0;i<nms;i++) sys_delay_us(1000);
 }
 
+
+void delay_us(uint32_t us)
+{
+	uint16_t i = 0;
+	i = us*216;
+	while (i--)
+	{
+		__NOP();
+	}
+}
 #endif
 			 
 

+ 1 - 0
sys/sys_delay.h

@@ -20,5 +20,6 @@
 void sys_delay_init(u16 SYSCLK);
 void sys_delay_ms(u16 nms);
 void sys_delay_us(u32 nus);
+void delay_us(uint32_t us);
 #endif