单片机学习小组
直播中

李丽

7年用户 1431经验值
私信 关注

FMC_Erase擦除错误的原因?怎么解决?

请问大家,为什么FMC_Erase返回总是-1,主函数中PE0,PE1,PE2是我的三个按键,我主要是想实验对flash的擦写,将数据存到flash中,实现掉电数据不丢失,但现在一个插除页都是失败的,还请大家解惑。

#include
#include "Nano100Series.h"
#define DATA_FLASH_TEST_BASE 0x12400;
int32_t u32Addr = DATA_FLASH_TEST_BASE;
uint32_t u32Pattern = 0xA5A5A5A5;
uint32_t u32data;

void dataflash_test()
{
                                
                                SYS_UnlockReg();               
                                FMC_Open();               
                                FMC_Erase(u32Addr);        
                                if(FMC_Erase(u32Addr)==-1)
                                {
                                        printf("erase--error\r\n");
                                }               
                                FMC_Write(u32Addr, u32Pattern);
                                u32data = FMC_Read(u32Addr);
                                 if (u32data != u32Pattern)
                                {                                                                                                                                                                                       
                                        printf("data different");
                                }
                                 printf("one--u32pattern--%x\r\n",u32Pattern);
                                 printf("one--dihzi--%x\r\n",&u32Addr);                                 
                                 printf("one--u32data--%x\r\n",u32data);
                                 printf("one--dizhi--%x\r\n",&u32data);
                        
                                FMC_Write(u32Addr+4, u32Pattern);
                                
                                u32data = FMC_Read(u32Addr+4);
                                 if (u32data != u32Pattern)
                                {
                                        printf("data error-----u32addr+4\r\n");
                                }
                                        printf("        two----%x----u32pattern\r\n",u32Pattern);
                                        printf("        two----%x----dizhi\r\n",&u32Addr);
                                        printf("two----%x----u32data\r\n",u32data);               
                                        printf("two----%x----dizhi\r\n",&u32data);                                                                                 
                                 SYS_LockReg();
}

void dataflash_test_read()
{                        
                                u32data = FMC_Read(u32Addr);
                                printf("one--u32data--%x\r\n",&u32Addr);
                                printf("one--u32data--%x\r\n",&u32data);
}
void SYS_Init(void)
{
    SYS_UnlockReg();
    CLK_EnableXtalRC(CLK_PWRCTL_HIRC_EN_Msk);
    CLK_WaitClockReady( CLK_CLKSTATUS_HIRC_STB_Msk);
    CLK_SetHCLK(CLK_CLKSEL0_HCLK_S_HIRC,CLK_HCLK_CLK_DIVIDER(1));
    CLK_EnableModuleClock(UART0_MODULE);
    CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART_S_HIRC, CLK_UART_CLK_DIVIDER(1));
    SystemCoreClockUpdate();
    SYS->PA_H_MFP &= ~(SYS_PA_H_MFP_PA14_MFP_Msk|SYS_PA_H_MFP_PA15_MFP_Msk);
    SYS->PA_H_MFP |=  (SYS_PA_H_MFP_PA14_MFP_UART0_RX|SYS_PA_H_MFP_PA15_MFP_UART0_TX);
    SYS_LockReg();
}


int main(void)
{
    SYS_Init();
    UART_Open(UART0, 115200);
    while(1)
                {
                        if(PE1==0)
                        {
                                CLK_SystickDelay(100);
                                if(PE1==0)
                                {
                                        ;
                                }
                                while(PE1==0);
                                dataflash_test();
                        }               
                        if(PE0==0)
                        {
                                CLK_SysTickDelay(100);
                                if(PE0==0)
                                {
                                        ;
                                }
                                while(PE0==0);
                                dataflash_test_read();
                        }                        
                        if(PE2==0)
                        {
                                CLK_SysTickDelay(100);
                                if(PE2==0)
                                {
                                ;        
                                }
                                while(PE2==0);
                                NVIC_SystemReset();
                        }                        
                }
}



回帖(1)

从未拥有

2024-1-5 16:16:57
在代码中,我们看到擦除函数是使用的FMC_Erase函数。如果返回值是-1,通常表示擦除错误。

可能出现擦除错误的原因很多,包括:

1. 多次擦除同一块Flash区域,可能导致坏块出现,使得以后不能再使用这个块。

2. 在擦除Flash之前,必须要先将这个Flash区域解除保护。如果这个区域是受保护的话,擦除就会失败。

3. 此外还有可能是硬件故障造成的问题,例如Flash芯片损坏等。

解决这个问题的方法是:

1. 检查代码是否正确,是否正确解除了Flash保护。

2. 尝试重新擦除Flash区域,如果还是失败了,可以将这个块标记为坏块,不再使用。

3. 如果仍然不能解决问题,检查硬件,例如是否有Flash芯片损坏的情况。

关于代码,我们可以参考以下修改:

1. 将FMC_Erase的返回值设为变量,方便进行调试。

2. 在PE0,PE1,PE2的按键中添加调用擦除函数的代码。

代码改动如下:

#include
#include "Nano100Series.h"

#define DATA_FLASH_TEST_BASE 0x12400

int32_t u32Addr = DATA_FLASH_TEST_BASE;
uint32_t u32Pattern = 0xA5A5A5A5;

// 添加返回值,方便调试
int32_t erase_status;

void dataflash_test() {
    uint32_t u32data;
    FMC_EnableAPUpdate();
    FMC_Erase(u32Addr);
    // 将擦除状态赋值到变量中
    erase_status = FMC_Erase(u32Addr);
    if(erase_status != 0) {
        printf("Erase Failed! status=0x%xn", erase_status);
        return;
    }
    FMC_Write(u32Addr, u32Pattern);
    printf("Write [0x%08x]=0x%08xn", u32Addr, u32Pattern);
    u32data = FMC_Read(u32Addr);
    printf("Read [0x%08x]=0x%08xn", u32Addr, u32data);
}

int main() {
    SYS_UnlockReg();
    CLK_EnableModuleClock(FMC_MODULE);
    SYS_LockReg();

    // 初始化PE0,PE1,PE2按键
    GPIO_SetMode(PB, BIT14, GPIO_MODE_INPUT);
    GPIO_SetMode(PB, BIT15, GPIO_MODE_INPUT);
    GPIO_SetMode(PB, BIT2, GPIO_MODE_INPUT);

    while(1) {
        // 每次按下按键,执行一次擦除
        if(GPIO_GET_INPUT(PB, BIT14) == 0) {
            printf("Erasing...n");
            dataflash_test();
        }
        CLK_SysTickDelay(1000);
    }

    return 0;
}
举报

更多回帖

发帖
×
20
完善资料,
赚取积分