完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
请问大家,为什么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个回答
|
|
在代码中,我们看到擦除函数是使用的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; } |
|
|
|
只有小组成员才能发言,加入小组>>
3126 浏览 9 评论
2823 浏览 16 评论
3337 浏览 1 评论
8706 浏览 16 评论
3927 浏览 18 评论
9544浏览 3评论
877浏览 3评论
447浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
451浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2174浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-16 21:22 , Processed in 1.035653 second(s), Total 80, Slave 61 queries .
Powered by 电子发烧友网
© 2015 www.ws-dc.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号