打印

STM32奇怪问题求解

[复制链接]
3233|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
leid333|  楼主 | 2011-8-7 09:31 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在调试STM32的板子,自己DIY的,发现一个问题:
在不掉电的情况下,板子工作正常,显示(用FSMC控制)、串口、RTC等都正常。但是一旦板子电源掉电(拔掉电源),在通电程序就会死在FSMC的初始化那里,串口有输出, RTC、Systick等都不工作。
有没有遇到这个现象??望有经验的,指点一下,谢谢!!
沙发
香水城| | 2011-8-8 08:43 | 只看该作者
不明白你是怎么做的,“在不掉电的情况下,板子工作正常”,这种情况是怎么通电工作的?

使用特权

评论回复
板凳
leid333|  楼主 | 2011-8-9 18:57 | 只看该作者
首先,谢谢版主的回答。
在解释一下,如果用了FSMC控制LCD,将程序下载后,复位CPU,程序能正常启动运行,串口、RTC等都正常。但是,一旦板子断电重新上电,程序运行一段,就死机了,需要重新下载程序(这个程序不做任何修改)后,又能正常工作,一断电就不行了。
FSMC设置如下:
           p.FSMC_AddressSetupTime = 0;
          p.FSMC_AddressHoldTime = 0;
          p.FSMC_DataSetupTime = 2;
          p.FSMC_BusTurnAroundDuration = 0;
          p.FSMC_CLKDivision = 0;
          p.FSMC_DataLatency = 0;
          p.FSMC_AccessMode = FSMC_AccessMode_B;

          FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;
          FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
          FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
          FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
          FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
//  FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_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_WriteOperation = FSMC_WriteOperation_Enable;
          FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
          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);  
          // BANK 4 (of NOR/SRAM Bank) is enabled
          FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

程序会死在这个位置:
void LCD_WriteReg(uint8_t LCD_Reg, uint16_t LCD_RegValue)
{            
#if(LCD_Control_FSMC)
        printf("\n\rSystem Test Proint 003  ");
        LCD->LCD_REG = LCD_Reg;//写入要写的寄存器序号
//        LCD_Command = LCD_Reg;
        printf("\n\rSystem Test Proint 004  ");         
        LCD->LCD_RAM = LCD_RegValue;//写入数据
//        LCD_Data = LCD_RegValue;
        printf("\n\rSystem Test Proint 005  ");
#else
        Lcd_Write_Com_Data(LCD_Reg,LCD_RegValue);
#endif
}
如上:开始初始化LCD时,这行第一句写LCD寄存器时调用的函数,printf("\n\rSystem Test Proint 004  ");可以通过串口打印。  而printf("\n\rSystem Test Proint 005  ");就没有执行,就死机了。
如果用GPIO的方式直接控制LCD,则不会出现掉电不能正常启动的问题。
望 版主帮看看,我这是怎么回事??  谢谢!!

使用特权

评论回复
地板
香水城| | 2011-8-10 10:59 | 只看该作者
你把驱动LCD的时序放宽一些看看,怀疑是时序不匹配。

使用特权

评论回复
5
pkat| | 2011-8-10 13:32 | 只看该作者
很可能是时序不匹配,楼主按照香主的方法试试

使用特权

评论回复
6
leid333|  楼主 | 2011-8-14 01:11 | 只看该作者
还要再次请教香主:
     我遇到的这个问题依旧,每次上电都要重新下载一次程序后才能正常启动。重新上电后,不能启动,复位都不行。FSMC时序这里我试了很多的值,如:
        p.FSMC_AddressSetupTime = 20;//10//5
   p.FSMC_AddressHoldTime = 50;//10//2
   p.FSMC_DataSetupTime = 50;//20//5
   p.FSMC_BusTurnAroundDuration = 0;
   p.FSMC_CLKDivision = 2;//0
   p.FSMC_DataLatency = 0;
   p.FSMC_AccessMode = FSMC_AccessMode_A;
等等,这个问题困扰了我很久,我用的LCD控制器是SSD1289,望香主帮忙看看是什么问题。
   如果用IO口区驱动LCD是正常的。只要用FSMC控制LCD上电后就不能正常启动,程序就死在之前说的位置上,需要重新下载程序。

使用特权

评论回复
7
leid333|  楼主 | 2011-8-14 01:20 | 只看该作者
再次补充:只要程序用到FSMC上电后就不正常了,程序就死在对FSMC的操作上,如:我禁止FSMC对LCD的操作,只留下FSMC对SRAM的读写,也是不行的,程序也是会死在对SRAM的操作上。要重新下载程序后,则能够正常读写SRAM。
望高手帮帮这解答这个问题,谢谢!:handshake

使用特权

评论回复
8
香水城| | 2011-8-15 09:40 | 只看该作者
请问重新下载程序后是否断过电?程序通过什么手段下载的?

使用特权

评论回复
9
leid333|  楼主 | 2011-8-15 21:40 | 只看该作者
8# 香水城

程序下载是通过JlinkV8或者STM自带的ISP串口下载都是一样的。
程序下载后不断电,程序运行正常,一旦断电,就不能正常启动(硬件复位也不行)。个人感觉是FSMC初始化应该有问题,但是找不到问题出在哪里。

使用特权

评论回复
10
香水城| | 2011-8-16 10:04 | 只看该作者
还是要归结为时序问题!!

检查一下所有外围器件:有些外围器件从上电至就绪的时间比较长,如果你的程序在MCU一开始上电就对这样的器件发初始化命令,很可能这个外围器件还没有准备好,导致初始化失败;如果你的初始化比较粗糙,没有检查外围器件是否就绪、是否初始化成功,就很可能出现你看到的情况。

你执行程序下载的操作,对于外围器件来说,实际上是先上电等待,MCU程序下载完成后在运行时,外围器件已经就绪,当然就可以正确运行了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

0

粉丝