新手入门
- 积分
- 25
- 金钱
- 25
- 注册时间
- 2015-6-23
- 在线时间
- 0 小时
|
5金钱
各位大神好,小的刚接触STM的单片机 先在刚写完驱动程序,但是程序运行到LCD驱动IC的reg初始化时出现死机现象(删掉此函数程序正常),具体配置如下:
1、自定义时钟源为外部时钟 :正常
2、启动定时器中断 :正常(用作参考)
3、设置FSMC相关IO口:
#RD→PD4
#WE→PD5
#RST→PD11(此口并未通过FSMC直接控制,也没有设置它的任何功能)
#CS→PD7(NE1)
D/C→PF1(A1)
具体IO口配置如下:
GPIO_InitTypeDef GPIO_InitStructure;
/* Set PD.00(D2), PD.01(D3), PD.04(NOE), PD.05(NWE), PD.07(#CS),PD.08(D13), PD.09(D14),
PD.10(D15), PD.14(D0), PD.15(D1) as alternate
function push pull */
/*D端口初始化*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_7 |
GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
/*E端口初始化*/
/* Set PE.07(D4), PE.08(D5), PE.09(D6), PE.10(D7), PE.11(D8), PE.12(D9), PE.13(D10),
PE.14(D11), PE.15(D12) as alternate function push pull */
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_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOE, &GPIO_InitStructure); //将配置写入
/*A1地址线 Set PF.1(RS ) */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOF, &GPIO_InitStructure);
/*复位端口PD.11(#RESET)*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
FSMC配置采用读写时序共用,设置参数同原子哥的教程基本相同:
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE); //使能FSMC
/*-- FSMC Configuration ------------------------------------------------------*/
/*----------------------- SRAM Bank 1 ----------------------------------------*/
/* FSMC_Bank1_NORSRAM1 configuration */
p.FSMC_AddressSetupTime = 0x01;
p.FSMC_AddressHoldTime = 0;
p.FSMC_DataSetupTime = 0x0F;
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_B;
/*
Color LCD configuration ------------------------------------
LCD configured as follow:
- Data/Address MUX = Disable
- Memory Type = SRAM
- Data Width = 16bit
- Write Operation = Enable
- Extended Mode = Enable
- Asynchronous Wait = Disable
*/
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_16b;
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_AsynchronousWait=FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* BANK 1 (of NOR/SRAM Bank 1~4) is enabled */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
另外,因为采用的是NE1,所以REG和RAM地址有所变化:
#define LCD_BASE ((u32)(0x60000000 | 0x00000002)) //以A1为RS
#define LCD ((LCD_TypeDef *) LCD_BASE)
然后就是读写寄存器程序:
// 寄存器读函数
UInt8 seReadReg(UInt8 index)
{
*(volatile UInt8 *)LCD->LCD_REG = index;
return (*(volatile UInt8 *)LCD->LCD_RAM);
}
// 寄存器写函数
void seWriteReg(UInt8 index, UInt8 value)
{
*(volatile UInt8 *)LCD->LCD_REG = index;
*(volatile UInt8 *)LCD->LCD_RAM = value;
}
最后是执行LCD控制器的寄存器设置函数,程序在此函数卡死,在此简略写上:
void S1DInit(void)
{
seWriteReg(REG2A_DSP_MODE, 0x00);
// seWriteReg(REG2A_DSP_MODE, 0x0E);
seWriteReg(REG68_POWER_SAVE, 0x00);
seWriteReg(REG04_PLL_DDIVIDER, 0x17);
seWriteReg(REG06_PLL_0, 0x51);
。。。。
。。。。
。。。。
}
另外有个疑问:请问你们所说的RS脚 应该就是D/C脚吧 不同的芯片的定义名称不一样 看起来也挺头痛的
备注:
1、S1D13517驱动IC有测试功能,只要REG设置成功就可以看到显示
在线等大神回复,小弟初来乍到,有不礼貌或描述不专业的地方敬请谅解
|
|