查看: 5072|回复: 0

[分享] 基于LPC54XXX从外部flash启动并操作flash功能

[复制链接]
  • TA的每日心情
    开心
    2025-7-10 13:07
  • 签到天数: 43 天

    连续签到: 1 天

    [LV.5]常住居民I

    56

    主题

    548

    帖子

    0

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    1528

    热心会员

    最后登录
    2025-7-23
    发表于 2020-4-15 17:26:14 | 显示全部楼层 |阅读模式
    基于LPC54XXX无内部flash,只有外部flash。
    在使用外部flash启动,需要操作外部flash,需要将操作flash的函数定位到内部sram地址上,才能进行操作。

    从外部flash启动中,操作spifi flash ,spifi不能进行初始化和reset。参考代码如下。

    注意:读写操作都需要将函数定位到SRAM中执行,

    注意W25Q128 flash芯片擦除是以4k大小除除的。

    1. for (i=0 ; i < 1024; i++)
    2. {
    3.         if(i<=256)
    4.         {
    5.         g_buffer1[i] = 0x11;
    6.         }
    7.         if(i>255 && i<512){
    8.         g_buffer1[i] =0x22;
    9.         }
    10.         if(i>=512 && i<768){
    11.         g_buffer1[i] = 0x33;
    12.         }
    13.         if(i>=768 && i<1024){
    14.         g_buffer1[i] = 0x44;
    15.         }

    16. }
    17. //write_flash_sector(0x5000+0x400,(unsigned int*)buffer,1024);
    18. Erase_page(0x1000);

    19. Prog_Page(0x1000,(unsigned int*)buffer, 1024 );                                

    20. w25q_flash_read_byte(0x5000,&rxbuf,1024);

    21. void  Erase_page(unsigned int PageAddr)
    22. {
    23. /* Reset the SPIFI to switch to command mode */
    24.     EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
    25.     /* Wait for the RESET flag cleared by HW */
    26.     while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
    27.     {
    28.     }
    29.     //EnableIRQ(SPIFI0_IRQn);

    30.     /* Write enable */
    31.     SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
    32.     /* Set address */
    33.     //SPIFI_SetCommandAddress(EXAMPLE_SPIFI, PageAddr);
    34.     EXAMPLE_SPIFI->ADDR = PageAddr;   
    35.                 /* Erase sector */
    36.     SPIFI_SetCommand(EXAMPLE_SPIFI, &command[ERASE_SECTOR]);
    37.     /* Check if finished */
    38.     check_if_finish();
    39.    
    40.     /* Reset to memory command mode */
    41.     EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
    42.     /* Wait for the RESET flag cleared by HW */
    43.     while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
    44.     {
    45.     }

    46.     SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);

    47. }
    48. #pragma arm section
    49. #pragma arm section code = "RAMCODE"
    50. void Prog_Page(unsigned int Addr, uint32_t *data, uint32_t len)
    51. {
    52.     uint32_t *pData = data;
    53.     uint32_t page=0;
    54.                 uint32_t i = 0, j = 0,datatmp=0;
    55.                 //PRINTF("Prog_Page");
    56.           while(page<4)
    57.                 {
    58.                                 /* Reset the SPIFI to switch to command mode */
    59.                                 EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
    60.                                 /* Wait for the RESET flag cleared by HW */
    61.                                 while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
    62.                                 {
    63.                                 }

    64.                                 SPIFI_SetCommand(EXAMPLE_SPIFI, &command[WRITE_ENABLE]);
    65.                                 //SPIFI_SetCommandAddress(EXAMPLE_SPIFI, Addr);
    66.                                 EXAMPLE_SPIFI->ADDR = Addr + page*PAGE_SIZE;
    67.                                 SPIFI_SetCommand(EXAMPLE_SPIFI, &command[PROGRAM_PAGE]);
    68.                                 #if 0
    69.                                 for (i = 0; i < PAGE_SIZE/4; i ++)
    70.                                 {
    71.                                         EXAMPLE_SPIFI->DATA = *(pData++);
    72.                                 }
    73.                                 #else
    74.         for (i = 0; i < PAGE_SIZE; i += 4)
    75.         {
    76.             for (j = 0; j < 4; j++)
    77.             {                        
    78.                 datatmp |= ((uint32_t)(pData[i + j + page*PAGE_SIZE])) << (j * 8);
    79.             }
    80.             EXAMPLE_SPIFI->DATA = datatmp;
    81.             datatmp = 0;
    82.         }
    83.                                 #endif
    84.                                 page++;
    85.                                 check_if_finish();
    86.                  
    87.                                 /* Reset to memory command mode */
    88.                                 EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
    89.                                 /* Wait for the RESET flag cleared by HW */
    90.                                 while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
    91.                                 {
    92.                                 }

    93.                                 SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);
    94.         
    95.                 }
    96. }

    复制代码
    读操作:

    1. uint8_t  w25q_flash_read_byte(uint32_t addr,uint8_t *rxbuf,uint32_t num)
    2. {
    3.         //uint32_t data[];
    4.         uint8_t recv_buffer[33];
    5.         uint32_t i=0,result=-1;
    6.         uint8_t *val = (uint8_t *)FSL_FEATURE_SPIFI_START_ADDR;
    7.         memset(recv_buffer,0,sizeof(recv_buffer));
    8.         /* Reset the SPIFI to switch to command mode */
    9.         EXAMPLE_SPIFI->STAT = SPIFI_STAT_RESET_MASK;
    10.         /* Wait for the RESET flag cleared by HW */
    11.         while (EXAMPLE_SPIFI->STAT & SPIFI_STAT_RESET_MASK)
    12.         {
    13.         }
    14.         /* Reset to memory command mode */
    15.         //SPIFI_ResetCommand(EXAMPLE_SPIFI);

    16.         SPIFI_SetMemoryCommand(EXAMPLE_SPIFI, &command[READ]);


    17.         for (i; i <num; i++)
    18.         {
    19.         // val = (uint8_t *)(FSL_FEATURE_SPIFI_START_ADDR + addr);
    20.         //        PRINTF("Data error 111 in address 0x%x, the value in memory is 0x%x\r\n", addr, *val);
    21.         val = (uint8_t *)(FSL_FEATURE_SPIFI_START_ADDR + addr);
    22.         //PRINTF("%d Data address addr 0x%x the value in memory is 0x%x\r\n", i,addr, *val);
    23.         addr++;


    24.         }
    25.         return result;
    26. }

    复制代码



    签到签到
    回复

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-8-21 13:06 , Processed in 0.084454 second(s), 19 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表