文章目录
- 1.简介
- 2.频率设置
- 3.FSMC参数设置
- 4.修改宏定义 NAND_DEVICE
- 5.程序测试
- 5.1.简单测试
- 5.2.擦除、写入、读取测试
- 注意
1.简介
目前我在使用stm32f407ZGT6来读写三星的nand flash【K9F1G08U0E】。
板子我是在这里买的
【STM32F407ZGT6最小系统板/核心板/转接板/开发板/加128M FLASH】
他上面可以选装一个K9F1G08U0E。
针对这个nand flash,可以选择采用stm32的FSMC来进行读写。
stm32的程序我是stm32cubeide来编写的,感觉挺方便的。
2.频率设置
配置好工程之后,需要把晶振设置好,并且把cpu频率设置为168Mhz。
3.FSMC参数设置
然后设置nand flash的配置,注意参数最好要设置和下面一模一样,别的参数也许可以,但是我还没测试过。
此次不使用RB中断、不进行ECC检验等等。其实最好是使用,但是我一使用就出问题,所以暂时还是算了。
在配置完之后,还要切换到代码模式,检查一下代码端的参数是否和下面的截图一致:
可以看到,和ui的参数差了1,不知道是为啥。但是代码的参数是我们想要的。
4.修改宏定义 NAND_DEVICE
然后就是最重要的一点,需要到stm32f4xx_hal_nand.h这个头文件中,修改一下这个 NAND_DEVICE 的定义。
因为我们现在选的是bank2,而bank2是从0x70000000UL开始的,而不是0x80000000UL。
不知道stm32cubeide的这个库怎么处理的,在使用FSMC来读写nand flash时,无论你选的是bank2还是bank3,默认他都是用的0x80000000UL。不知道是什么狗屁逻辑(可能我语气重了点,但是假如你和我一样被这个问题折磨了四五天的话,应该就能体会我的心情)。
而且更加恶心的是,每次在IOC界面修改一些数据后,系统重新生成代码,他又会把这个stm32f4xx_hal_nand.h改回原来的0x80000000UL,也就意味着,你需要再改一次。。。。
- #define NAND_DEVICE 0x80000000UL
+ #define NAND_DEVICE 0x70000000UL
5.程序测试
5.1.简单测试
然后就可以写段程序测试一下了:
只要读取出来的NAND_ID是【0xec 0xf1 0x00 0x95】,基本证明成功了。
【K9F1G08U0E手册】
这个是我debug的结果,可以看到,是一致的。
5.2.擦除、写入、读取测试
HAL_StatusTypeDef ret = HAL_OK;
NAND_IDTypeDef info;
ret = HAL_NAND_Read_ID(&hnand1, &info);
int nand_status = HAL_NAND_Read_Status(&hnand1);
NAND_AddressTypeDef addr = {0, 0, 0};
ret = HAL_NAND_Erase_Block(&hnand1, &addr);
uint8_t buffer_write[2 * 1024];
for(int i = 0; i < 2048; i++)
{
buffer_write[i] = i;
}
ret = HAL_NAND_Write_Page(&hnand1, &addr, buffer_write, 1);
nand_status = HAL_NAND_Read_Status(&hnand1);
uint8_t buffer[2 * 1024] = {0};
ret = HAL_NAND_Read_Page(&hnand1, &addr, buffer, 1);
注意
a.有时候程序没问题,但是就是用st-link来debug时,总是会崩溃出,不知道为啥。难道是因为我的st-link是山寨的?
参考:
【STM32F407 FSMC驱动MT29F4G08A NAND FLASH源代码分享】