打印
[STM32H7]

H743 FMC_NE1/2初始化的问题

[复制链接]
1184|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
阿尔法99|  楼主 | 2020-7-11 13:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
fm, RAM, SRAM, TI, AN
H743 FMC_NE1/2初始化程序如下。
问题:操作一次读操作后,片选 FMC_NE1、FMC_NE2均不能正常输出电平。
因为参考手册里这块的描述看得不太明白, 这个程序是生搬硬套的。

void FMCinit(void)
{
                FMC_NORSRAM_TimingTypeDef FSMC_ReadWriteTim;
    FMC_NORSRAM_TimingTypeDef FSMC_WriteTim;
                SRAM_HandleTypeDef SRAM_Handler;    //SRAM句柄(用于控制LCD)
       
                RCC->AHB3ENR|=1<<12;             //使能FMC时钟
                FMCIOinit();

    SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;      
    SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;      
   
    SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK1;     //使用NE1
    SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //不复用数据线
    SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;   //SRAM
    SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度
    SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到
    SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
    SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;   //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
    SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //存储器写使能
    SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;           //等待使能位,此处未用到
    SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //读写使用不同的时序
    SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
    SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //禁止突发写
    SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
   
    //FMC读时序控制寄存器
    FSMC_ReadWriteTim.AddressSetupTime=0x11;    //地址建立时间(ADDSET)为17个HCLK 1/200M=5ns*17=85ns
    FSMC_ReadWriteTim.AddressHoldTime=0x00;
    FSMC_ReadWriteTim.DataSetupTime=0x55;       //数据保存时间(DATAST)为85个HCLK        =5*85=425ns
    FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A
    //FMC写时序控制寄存器
    FSMC_WriteTim.AddressSetupTime=0x15;        //地址建立时间(ADDSET)为21个HCLK=105ns
    FSMC_WriteTim.AddressHoldTime=0x00;
    FSMC_WriteTim.DataSetupTime=0x15;           //数据保存时间(DATAST)为5ns*21个HCLK=105ns
    FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //模式A
                HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);               
                delay_xms(50); // delay 50 ms
       
                SRAM_Handler.Instance=FMC_NORSRAM_DEVICE;      
    SRAM_Handler.Extended=FMC_NORSRAM_EXTENDED_DEVICE;
               
                SRAM_Handler.Init.NSBank=FMC_NORSRAM_BANK2;     //使用NE2
                SRAM_Handler.Init.DataAddressMux=FMC_DATA_ADDRESS_MUX_DISABLE; //不复用数据线
    SRAM_Handler.Init.MemoryType=FMC_MEMORY_TYPE_SRAM;   //SRAM
    SRAM_Handler.Init.MemoryDataWidth=FMC_NORSRAM_MEM_BUS_WIDTH_16; //16位数据宽度
    SRAM_Handler.Init.BurstAccessMode=FMC_BURST_ACCESS_MODE_DISABLE; //是否使能突发访问,仅对同步突发存储器有效,此处未用到
    SRAM_Handler.Init.WaitSignalPolarity=FMC_WAIT_SIGNAL_POLARITY_LOW;//等待信号的极性,仅在突发模式访问下有用
    SRAM_Handler.Init.WaitSignalActive=FMC_WAIT_TIMING_BEFORE_WS;   //存储器是在等待周期之前的一个时钟周期还是等待周期期间使能NWAIT
    SRAM_Handler.Init.WriteOperation=FMC_WRITE_OPERATION_ENABLE;    //存储器写使能
    SRAM_Handler.Init.WaitSignal=FMC_WAIT_SIGNAL_DISABLE;           //等待使能位,此处未用到
    SRAM_Handler.Init.ExtendedMode=FMC_EXTENDED_MODE_ENABLE;        //读写使用不同的时序
    SRAM_Handler.Init.AsynchronousWait=FMC_ASYNCHRONOUS_WAIT_DISABLE;//是否使能同步传输模式下的等待信号,此处未用到
    SRAM_Handler.Init.WriteBurst=FMC_WRITE_BURST_DISABLE;           //禁止突发写
    SRAM_Handler.Init.ContinuousClock=FMC_CONTINUOUS_CLOCK_SYNC_ASYNC;
                //FMC读时序控制寄存器
    FSMC_ReadWriteTim.AddressSetupTime=0x11;    //地址建立时间(ADDSET)为17个HCLK 1/200M=5ns*17=85ns
    FSMC_ReadWriteTim.AddressHoldTime=0x00;
    FSMC_ReadWriteTim.DataSetupTime=0x55;       //数据保存时间(DATAST)为85个HCLK        =5*85=425ns
    FSMC_ReadWriteTim.AccessMode=FMC_ACCESS_MODE_A; //模式A
    //FMC写时序控制寄存器
    FSMC_WriteTim.AddressSetupTime=0x15;        //地址建立时间(ADDSET)为21个HCLK=105ns
    FSMC_WriteTim.AddressHoldTime=0x00;
    FSMC_WriteTim.DataSetupTime=0x15;           //数据保存时间(DATAST)为5ns*21个HCLK=105ns
    FSMC_WriteTim.AccessMode=FMC_ACCESS_MODE_A;     //模式A
                HAL_SRAM_Init(&SRAM_Handler,&FSMC_ReadWriteTim,&FSMC_WriteTim);               
                delay_xms(50); // delay 50 ms
}

但是均存器版本的FMC_NE1是可以用的,依葫芦画瓢写的FMC_NE2的驱动不能用。寄存器版本的初始化程序如下。

void FMCinit(void)
{
                RCC->AHB3ENR|=1<<12;             //使能FMC时钟
                FMCIOinit();

                //fmc_ker_ck来自pll2_r_ck=220Mhz
                //寄存器清零
                //bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
                //NE1 ---LCD,也就对应BTCR[0],[1]。                                    
                FMC_Bankf1->BTCR[0]=0X00000000;         
                FMC_Bankf1->BTCR[1]=0X00000000;
                FMC_Bankf1E->BWTR[0]=0X00000000;
                //操作BCR寄存器        使用异步模式
                FMC_Bankf1->BTCR[0]|=1<<12;                //存储器写使能
                FMC_Bankf1->BTCR[0]|=1<<14;                //读写使用不同的时序
                FMC_Bankf1->BTCR[0]|=1<<4;                 //存储器数据宽度为16bit             
                //操作BTR寄存器       
                //读时序控制寄存器                                                             
                FMC_Bankf1->BTCR[1]|=0<<28;                //模式A                                                                         
                FMC_Bankf1->BTCR[1]|=15<<0;                //地址建立时间(ADDSET)为15个fmc_ker_ck 1/220M=4.5ns*15=67.5ns       
                //因为液晶驱动IC的读数据的时候,速度不能太快,尤其是个别奇葩芯片。
                FMC_Bankf1->BTCR[1]|=78<<8;          //数据保存时间(DATAST)为78个fmc_ker_ck=4.5*78=351ns
                //写时序控制寄存器  
                FMC_Bankf1E->BWTR[0]|=0<<28;         //模式A                                                                      
                FMC_Bankf1E->BWTR[0]|=15<<0;                //地址建立时间(ADDSET)为15个fmc_ker_ck=67.5ns       
                //15个fmc_ker_ck(fmc_ker_ck=220Mhz),某些液晶驱动IC的写信号脉宽,最少也得50ns。           
                FMC_Bankf1E->BWTR[0]|=15<<8;                //数据保存时间(DATAST)为15个fmc_ker_ck=67.5ns       
                //使能BANK1,区域1
                FMC_Bankf1->BTCR[0]|=1<<0;                //使能BANK1,区域1            
                FMC_Bankf1->BTCR[0]|=(uint32_t)1<<31;        //使能FMC  
                                 
                delay_xms(50); // delay 50 ms
               
                //NE2 ---FIFO,也就对应BTCR[2],[3]。                                    
                FMC_Bankf1->BTCR[2]=0X00000000;         
                FMC_Bankf1->BTCR[3]=0X00000000;
                FMC_Bankf1E->BWTR[1]=0X00000000;
                //操作BCR寄存器        使用异步模式
                FMC_Bankf1->BTCR[2]|=1<<12;                //存储器写使能
                FMC_Bankf1->BTCR[2]|=1<<14;                //读写使用不同的时序
                FMC_Bankf1->BTCR[2]|=1<<4;                 //存储器数据宽度为16bit             
                //操作BTR寄存器       
                //读时序控制寄存器                                                             
                FMC_Bankf1->BTCR[3]|=0<<28;                //模式A                                                                         
                FMC_Bankf1->BTCR[3]|=15<<0;                //地址建立时间(ADDSET)为15个fmc_ker_ck 1/220M=4.5ns*15=67.5ns       
                FMC_Bankf1->BTCR[3]|=78<<8;          //数据保存时间(DATAST)为78个fmc_ker_ck=4.5*78=351ns
                //写时序控制寄存器  
                FMC_Bankf1E->BWTR[1]|=0<<28;         //模式A                                                                      
                FMC_Bankf1E->BWTR[1]|=15<<0;                //地址建立时间(ADDSET)为15个fmc_ker_ck=67.5ns       
                //15个fmc_ker_ck(fmc_ker_ck=220Mhz          
                FMC_Bankf1E->BWTR[1]|=15<<8;                //数据保存时间(DATAST)为15个fmc_ker_ck=67.5ns       
                //使能BANK1,区域2
                FMC_Bankf1->BTCR[2]|=1<<0;                //使能BANK1,区域2            
                FMC_Bankf1->BTCR[2]|=(uint32_t)1<<31;        //使能FMC  
                                 
                delay_xms(50); // delay 50 ms
}

使用特权

评论回复
沙发
阿尔法99|  楼主 | 2020-7-11 13:59 | 只看该作者
库函数版本的片选,只能在第一次操作的时候正常输出。

使用特权

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

本版积分规则

20

主题

214

帖子

0

粉丝