STMCU小助手
发布时间:2022-2-21 19:43
|
问题: 该问题由某客户提出,发生在 STM32F407IGT6 器件上。据其工程师讲述:为了满足软件对大容量内存的需求,将软件中的部变量从内部 SRAM 转移到片外的 SRAM 当中。而这一改变,导致该软件不能运行,每次复位后,随即便发生死机。在此之前,对 FSMC 的初化代码,以及片外 SRAM 的读写匀做过测试,并确认是没有问题的。其内存分配如表(一)所示,FSMC 的初始化代码如表(二)所示。6 U8 l3 ^8 S: Y* D) ^1 v" L $ A" c$ j; t* t O
( D( j' f& O+ j+ M! U0 W0 R0 x9 V
, o, F5 B* ?) ], h
调研: 使用 Keil MDK 创建工程,测试其所用的 FSMC 初始化代码,结果表明该段代码正确无误。修改内存分配,删除其中对外部 SRAM 的分配,如表(三)所示。重新对其软件编译,运行,结果表明,在这种内存分配方式下,其软件可以正常运行。修改其软件代码,在初始化 FSMC 之后加入对外部 SRAM的读写测试,重新编译运行。测试结果表明,此时对外部 SRAM 的读写是正确的。查找其软件对 FSMC初始化函数调用的位置,发现该函数是在该软件的 main()函数中调用的。修改代码,将该函数的调用位置移至 SystemInit()中,并且恢复原来的内存分配,如表(一)。重新编译并运行,此时该软件可以正确的运行。! G5 |. U' ^- F s$ { S; C U" o9 ^
7 N: ~: a* N9 h6 q5 L 结论:, ~0 {& G4 R u& g; O2 \1 w 软件中对 FSMC 做初始化的位不对,导致程序在访问外部 SRAM 时 FSMC 还未被初始化,从而造成总线访问出错,从而产生 Hard Fault 中断,最终程序流程停留在 Hard Fault 中断服务程序中,使得程序对外表出“死机”的现象。 处理: 修改软件,将对 FMSC 初始化函数的调用位置放在 SystemInit()函数中,以保证在 C 语言初始化之前完成对 FMSC 的初始化。3 P5 q2 y; V+ e$ t; m 建议: 一般来说 main()函数是 C 语言的入口函数,C 语言代码从这里开始执行。然而,整个应用程序的执行起点却不是这里。通常在 main()函数执行之前,要有一段初始化代码,为 C 语言代码的执行创建一个运行环境。比如要对 C 语言代码所使用的内存清零,还要对 C 语所定义的全局变量、静态变量付初值等等。这段初始化代码是由 C 语言开发工具中的链接器(Linker)加到应用程序当中的。它在做C 语言运行环境初始化的时候,会访问相关的存贮器。如果此时,对应的存贮器不可用,就会出现错误。所以,对 FSMC 的初始化一定要在 C 语言运行环境初始化之前完成。在 ST 的标准外设库中给出的工程模板中,有一个能在 C 语言初始化之前得以执行的函数,就是 SystemInit()函数。于是,可以把有以上要求的初始化函数,在该函数中调用。因为 SystemInit()函数是在 C 语言初始化之前执行,所以,如果该函数,或者被该函数调用的函数中使用了全局变量或者静态变量,只能自行付初值,否则这些变量的初值是随机的。 ! x6 d2 Y# {# V& V |
【经验分享】STM32语音识别的智能蓝牙音箱(源程序+原理图+PCB+设计说明书+PPT)
想找个ST芯片
[GPIO] 使用新型抽象开始C++嵌入式编程,从GPIO开始
技术手册stm32f1xx中的一个小问题
【经验分享】STM32 HAL库移植FreeModbus详细步骤
【逢7发帖赢大礼】STM32开发之IC门禁卡UID读取方法!
实战经验 | Keil工程使用NEAI库的异常问题
经验分享 | FDCAN数据段波特率增加后发送失败的问题分析
STM32几种流行开发环境的优缺点
好用软件推荐-TouchGFX Designer
微信公众号
手机版