打印
[STM32F1]

时序问题如何解决?怎么能更深刻理解时序?

[复制链接]
1474|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yhnu1214|  楼主 | 2014-5-16 18:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
板子上使用的是STM32F103ZET芯片,刚开始用FSMC的方式操作总线,单步的时候是正常的,但是全速运行时候不是按照程序中编写的程序来运行的。换用IO方式遇到同样的问题。

目前能确定是时序的问题,但是不知道怎么修改时序,FSMC方式中使用模式A,8位数据宽度,对时序的修改,具体是修改地址建立时间和数据建立时间吗?根据什么来设置呢?

用IO方式怎么修改时序呢?

程序想实现的功能是,能向下位机有序的发送数据,比如先发送0x11,后发送0x22,仿真的时候,可以看到是先发送0xaa,0xbb,0xcc,但是全速运行时就各种组合了.


主函数很简单,设置完RCC、GPIO、FSMC等等以后,在while中循环的发送有序数据。

FSMC设置
void TXB_EPM570_Init(void)
{
        FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
        FSMC_NORSRAMTimingInitTypeDef  p;
        GPIO_InitTypeDef GPIO_InitStructure;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_GPIOG | RCC_APB2Periph_GPIOE |
                             RCC_APB2Periph_GPIOF, ENABLE);
       
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
       
        /*-- GPIO Configuration ------------------------------------------------------*/
        /*!< SRAM Data lines configuration */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
                                                                GPIO_Pin_10|GPIO_Pin_11 | GPIO_Pin_12| GPIO_Pin_13|
                                    GPIO_Pin_14|GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 |
                                    GPIO_Pin_11 | GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 |
                                    GPIO_Pin_15;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        /*!< SRAM Address lines configuration */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                                    GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_12 | GPIO_Pin_13 |
                                    GPIO_Pin_14 | GPIO_Pin_15;
        GPIO_Init(GPIOF, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3 |
                                    GPIO_Pin_4 | GPIO_Pin_5;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_4| GPIO_Pin_5 | GPIO_Pin_6;
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 |GPIO_Pin_14;
        GPIO_Init(GPIOG, &GPIO_InitStructure);
       
        /*!< NOE and NWE configuration */  
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 |GPIO_Pin_5;
        GPIO_Init(GPIOD, &GPIO_InitStructure);
       
        /*!< NE1 configuration */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
        GPIO_Init(GPIOD, &GPIO_InitStructure);        
       
        /*-- FSMC Configuration ------------------------------------------------------*/
        p.FSMC_AddressSetupTime = 1;
        p.FSMC_AddressHoldTime = 0;
        p.FSMC_DataSetupTime = 7;       
        p.FSMC_BusTurnAroundDuration =0;
        p.FSMC_CLKDivision = 0;
        p.FSMC_DataLatency = 0;
        p.FSMC_AccessMode = FSMC_AccessMode_A;
        FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
        FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
        FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
        FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;
        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_WriteOperation = FSMC_WriteOperation_Enable;
        FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
        FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
        FSMC_NORSRAMInitStructure.FSMC_AsyncWait = FSMC_AsyncWait_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);
}
沙发
aozima| | 2014-5-16 20:23 | 只看该作者
STM32的FSMC扩展SRAM的时序测量及配置: https://bbs.21ic.com/icview-331466-1-1.html

这个贴子也许对你有帮助。

使用特权

评论回复
板凳
mmuuss586| | 2014-5-16 20:37 | 只看该作者
1、主要设置,地址,数据建立时间等,你拿示波器看下,时序上的演延时还是很准的;
2、IO模拟
比如:
    先片选选中芯片,再延时;
    读或写8位总线宽度信号,再延时;
    读或写信号拉低,再延时,读或写信号拉高,再延时;
    片选不选中;
不同的外围芯片,时序会不一样;

用FSMC总线,比IO模拟要快不少;


   

使用特权

评论回复
地板
yhnu1214|  楼主 | 2014-5-21 11:18 | 只看该作者
恩,谢谢了
IO方式的已经解决了,FSMC还在尝试当中。

请问下FSMC中NOR Flash和SRAM有什么区别?

使用特权

评论回复
5
yhnu1214|  楼主 | 2014-5-21 11:20 | 只看该作者
aozima 发表于 2014-5-16 20:23
STM32的FSMC扩展SRAM的时序测量及配置: https://bbs.21ic.com/icview-331466-1-1.html

这个贴子也许对你有 ...

感觉这个帖子写得~~~,简单点说我没看懂

使用特权

评论回复
6
想做大牛的小马| | 2014-5-21 11:22 | 只看该作者
yhnu1214 发表于 2014-5-21 11:18
恩,谢谢了
IO方式的已经解决了,FSMC还在尝试当中。

nor-flash和sram本就是完全不同的两种外设!FSMC中分别有相应的控制器,只要你的硬件连接正确,对fsmc的相关配置正确,便可以通过相应的bank访问了,访问地址为:bank是基地址+offset
偏移大小由地址线确定~

使用特权

评论回复
7
yhnu1214|  楼主 | 2014-7-8 15:42 | 只看该作者
想做大牛的小马 发表于 2014-5-21 11:22
nor-flash和sram本就是完全不同的两种外设!FSMC中分别有相应的控制器,只要你的硬件连接正确,对fsmc的 ...

恩,谢谢,不是我软件配置的问题,是硬件的问题。

还是谢谢你的回答。

使用特权

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

本版积分规则

1

主题

5

帖子

0

粉丝