OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5244|回复: 6

STM32F407通过FSMC外设访问三星NAND FLASH

[复制链接]

17

主题

142

帖子

0

精华

高级会员

Rank: 4

积分
897
金钱
897
注册时间
2016-2-16
在线时间
162 小时
发表于 2016-9-2 04:32:27 | 显示全部楼层 |阅读模式
2金钱
问题描述:STM32F407通过FSMC外设访问三星NAND FLASH,系统时钟是168MHz,初始化外设GPI0D的PD0、PD1、PD3、PD4、PD6、PD11、PD12、PD14、PD15,还有PE的PE7、PE8、PE9、PE10等时钟及GPIO复用,设置FSMC对应的bank2或bank3,访问NAND FLASH ID 时,函数如下:
void FSMC_NAND_ReadID(NAND_IDTypeDef* NAND_ID)
{
    /* Send Command to the command area */
    *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READID;
        /* Send Address to the address area */
    *(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00;

    /* Sequence to read ID from NAND flash */
    NAND_ID->Maker_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Device_ID  = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Third_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Fourth_ID  = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
    NAND_ID->Fifth_ID   = *(vu8 *)(NAND_FLASH_START_ADDR | DATA_AREA);
}

程序能够正常单步执行 *(vu8 *)(NAND_FLASH_START_ADDR | CMD_AREA) = NAND_CMD_READID;
单步执行*(vu8 *)(NAND_FLASH_START_ADDR | ADDR_AREA) = 0x00时,程序就有问题,不能正常执行,像是跑别的地方去了,停止仿真时,程序指向复位中断。
上述问题,不仅仅是访问NAND FLASH ID出现,执行擦除函数时也是这样,执行第一句函数正常,但是执行第二句就有问题,不知何故,请高手指教,谢谢。

最佳答案

查看完整内容[请看2#楼]

参考一下这个连接呢: http://bbs.21ic.com/icview-248244-1-1.html
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-9-2 04:32:28 | 显示全部楼层
活到老,学到老。
回复

使用道具 举报

4

主题

290

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1130
金钱
1130
注册时间
2015-8-4
在线时间
107 小时
发表于 2016-9-2 09:58:14 | 显示全部楼层
出现这种情况,就是典型的指针跑飞了。也就是你的(NAND_FLASH_START_ADDR | ADDR_AREA)括号里面的值非法。检查一下。
回复

使用道具 举报

17

主题

142

帖子

0

精华

高级会员

Rank: 4

积分
897
金钱
897
注册时间
2016-2-16
在线时间
162 小时
 楼主| 发表于 2016-9-4 09:50:42 | 显示全部楼层
kingnike 发表于 2016-9-2 09:58
出现这种情况,就是典型的指针跑飞了。也就是你的(NAND_FLASH_START_ADDR | ADDR_AREA)括号里面的值非法。 ...

这个程序是从STM32F103例程移植过来的,里面的宏定义没有改动。但是调试的时候,发现一个问题,提示警告:the stack pointer for stack 'CSTACK'(Currently 0x20003c28) is outside the stack range(0x20004A30~0x20004E30)。
在启动文件中设置的STACK大小是0x400,HEAP大小是0x200,对STACK大小进行更改,改大或改小STACK数值,只能改变the stack range的0x20004E30这个大小值,现在当前堆栈指针(Currently 0x20003c28)小于起始堆栈地址,不知道怎么更改,或者哪里有问题?请各位指教下。
回复

使用道具 举报

17

主题

142

帖子

0

精华

高级会员

Rank: 4

积分
897
金钱
897
注册时间
2016-2-16
在线时间
162 小时
 楼主| 发表于 2016-9-4 10:09:17 | 显示全部楼层
在程序中定义了比较大的一个数组,是全局的,是不是这个影响的,该如何更改呢?
回复

使用道具 举报

17

主题

142

帖子

0

精华

高级会员

Rank: 4

积分
897
金钱
897
注册时间
2016-2-16
在线时间
162 小时
 楼主| 发表于 2017-1-2 08:41:03 来自手机 | 显示全部楼层
已解决
回复

使用道具 举报

11

主题

94

帖子

0

精华

初级会员

Rank: 2

积分
188
金钱
188
注册时间
2016-12-12
在线时间
55 小时
发表于 2017-8-26 14:15:52 | 显示全部楼层

楼主你是怎么解决的啊 ,一个已解决结束了这个帖子不太好吧,快来分享一下解决方案吧
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-18 04:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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