OpenEdv-开源电子网

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

STM32F103 mdk堆栈溢出问题求解!

[复制链接]

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
发表于 2016-11-18 09:30:07 | 显示全部楼层 |阅读模式
1金钱
现象:方式一:

main函数调用初始化函数BSP_Init();
BSP_Init();再调用显示屏初始化函数LCD_Initial();
LCD_Initial();中调用FSMC初始化函数FSMC_LCD_Init();       
函数调用嵌套:
main()----BSP_Init()----LCD_Initial()------FSMC_LCD_Init()
按上述方法操作运行不正常;

启动文件配置如下:
Stack_Size      EQU     0x0000400
                AREA    STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem       SPACE   Stack_Size
__initial_sp
Heap_Size       EQU     0x0000200
                AREA    HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem        SPACE   Heap_Size
__heap_limit


方式二:把Stack_Size和Heap_Size都配置为0x0001000也一样不能正常显示。

方式三:
如果把SMC_LCD_Init();        移出-LCD_Initial()函数,放到main()或BSP_Init()则能正常显示,或者把FSMC_LCD_Init()中的局部变量定义成全局变量也能正常显示。



SMC_LCD_Init()函数如下:
void FSMC_LCD_Init_L(void)
{
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  p;
        //GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);

        p.FSMC_AddressSetupTime = 15;
        p.FSMC_AddressHoldTime = 15;
        p.FSMC_DataSetupTime = 255;
        p.FSMC_BusTurnAroundDuration = 0;
        p.FSMC_CLKDivision = 15;
        p.FSMC_DataLatency = 15;
        p.FSMC_AccessMode = FSMC_AccessMode_B;

        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
        //FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_PSRAM;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
        FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
        FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
        //FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_DuringWaitState;  
        FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
        //FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Enable;
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
        FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;          

        FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

        /* Enable FSMC Bank1_SRAM Bank */
        FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  
}



求指点问题出在哪?为什么修改堆栈大小也没用,是没改对地方吗?

最佳答案

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

可能你的结构体有末初始化的成员变量,放在局部变量中,默认值是未知的。 而放在全局变量中,默认会清0一次。 可以使用 FSMC_NORSRAMStructInit 或memset把局部变量手动初始化一下,然后再配置参数。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

1044

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3708
金钱
3708
注册时间
2011-5-23
在线时间
2010 小时
发表于 2016-11-18 09:30:08 | 显示全部楼层
把FSMC_LCD_Init()中的局部变量定义成全局变量也能正常显示。

可能你的结构体有末初始化的成员变量,放在局部变量中,默认值是未知的。
而放在全局变量中,默认会清0一次。

可以使用 FSMC_NORSRAMStructInit 或memset把局部变量手动初始化一下,然后再配置参数。
RT-Thread RTOS 音频,WIFI,蓝牙
回复

使用道具 举报

22

主题

751

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1605
金钱
1605
注册时间
2015-6-10
在线时间
222 小时
发表于 2016-11-18 09:38:27 | 显示全部楼层
不知道什么地方错了   感觉不像堆栈
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
 楼主| 发表于 2016-11-18 09:40:37 | 显示全部楼层
这感觉就是堆栈溢出了,嵌套多了,局部变量多了就出问题,但是加大堆栈有没用,所有搞不懂了,除非我堆栈没改对地方。
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
 楼主| 发表于 2016-11-18 09:43:28 | 显示全部楼层
在线求解,有各种想法的欢迎提出来,可以立马验证。
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
 楼主| 发表于 2016-11-18 10:13:42 | 显示全部楼层
如果是这样,为什么我把嵌套层次减少点就没问题了呢?
回复

使用道具 举报

3

主题

21

帖子

0

精华

新手上路

积分
38
金钱
38
注册时间
2016-11-18
在线时间
6 小时
 楼主| 发表于 2016-11-18 10:54:01 | 显示全部楼层
aozima 发表于 2016-11-18 09:30
可能你的结构体有末初始化的成员变量,放在局部变量中,默认值是未知的。
而放在全局变量中,默认会清0 ...

验证了下,参数FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait没配置,按正常值配置后能正常显示,配置成0xffffffff时不能正常显示,也就是说不配置的话,如果变量分配的区域初始值不在正常范围则无法正常显示,如果在正常范围就能正常显示,这也就解释了为什么函数调用的位置不同效果不同了。
非常感谢!!
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-3-1 13:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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