久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5595|回復: 2
打印 上一主題 下一主題
收起左側

輕量級文件系統LittleFS完整工程

[復制鏈接]
跳轉到指定樓層
樓主
ID:690815 發表于 2020-2-7 15:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
LittleFS文件系統雖然官方有開源源碼,但移植到自己板子上時還是有這樣那樣的問題,現將移植好的完整工程上傳,經原子戰艦開發板驗證通過。
manc.c源碼如下:
littlefs例程—經原子戰艦開發板驗證.7z (643.61 KB, 下載次數: 101)





/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_hal.h"
#include "spi.h"
#include "usart.h"
#include "gpio.h"

/* USER CODE BEGIN Includes */
//#include "bsp_w25qxx.h."
#include "lfs.h"
#include "W25QXX.h"
/* USER CODE END Includes */

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

/* USER CODE BEGIN PV */
/* Private variables ---------------------------------------------------------*/

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);

/* USER CODE BEGIN PFP */
/* Private function prototypes -----------------------------------------------*/

/* USER CODE END PFP */

/* USER CODE BEGIN 0 */
uint32_t w25qxx_type=0;

lfs_t lfs;
lfs_file_t file;

static int user_provided_block_device_read(
    const struct lfs_config *lfsc, lfs_block_t block, lfs_off_t off, void *buffer, lfs_size_t size)
{
    W25QXX_Read((uint8_t *)buffer,(block * lfsc->block_size + off),size);
    return LFS_ERR_OK;
}

static int user_provided_block_device_prog(
    const struct lfs_config *lfsc, lfs_block_t block, lfs_off_t off, const void *buffer, lfs_size_t size)
{
    W25QXX_Write_NoCheck((uint8_t*)buffer,(block * lfsc->block_size + off),size);
    return LFS_ERR_OK;
}

static int user_provided_block_device_erase(const struct lfs_config *lfsc, lfs_block_t block)
{
    W25QXX_Erase_Sector(block);
    return LFS_ERR_OK;
}
static int user_provided_block_device_sync(const struct lfs_config *lfsc)
{
    return LFS_ERR_OK;
}

uint8_t lfs_read_buf[256];
uint8_t lfs_prog_buf[256];
uint8_t lfs_lookahead_buf[16];        // 128/8=16
uint8_t lfs_file_buf[256];
// configuration of the filesystem is provided by this struct
const struct lfs_config cfg = {
        // block device driver context data
        .context = NULL,
    // block device operations
    .read  = user_provided_block_device_read, //¶áè¡êy¾Y  
    .prog  = user_provided_block_device_prog, //±à3ìò»¸öéèÇø
    .erase = user_provided_block_device_erase,//2á3yò»¸öéèÇø
    .sync  = user_provided_block_device_sync,

    // block device configuration
    .read_size = 256,
    .prog_size = 256,//FLASH_PAGE_SIZE ò3′óD¡
    .block_size = 4096,//FLASH_SECTOR_SIZE éèÇø′óD¡
    .block_count = 1024,//éèÇøêyá¿
    .lookahead = 128,//±ØDëêÇ32μÄÕûêy±¶

    .read_buffer = lfs_read_buf,
        .prog_buffer = lfs_prog_buf,
        .lookahead_buffer = lfs_lookahead_buf,
        .file_buffer = lfs_file_buf,
};


/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  *
  * @retval None
  */
int main(void)
{
  /* USER CODE BEGIN 1 */
//Lifflefs_Test\Lifflefs_Test.axf: Error: L6218E: Undefined symbol __aeabi_assert (referred from lfs.o).
  /* 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_USART1_UART_Init();
  MX_SPI2_Init();
  /* USER CODE BEGIN 2 */
  w25qxx_type=W25QXX_ReadID();

int err = lfs_mount(&lfs, &cfg);

    // reformat if we can't mount the filesystem
    // this should only happen on the first boot
    if (err) {
        lfs_format(&lfs, &cfg);
        lfs_mount(&lfs, &cfg);
    }

    // read current count
    uint32_t boot_count = 0;
    lfs_file_open(&lfs, &file, "/boot_count", LFS_O_RDWR | LFS_O_CREAT);
    lfs_file_read(&lfs, &file, &boot_count, sizeof(boot_count));

    // update boot count
    boot_count += 1;
    lfs_file_rewind(&lfs, &file);
    lfs_file_write(&lfs, &file, &boot_count, sizeof(boot_count));

    // remember the storage is not updated until the file is closed successfully
    lfs_file_close(&lfs, &file);

    // release any resources we were using
    lfs_unmount(&lfs);

    // print the boot count
    printf("boot_count: %d\n", boot_count);

  /* USER CODE END 2 */

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

  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */

  }
  /* USER CODE END 3 */

}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{

  RCC_OscInitTypeDef RCC_OscInitStruct;
  RCC_ClkInitTypeDef RCC_ClkInitStruct;

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Initializes the CPU, AHB and APB busses clocks
    */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;

  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    _Error_Handler(__FILE__, __LINE__);
  }

    /**Configure the Systick interrupt time
    */
  HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);

    /**Configure the Systick
    */
  HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);

  /* SysTick_IRQn interrupt configuration */
  HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}

/* USER CODE BEGIN 4 */

/* USER CODE END 4 */

/**
  * @brief  This function is executed in case of error occurrence.
  * @param  file: The file name as string.
  * @param  line: The line in file as a number.
  * @retval None
  */
void _Error_Handler(char *file, int line)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  while(1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t* file, uint32_t line)
{
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */


評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:319537 發表于 2020-3-9 15:00 | 只看該作者
樓主你好,我使用的也是這種配置,為什么我在調試時,程序運行到lfs_file_open會打印錯誤lfs_error:978: Corrupted dir pair at 0 0,然后debug提醒我The following failed: File:D:\TEST fMashandLFS\flash SrcVfs.c Line:2746
Expression failed: file->flags LFS F_OPENED,能指點一下嗎,我用的是內部flash
回復

使用道具 舉報

板凳
ID:690815 發表于 2020-7-9 11:59 | 只看該作者
孫小偉 發表于 2020-3-9 15:00
樓主你好,我使用的也是這種配置,為什么我在調試時,程序運行到lfs_file_open會打印錯誤lfs_error:978: Co ...

這種問題我也沒有遇見過,仿真也出現不了你的情況
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 久久99精品久久久水蜜桃 | 亚洲三级在线观看 | 粉嫩粉嫩芽的虎白女18在线视频 | 国产精品亚洲一区二区三区在线 | 欧美午夜精品 | 在线观看电影av | 成年人视频免费在线观看 | 午夜小视频在线播放 | 视频二区在线观看 | 精品久久视频 | 四虎影院在线播放 | 欧美全黄| 久久久久成人精品亚洲国产 | 亚洲日日夜夜 | 国产视频一区二区三区四区五区 | 国产在线视频网 | 免费成人在线网 | 日韩精品免费视频 | 国产精品久久久久久久久免费高清 | 国产美女精品视频免费观看 | 中文字幕一区二区三区四区五区 | 精品国产一区二区三区久久 | 精品99在线| 一区二区三区高清 | 第四色狠狠 | 国产精品免费观看视频 | 国产成人精品一区二区 | 午夜欧美 | 亚洲一区 中文字幕 | 久久国产精品免费一区二区三区 | 欧美一区二区综合 | 成人高清在线 | 范冰冰一级做a爰片久久毛片 | 精品一区二区三区91 | 国产在线观看av | 在线国产一区 | 欧美精品久久久久 | 国产成人免费视频网站高清观看视频 | 国产毛片久久久久久久久春天 | 国产精品成人在线播放 | 久久久久久久久久久久91 |