OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3835|回复: 1

关于FSMC驱动S1D13517

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
25
金钱
25
注册时间
2015-6-23
在线时间
0 小时
发表于 2015-6-24 14:22:44 | 显示全部楼层 |阅读模式
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设置成功就可以看到显示

在线等大神回复,小弟初来乍到,有不礼貌或描述不专业的地方敬请谅解


    
    
永远支持单机永远支持盗版
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-6-24 22:54:29 | 显示全部楼层
*(volatile UInt8 *)LCD->LCD_REG = index;
*(volatile UInt8 *)LCD->LCD_RAM = value;
你这种写法就不对啊。
前面的*(volatile UInt8 *),直接去掉!
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 05:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表