6540|3

2146

帖子

8

TA的资源

五彩晶圆(初级)

楼主
 

由于FSMC配置不当引起的奇怪的问题 [复制链接]

本帖最后由 wsmysyn 于 2018-6-19 23:16 编辑

RT
背景:
最近在搞一个测试项目用到了stm32的FSMC和FPGA通信
对FPGA的读写控制通过定义两个STM32存储器地址的读写来控制
并由串口输出系统信息。

现象:
调试的时候发现了个奇怪的问题,就是板子一直上电调试的时候,下载程序到flash,都没有问题。
只要是板子掉电,再上电,就运行不正常,串口没有输出。感觉好像是丢了固件一样。

尝试:
一、写了一个简单的点灯程序,其他全都去掉。发现上下电功能是正常的。所以应该不是掉固件问题,感觉是程序死在哪里了或着触发了硬件fault
但是在上电中,再次下载程序复位之后,或者单步调试是看不出来问题的。因为正常的。

二、怀疑可能是boot设置不对,其实并没有下载到flash,根据手册检查了boot0给0 和boot1任意是没问题的,所以应该是下载到flash的

三、感觉可能是刚上电有外设初始化不正常,那么初始化两次,初始化前增加巨长的延时,都没解决,应该不是这个问题

四、后来只好用printf函数(我只是假设串口部分应该能工作),在每个模块的前后输出调试信息,确定是哪个模块出了问题
确定哪个模块之后,在进入到该模块,看看是哪个子模块有问题,这样一步步定位到出错的位置

经过以上步骤发现是固定卡死在FSMC的模块里的FSMC写操作,并且是第一次调用write函数的时候


会一直卡在对DATA口赋值的语句。。
FPGA_DATA是定义的是对一个存储地址的访问,到这步感觉可能FSMC这时候可能是出错了,或者FSMC卡死了,导致一直出不来

五、去找FSMC的初始化,修改时序和模式也没什么效果。在后来仔细检查FSMC的初始化结构成员,数了一下,结构里一共有15个成员,我初始化了12个,有两个是二选一的,这样我还缺了两个成员没有初始化。根据时序要求将另外两个参数初始化了一下,

神奇的事情发生了,,居然OK了,不会卡死了

后来再验证了一下,两个参数缺一不可。

总结:
1、出问题原因可能是未初始化的两个参数的默认值是不确定的,重新上电可能导致FSMC配置有问题,进入到了错误的模式,所以“卡死”了

2、一定要对结构中的数据都进行初始化,你认为的默认值可能不只是你认为的那样。。
3、不能随便拷贝别人的代码,一定要理解。。。

补充测试:
在FSMC配置函数中将burst和Async的两个设置打印出来,前面注释掉,不设置
  1. printf("bust : -> %08X\r\n", FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode);
  2. printf("async : -> %08X\r\n", FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait);
复制代码


不下电直接复位,串口打印:
burst : -> 00000000
async : -> 00000000

下电再上电,串口打印:
burst : -> F7DFFFFD
async : -> F7DFFFFD

或者
burst : -> F7FFFFFD
async : -> F7FFFFFD


由此可见,确实是因为重新上电后,未初始化的变量是一个异常值,FSMC寄存器配置是各个参数或运算,
所以,FSMC重新上电后被配置为异常模式,所以导致FSMC“卡死”。

综上问题就算最终解决了。

算是个教训了。。。
  1. FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1; //Refered to FSMC_NE1
  2. FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
  3. FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
  4. FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
  5. FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;

  6. FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
  7. FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Enable;

  8. FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
  9. FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
  10. FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
  11. FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
  12. FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;

  13. FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;

  14. FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
  15. FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;

  16. FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

  17. FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);

  18. printf("bust : -> %08X\r\n", FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode);
  19. printf("async : -> %08X\r\n", FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait);
复制代码











此帖出自stm32/stm8论坛

最新回复

ok,谢谢!我也遇到同样问题,你的方法可行!另外,mx我也用过,但是库函数也很好,我两种方法都喜欢,现在用库。  详情 回复 发表于 2022-10-11 16:55

赞赏

1

查看全部赞赏

点赞 关注(1)
个人签名坐而言不如起而行
 

回复
举报

3414

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
cubeMX冷笑了一下
此帖出自stm32/stm8论坛

点评

一直没有使用过,都是用keil的库函数。。。。。。  详情 回复 发表于 2018-6-19 22:48
 
个人签名

So TM what......?

 


回复

2146

帖子

8

TA的资源

五彩晶圆(初级)

板凳
 
ljj3166 发表于 2018-6-19 22:40
cubeMX冷笑了一下

一直没有使用过,都是用keil的库函数。。。。。。

此帖出自stm32/stm8论坛
 
个人签名坐而言不如起而行
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 

ok,谢谢!我也遇到同样问题,你的方法可行!
另外,mx我也用过,但是库函数也很好,我两种方法都喜欢,现在用库。

此帖出自stm32/stm8论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表