初级会员

- 积分
- 124
- 金钱
- 124
- 注册时间
- 2019-12-9
- 在线时间
- 40 小时
|

楼主 |
发表于 2019-12-18 22:38:05
|
显示全部楼层
本帖最后由 jiyuehua1023 于 2019-12-18 22:50 编辑
这是CubeMX生成的FMC的参数配置:
/* FMC initialization function */
void MX_FMC_Init(void)
{
FMC_NORSRAM_TimingTypeDef Timing = {0};
/** Perform the SRAM1 memory initialization sequence
*/
hsram1.Instance = FMC_NORSRAM_DEVICE;
hsram1.Extended = FMC_NORSRAM_EXTENDED_DEVICE;
/* hsram1.Init */
hsram1.Init.NSBank = FMC_NORSRAM_BANK1;
hsram1.Init.DataAddressMux = FMC_DATA_ADDRESS_MUX_DISABLE;
hsram1.Init.MemoryType = FMC_MEMORY_TYPE_SRAM;
hsram1.Init.MemoryDataWidth = FMC_NORSRAM_MEM_BUS_WIDTH_16;
hsram1.Init.BurstAccessMode = FMC_BURST_ACCESS_MODE_DISABLE;
hsram1.Init.WaitSignalPolarity = FMC_WAIT_SIGNAL_POLARITY_LOW;
hsram1.Init.WaitSignalActive = FMC_WAIT_TIMING_BEFORE_WS;
hsram1.Init.WriteOperation = FMC_WRITE_OPERATION_ENABLE;
hsram1.Init.WaitSignal = FMC_WAIT_SIGNAL_DISABLE;
hsram1.Init.ExtendedMode = FMC_EXTENDED_MODE_DISABLE;
hsram1.Init.AsynchronousWait = FMC_ASYNCHRONOUS_WAIT_DISABLE;
hsram1.Init.WriteBurst = FMC_WRITE_BURST_DISABLE;
hsram1.Init.ContinuousClock = FMC_CONTINUOUS_CLOCK_SYNC_ONLY;
hsram1.Init.WriteFifo = FMC_WRITE_FIFO_ENABLE;
hsram1.Init.PageSize = FMC_PAGE_SIZE_NONE;
/* Timing */
Timing.AddressSetupTime = 15;
Timing.AddressHoldTime = 15;
Timing.DataSetupTime = 30;
Timing.BusTurnAroundDuration = 15;
Timing.CLKDivision = 16;
Timing.DataLatency = 17;
Timing.AccessMode = FMC_ACCESS_MODE_A;
/* ExtTiming */
if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK)
{
Error_Handler( );
}
}
这是LCD头文件中对指令和数据地址的定义:
//////////////////////////////////////////////////////////////////////////////////
//LCD地址结构体
typedef struct
{
vu16 LCD_REG;//0x6001FFFE右移一位后 A16是0
vu16 LCD_RAM;//结构体地址自动增加,A16变为1
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector4,地址位HADDR[27,26]=00 A16作为数据命令区分线
//注意设置时STM32内部会右移一位对齐。将要操作的地址加上一个偏移量0x0001FFFE
//即A16:A0=1 1111 1111 1111 1110后,地址右移1位对齐,变成0x0000FFFF,此时如果
//地址再加1,A16即变为1,从而实现RS的“0”,“1”控制
#define LCD_BASE ((u32)(0x60000000|0x0001FFFE))
#define LCD ((LCD_TypeDef *) LCD_BASE)
//////////////////////////////////////////////////////////////////////////////////
这是LCD.C文件中的相关读写语句:
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(vu16 regval)
{
regval=regval; //使用-O2优化的时候,必须插入的延时
LCD->LCD_REG=regval;//写入要写的寄存器序号
}
//写LCD数据
//data:要写入的值
void LCD_WR_DATA(vu16 data)
{
data=data; //使用-O2优化的时候,必须插入的延时
LCD->LCD_RAM=data;
}
//读LCD数据
//返回值:读到的值
u16 LCD_RD_DATA(void)
{
vu16 ram; //防止被优化
ram=LCD->LCD_RAM;
return ram;
}
//读取LCD的ID值
void LCD_ReadID()
{
LCD_WR_REG(0XD3);
HAL_Delay(1);//读ID命令,数据返回的比较慢,要延时等待
lcddev.id=LCD_RD_DATA(); //dummy read
lcddev.id=LCD_RD_DATA(); //读到0X00
lcddev.id=LCD_RD_DATA(); //读取93
lcddev.id<<=8;
lcddev.id|=LCD_RD_DATA(); //读取41
printf("LCDID=0x%04X\r\n",lcddev.id);
}
|
|