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
} |