0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

I.MXRT FreeRTOS環(huán)境下擦寫外部Flash

li1756686189 ? 來源:嵌入式 MCU ? 2023-01-30 09:18 ? 次閱讀

FreeRTOS環(huán)境下,如果外部擦寫 Flash,禁用指令緩存以避免在多個任務(wù)中使用來自Flash 的分支預(yù)測和應(yīng)用程序同步操作 Flash的緩存預(yù)加載指令。因?yàn)榇a是XIP,所以向量表也在Flash 中。所以,當(dāng)發(fā)生中斷時,內(nèi)核將讀取此中斷向量表。如果同時,F(xiàn)lash閃存被編程寫入,讀取操作將失敗。用戶通過禁用中斷來保護(hù)關(guān)鍵代碼,以避免這種情況。

使用 "taskENTER/EXIT_CRITICAL()" 函數(shù),最后它會調(diào)用如下圖這個函數(shù)vPortRaiseBASEPRI。該函數(shù)只能禁用優(yōu)先級低于configMAX_SYSCALL_INTERRUPT_priority的中斷,這可以確保系統(tǒng)仍然可以工作。因此,需要檢查所有其他外設(shè)中斷的優(yōu)先級,比如LCDIPv2_IRQn,LPUART,LPSPI 等等。要確保優(yōu)先級低于configMAX_SYSCALL_INTERRUPT_priority,或?qū)onfigMAX_SYSCALL_INTERROPT_priority配置為更高的優(yōu)先級。

afeaf3aa-a028-11ed-bfe3-dac502259ad0.png

不需要逐一禁用所有IRQ。因此,如果使用上述方式還有問題,請嘗試如下API

__set_PRIMASK(1);//關(guān)閉總中斷

//擦,寫,讀 Flash//

__set_PRIMASK(0);//開啟總中斷

參考示例代碼:

/* FreeRTOS kernel includes. */

#include "FreeRTOS.h"

#include "task.h"

#include "queue.h"

#include "timers.h"

/* Freescale includes. */

#include "fsl_device_registers.h"

#include "fsl_debug_console.h"

#include "fsl_flexspi.h"

#include "pin_mux.h"

#include "clock_config.h"

#include "board.h"

#include "app.h"

#include "fsl_common.h"

/* Task priorities. */

#define hello_task_PRIORITY (configMAX_PRIORITIES - 2)

#define flash_operation_task_PRIORITY (configMAX_PRIORITIES - 1)

static void hello_task(void *pvParameters);

static void flash_operation_task(void *pvParameters);

status_t flexspi_nor_flash_read_sector(FLEXSPI_Type *base, uint32_t address, const uint32_t *src, size_t leng);

extern status_t flexspi_nor_flash_erase_sector(FLEXSPI_Type *base, uint32_t address);

extern status_t flexspi_nor_flash_page_program(FLEXSPI_Type *base, uint32_t dstAddr, const uint32_t *src);

extern status_t flexspi_nor_get_vendor_id(FLEXSPI_Type *base, uint8_t *vendorId);

extern status_t flexspi_nor_enable_quad_mode(FLEXSPI_Type *base);

extern void flexspi_nor_flash_init(FLEXSPI_Type *base);

extern void flexspi_clear_buffer(FLEXSPI_Type *base);

flexspi_device_config_t deviceconfig = {

.flexspiRootClk = 12000000,

.flashSize = FLASH_SIZE,

.CSIntervalUnit = kFLEXSPI_CsIntervalUnit1SckCycle,

.CSInterval = 2,

.CSHoldTime = 3,

.CSSetupTime = 3,

.dataValidTime = 0,

.columnspace = 0,

.enableWordAddress = 0,

.AWRSeqIndex = 0,

.AWRSeqNumber = 0,

.ARDSeqIndex = NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD,

.ARDSeqNumber = 1,

.AHBWriteWaitUnit = kFLEXSPI_AhbWriteWaitUnit2AhbCycle,

.AHBWriteWaitInterval = 0,

};

constuint32_tcustomLUT[CUSTOM_LUT_LENGTH]={

/* Normal read mode -SDR */

[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x03, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),

[4 * NOR_CMD_LUT_SEQ_IDX_READ_NORMAL + 1] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Fast read mode - SDR */

[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x0B, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),

[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST + 1] = FLEXSPI_LUT_SEQ(

kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_1PAD, 0x08, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Fast read quad mode - SDR */

[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xEB, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_4PAD, 0x18),

[4 * NOR_CMD_LUT_SEQ_IDX_READ_FAST_QUAD + 1] = FLEXSPI_LUT_SEQ(

kFLEXSPI_Command_DUMMY_SDR, kFLEXSPI_4PAD, 0x06, kFLEXSPI_Command_READ_SDR, kFLEXSPI_4PAD, 0x04),

/* Read extend parameters */

[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUS] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x81, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Write Enable */

[4 * NOR_CMD_LUT_SEQ_IDX_WRITEENABLE] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x06, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Erase Sector */

[4 * NOR_CMD_LUT_SEQ_IDX_ERASESECTOR] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xD7, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),

/* Page Program - single mode */

[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x02, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),

[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_SINGLE + 1] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Page Program - quad mode */

[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x32, kFLEXSPI_Command_RADDR_SDR, kFLEXSPI_1PAD, 0x18),

[4 * NOR_CMD_LUT_SEQ_IDX_PAGEPROGRAM_QUAD + 1] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_4PAD, 0x04, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Read ID */

[4 * NOR_CMD_LUT_SEQ_IDX_READID] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x9F, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Enable Quad mode */

[4 * NOR_CMD_LUT_SEQ_IDX_WRITESTATUSREG] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x01, kFLEXSPI_Command_WRITE_SDR, kFLEXSPI_1PAD, 0x04),

/* Enter QPI mode */

[4 * NOR_CMD_LUT_SEQ_IDX_ENTERQPI] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x35, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Exit QPI mode */

[4 * NOR_CMD_LUT_SEQ_IDX_EXITQPI] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_4PAD, 0xF5, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

/* Read status register */

[4 * NOR_CMD_LUT_SEQ_IDX_READSTATUSREG] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0x05, kFLEXSPI_Command_READ_SDR, kFLEXSPI_1PAD, 0x04),

/* Erase whole chip */

[4 * NOR_CMD_LUT_SEQ_IDX_ERASECHIP] =

FLEXSPI_LUT_SEQ(kFLEXSPI_Command_SDR, kFLEXSPI_1PAD, 0xC7, kFLEXSPI_Command_STOP, kFLEXSPI_1PAD, 0),

};

int main(void)

{

/* Init board hardware. */

BOARD_ConfigMPU();

BOARD_InitPins();

BOARD_BootClockRUN();

BOARD_InitDebugConsole();

PRINTF("Flash Operation on FreeRTOS in XIP Mode! ");

if (xTaskCreate(hello_task, "Hello_task", configMINIMAL_STACK_SIZE + 100, NULL, hello_task_PRIORITY, NULL) !=

pdPASS)

{

PRINTF("Task creation failed!. ");

while (1)

;

}

if (xTaskCreate(flash_operation_task, "flash_operation_task", configMINIMAL_STACK_SIZE + 800, NULL,

flash_operation_task_PRIORITY, NULL) != pdPASS)

{

PRINTF("Task creation failed!. ");

while (1)

;

}

vTaskStartScheduler();

for (;;)

;

}

static void hello_task(void *pvParameters)

{

for (;;)

{

PRINTF("Hello world. ");

/* delay 2s */

vTaskDelay(2 * configTICK_RATE_HZ);

}

}

static void flash_operation_task(void *pvParameters)

{

status_t status;

uint8_t vendorID = 0;

/*Programe Buffer must be 4 and 4's multiplier bytes alignment */

uint8_t *nor_program_buffer = pvPortMalloc(256);

if (NULL == nor_program_buffer)

{

PRINTF("nor_program_buffer memory allocation failed! ");

configASSERT(NULL);

}

uint8_t *nor_read_buffer = pvPortMalloc(256);

if (NULL == nor_read_buffer)

{

PRINTF("nor_read_buffer memory allocation failed! ");

configASSERT(NULL);

}

taskENTER_CRITICAL();

flexspi_nor_flash_init(EXAMPLE_FLEXSPI);

taskEXIT_CRITICAL();

/* Get vendor ID. */

status = flexspi_nor_get_vendor_id(EXAMPLE_FLEXSPI, &vendorID);

if (status != kStatus_Success)

{

PRINTF("Get Vendor ID Failure!");

configASSERT(NULL);

}

PRINTF("Flash Vendor ID: 0x%x ", vendorID);

/* Disable I cache to avoid cache pre-fatch instruction with branch prediction from flash and application operate flash synchronously in multi-tasks. */

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

volatile bool ICacheEnableFlag = false;

/* Disable I cache. */

if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))

{

SCB_DisableICache();

ICacheEnableFlag = true;

}

#endif /* __ICACHE_PRESENT */

/* Enter quad mode. */

taskENTER_CRITICAL();

status = flexspi_nor_enable_quad_mode(EXAMPLE_FLEXSPI);

taskEXIT_CRITICAL();

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

if (ICacheEnableFlag)

{

/* Enable I cache. */

SCB_EnableICache();

ICacheEnableFlag = false;

}

#endif /* __ICACHE_PRESENT */

if (status != kStatus_Success)

{

configASSERT(NULL);

}

/* Erase sectors. */

PRINTF("Erasing Serial NOR over FlexSPI... ");

/* Disable I cache to avoid cache pre-fatch instruction with branch prediction from flash and application operae flash synchronously inmulti-tasks.*/

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

/* Disable I cache. */

if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))

{

SCB_DisableICache();

ICacheEnableFlag = true;

}

#endif /* __ICACHE_PRESENT */

taskENTER_CRITICAL();

status = flexspi_nor_flash_erase_sector(EXAMPLE_FLEXSPI, EXAMPLE_SECTOR * SECTOR_SIZE);

taskEXIT_CRITICAL();

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

if (ICacheEnableFlag)

{

/* Enable I cache. */

SCB_EnableICache();

ICacheEnableFlag = false;

}

#endif /* __ICACHE_PRESENT */

if (status != kStatus_Success)

{

PRINTF("Erase sector failure ! ");

configASSERT(NULL);

}

/* Invalidate the D cache before reading data from QSPI Flash */

#if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN

DCACHE_InvalidateByRange(EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE, FLASH_PAGE_SIZE);

#endif

memcpy(nor_read_buffer, (void *)(EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE), FLASH_PAGE_SIZE);

for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++)

{

if (0xFF != nor_read_buffer[i])

{

PRINTF("Erase data - read out data value incorrect ! ");

configASSERT(NULL);

}

}

PRINTF("Sector Erase successfully ! ");

/* Program Sector */

for (uint16_t i = 0U; i < FLASH_PAGE_SIZE; i++)

{

nor_program_buffer[i] = i;

}

/* Clean program buffer to maker sure program data is valid before program execution for SDRAM target, because heap is cacheabe in SDRAM target.*/

#if defined(USE_SDRAM) && USE_SDRAM

#if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN

DCACHE_CleanByRange((uint32_t)nor_program_buffer, FLASH_PAGE_SIZE);

#endif

#endif

/* Disable I cache to avoid cache pre-fatch instruction with branch prediction from flash andapplication operate flash synchronously inmulti-tasks.*/

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

/* Disable I cache. */

if (SCB_CCR_IC_Msk == (SCB_CCR_IC_Msk & SCB->CCR))

{

SCB_DisableICache();

ICacheEnableFlag = true;

}

#endif /* __ICACHE_PRESENT */

taskENTER_CRITICAL();

status = flexspi_nor_flash_page_program(EXAMPLE_FLEXSPI, EXAMPLE_SECTOR * SECTOR_SIZE, (void *)nor_program_buffer);

taskEXIT_CRITICAL();

#if defined(__ICACHE_PRESENT) && (__ICACHE_PRESENT == 1U)

if (ICacheEnableFlag)

{

/* Enable I cache. */

SCB_EnableICache();

ICacheEnableFlag = false;

}

#endif /* __ICACHE_PRESENT */

if (status != kStatus_Success)

{

PRINTF("Page program failure ! ");

configASSERT(NULL);

}

PRINTF("Page program successfully ! ");

/* clean the D cache before reading data from QSPI Flash */

#if defined(CACHE_MAINTAIN) && CACHE_MAINTAIN

DCACHE_InvalidateByRange(EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE, FLASH_PAGE_SIZE);

#endif

/* the below read sector API can be used in both Code in QSPI mode and Code in SRAM mode */

taskENTER_CRITICAL();

memcpy(nor_read_buffer, (void *)(EXAMPLE_FLEXSPI_AMBA_BASE + EXAMPLE_SECTOR * SECTOR_SIZE), FLASH_PAGE_SIZE);

taskEXIT_CRITICAL();

PRINTF("Read Sector Content: ");

for (uint16_t i = 0; i < FLASH_PAGE_SIZE; i++)

{

PRINTF("%d, ", nor_read_buffer[i]);

}

PRINTF(" Flash operation done, suspend this task now. ");

/* Suspend itself */

vTaskSuspend(NULL);

}

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1608

    瀏覽量

    147562
  • 中斷
    +關(guān)注

    關(guān)注

    5

    文章

    893

    瀏覽量

    41319
  • 程序
    +關(guān)注

    關(guān)注

    115

    文章

    3743

    瀏覽量

    80661
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4256

    瀏覽量

    62223
  • FreeRTOS
    +關(guān)注

    關(guān)注

    12

    文章

    483

    瀏覽量

    61849

原文標(biāo)題:I.MXRT FreeRTOS 環(huán)境下擦寫外部 Flash

文章出處:【微信號:嵌入式 MCU,微信公眾號:嵌入式 MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    i.MXRT設(shè)計(jì)更新Segger J-Link Flash下載算法文件

    給大家分享的是為i.MXRT設(shè)計(jì)更新Segger J-Link Flash下載算法文件?! ∠胍?b class='flag-5'>Flash中調(diào)試,基本是離不開Flash下載算法的,畢竟要先將代碼燒寫進(jìn)
    發(fā)表于 12-15 06:11

    i.MXRT系列FlexSPI驅(qū)動Flash頁編程執(zhí)行時間

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRT系列FlexSPI驅(qū)動Flash頁編程執(zhí)行時間?! ∑ψ雍庵皩戇^一篇文章 《串行NOR Flash的頁編程模式對于
    發(fā)表于 12-21 07:30

    i.MXRT上使能NOR Flash的Continuous read模式在軟復(fù)位后無法正常啟動怎么解決?

    i.MXRT上使能NOR Flash的Continuous read模式在軟復(fù)位后無法正常啟動怎么解決?
    發(fā)表于 01-19 07:19

    IAR開發(fā)環(huán)境i.MXRT的串行NOR Flash下載算法設(shè)計(jì)

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是IAR開發(fā)環(huán)境i.MXRT的串行NOR Flash下載算法設(shè)計(jì)?! ≡?b class='flag-5'>i.MX
    發(fā)表于 01-26 07:46

    i.MXRT上使能NOR Flash的Continuous read模式在軟復(fù)位后無法正常啟動問題的解決

    《串行NOR Flash的Continuous read模式軟復(fù)位后i.MXRT無法啟動問題解決方案之RESET#》,利用RESET#引腳復(fù)位功能是痞子衡找到的第一種解決方案,今天痞子衡繼續(xù)給大家介...
    發(fā)表于 01-26 06:52

    FlexSPI復(fù)位方式不當(dāng)會導(dǎo)致i.MXRT系列OTFAD加密啟動失敗怎么解決?

    FlexSPI復(fù)位方式不當(dāng)會導(dǎo)致i.MXRT系列OTFAD加密啟動失敗怎么解決?
    發(fā)表于 02-07 08:11

    使用PTPD/FreeRTOS和WIP-TCP/IP堆棧在i.MXRT上實(shí)現(xiàn)IEEE1588v2是我教程

    使用PTPD、FreeRTOS和WIP-TCP/IP堆棧在i.MXRT上實(shí)現(xiàn)IEEE1588v2
    發(fā)表于 12-12 06:42

    淺析Keil MDK串行Flash的下載算法設(shè)計(jì)

    今天給大家介紹的是 Keil MDK 工具 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)。 在 i.MXRT 硬件那些事系列之《在串行 NOR
    的頭像 發(fā)表于 12-23 13:15 ?1367次閱讀

    J-Link工具i.MXRT的串行NOR Flash下載算法設(shè)計(jì)

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是 J-Link 工具 i.MXRT 的串行 NOR Flash 下載算法設(shè)計(jì)。 一、J-Link 各版本對 i.MXRT
    的頭像 發(fā)表于 12-08 10:07 ?979次閱讀

    Flash不支持SFDP,如何下載適用i.MXRT

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是導(dǎo)致串行 NOR Flashi.MXRT 無法正常下載 / 啟動的常見因素之 SFDP。 i.MXRT 系列 M
    的頭像 發(fā)表于 10-30 10:30 ?624次閱讀

    痞子衡嵌入式:MCUXpresso IDE使用J-Link下載算法在Flash調(diào)試注意事項(xiàng)(i.MXRT500為例)...

      大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是MCUXpresso IDE使用J-Link下載算法在Flash調(diào)試注意事項(xiàng)?! ∑ψ雍馇岸螘r間寫過一篇小文《為i.MXRT
    發(fā)表于 10-29 10:36 ?0次下載
    痞子衡嵌入式:MCUXpresso IDE<b class='flag-5'>下</b>使用J-Link下載算法在<b class='flag-5'>Flash</b>調(diào)試注意事項(xiàng)(<b class='flag-5'>i.MXRT</b>500為例)...

    痞子衡嵌入式:串行NOR Flash的Continuous read模式軟復(fù)位后i.MXRT無法啟動問題解決方案之SW Reset...

    《串行NOR Flash的Continuous read模式軟復(fù)位后i.MXRT無法啟動問題解決方案之RESET#》,利用RESET#引腳復(fù)位功能是痞子衡找到的第一種解決方案,今天痞子衡繼續(xù)給大家介...
    發(fā)表于 12-02 12:51 ?1次下載
    痞子衡嵌入式:串行NOR <b class='flag-5'>Flash</b>的Continuous read模式<b class='flag-5'>下</b>軟復(fù)位后<b class='flag-5'>i.MXRT</b>無法啟動問題解決方案之SW Reset...

    i.MXRT上提升代碼執(zhí)行性能的十八般武藝

    SBL 項(xiàng)目是支持全系列 i.MXRT 平臺的,為了具體化問題,我們就選取 i.MXRT1062 型號為例,官方配套 MIMXRT1060-EVK 板子上搭配了一顆四線串行 NOR Flash(芯成IS25WP064A)用于存放
    的頭像 發(fā)表于 05-23 09:31 ?1316次閱讀

    擦寫Flash時一定不能開啟系統(tǒng)全局中斷嗎?

    大家好,我是痞子衡,是正經(jīng)搞技術(shù)的痞子。今天痞子衡給大家介紹的是i.MXRTFlexSPI driver實(shí)現(xiàn)Flash編程時對于中斷支持問題。
    的頭像 發(fā)表于 02-10 14:27 ?2984次閱讀

    深入i.MXRT1050系列ROM中串行NOR Flash啟動初始化流程

    我們知道外部串行NOR Flash是接到i.MXRT的FlexSPI外設(shè)引腳上,有時串行NOR Flash啟動也叫FlexSPI NOR啟動。
    的頭像 發(fā)表于 06-02 17:43 ?1392次閱讀
    深入<b class='flag-5'>i.MXRT</b>1050系列ROM中串行NOR <b class='flag-5'>Flash</b>啟動初始化流程