TA的每日心情 | 开心 2013-9-3 16:03 |
---|
签到天数: 6 天 连续签到: 1 天 [LV.2]偶尔看看I
|
本帖最后由 leoyezhihui 于 2013-9-1 16:05 编辑
前一段时间都在忙全国电子设计大赛,一直在学校做老师给的题都没怎么做这个。
前两天终于有一点时间了就开始给小车编程,当然啦,大部分程序都是移植过来的,毕竟再过两天就要开始全国电子设计大赛了。
好吧,下面就来分享一下这两天搞的显示模块,我们计划用TFT来显示,这样显示周围环境的时候比较直接简单。
TFT的驱动有好几种方式,因为用的是STM32,所以果断就用FSMC来驱动TFT,前面都有好几队分享过FSMC驱动TFT,这里理论上的我就不多分享了,下面我就直接分享一下驱动程序了。
/*******************STM32与TFT硬件连接**********************
PD14 -----FSMC_D0 ----D0
PD15 -----FSMC_D1 ----D1
PD0 -----FSMC_D2 ----D2
PD1 -----FSMC_D3 ----D3
PE7 -----FSMC_D4 ---D4
PE8 -----FSMC_D5 ---D5
PE9 -----FSMC_D6 ---D6
PE10 -----FSMC_D7 ----D7
PE11 -----FSMC_D8 ----D8
PE12 -----FSMC_D9 ----D9
PE13 -----FSMC_D10 ----D10
PE14 -----FSMC_D11 ----D11
PE15 -----FSMC_D12 ----D12
PD8 -----FSMC_D13 ----D13
PD9 -----FSMC_D14 ----D14
PD10 -----FSMC_D15 ----D15
PD4 -----FSMC_NOE -----RD
PD5 -----FSMC_NWE ----WR
PD7 -----FSMC_NE1 ----CS
PD11 -----FSMC_A16 ----RS
PB5-------------------RST
液晶的BL端直接接到3.3V电源上
***************************************************************/
STM32 FSMC的设置
/**************************************************************************************************************
* 函数名:GPIO_AF_FSMC_Config()
* 输入 :void
* 输出 :void
* 描述 :配置LCD连接的GPIO复用连接到FSMC
* 调用 :内部调用
*****************************************************************************************************************/
static void GPIO_AF_FSMC_Config(void)
{
/*配置GPIOD相应的管脚复用连接到FSMC*/
GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC); //配置GPIOD的Pin0复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC); //配置GPIOD的Pin1复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource4,GPIO_AF_FSMC); //配置GPIOD的Pin4复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC); //配置GPIOD的Pin5复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource7,GPIO_AF_FSMC); //配置GPIOD的Pin7复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource8,GPIO_AF_FSMC); //配置GPIOD的Pin8复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource9,GPIO_AF_FSMC); //配置GPIOD的Pin9复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource10,GPIO_AF_FSMC); //配置GPIOD的Pin10复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource11,GPIO_AF_FSMC); //配置GPIOD的Pin11复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC); //配置GPIOD的Pin14复用连接到FSMC
GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC); //配置GPIOD的Pin15复用连接到FSMC
/*配置GPIOE相应的管脚复用连接到FSMC*/
GPIO_PinAFConfig(GPIOE,GPIO_PinSource7,GPIO_AF_FSMC); //配置GPIOE的Pin7复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource8,GPIO_AF_FSMC); //配置GPIOE的Pin8复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource9,GPIO_AF_FSMC); //配置GPIOE的Pin9复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource10,GPIO_AF_FSMC); //配置GPIOE的Pin10复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource11,GPIO_AF_FSMC); //配置GPIOE的Pin11复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource12,GPIO_AF_FSMC); //配置GPIOE的Pin12复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource13,GPIO_AF_FSMC); //配置GPIOE的Pin13复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource14,GPIO_AF_FSMC); //配置GPIOE的Pin14复用连接到FSMC
GPIO_PinAFConfig(GPIOE,GPIO_PinSource15,GPIO_AF_FSMC); //配置GPIOE的Pin15复用连接到FSMC
}
/**************************************************************************************************************
* 函数名:LCD_FSMC_Config()
* 输入 :void
* 输出 :void
* 描述 :配置LCD的FSMC
* 调用 :内部调用
*****************************************************************************************************************/
static void LCD_FSMC_Config(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
LCD_GPIO_Config(); //LCD管脚配置
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
p.FSMC_AddressSetupTime = 5; //地址建立时间
p.FSMC_AddressHoldTime = 0; //地址保持时间
p.FSMC_DataSetupTime = 9; //数据建立时间
p.FSMC_BusTurnAroundDuration = 0;
p.FSMC_CLKDivision = 0;
p.FSMC_DataLatency = 0;
p.FSMC_AccessMode = FSMC_AccessMode_A; // 用模式A控制LCD
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_AsynchronousWait = FSMC_AsynchronousWait_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_WriteBurst = FSMC_WriteBurst_Disable;
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
I/O口设置
/**************************************************************************************************************
* 函数名:LCD_GPIO_Config()
* 输入 :void
* 输出 :void
* 描述 :配置LCD的GPIO管脚与FSMC连接
* 调用 :内部调用
*****************************************************************************************************************/
static void LCD_GPIO_Config(void)
{
GPIO_InitTypeDef GPIO_InitStructure; //定义GPIO初始化结构体
/* 使能FSMC的AHB3时钟,这里注意,不同芯片总线会不同 */
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);
/* 使能GPIOB,GPIOD,GPIOE的AHB1时钟*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB | RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE , ENABLE);
/*配置液晶屏的背光控制管脚*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; //设置管脚模式为输出模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置翻转速度为100Mhz,M4就是快啊
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //设置输出类型为推挽输出
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //设置管脚为Pin_5,根据自己液晶接法设置
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; //设置上/下拉电阻为无上拉下拉电阻
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化GPIOB的Pin_5
/* 配置基于FSMC的液晶屏的数据线
* 液晶屏数据线:FSMC-D0~D15: PD 14 15 0 1,PE 7 8 9 10 11 12 13 14 15,PD 8 9 10
*/
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //设置翻转速度为100Mhz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置管脚模式为复用模式
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_8 | GPIO_Pin_9 |
GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOB的Pin_0,Pin_,Pin_2,
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_Init(GPIOE, &GPIO_InitStructure);
/* 配置基于FSMC的液晶屏控制线
* PD4-FSMC_NOE LCD-RD
* PD5-FSMC_NWE LCD-WR
* PD7-FSMC_NE1 LCD-CS
* PD11-FSMC_A16 LCD-DC
*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 ;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_AF_FSMC_Config(); //在F407中必须加上这个复用连接配置,否则不能连接到FSMC
GPIO_SetBits(GPIOB, GPIO_Pin_5);
GPIO_SetBits(GPIOD, GPIO_Pin_4);
GPIO_SetBits(GPIOD, GPIO_Pin_5);
GPIO_SetBits(GPIOD, GPIO_Pin_7);
GPIO_ResetBits(GPIOD, GPIO_Pin_3);
GPIO_SetBits(GPIOD, GPIO_Pin_6);
}
下面就是给TFT传输数据的子程序
/**************************************************************************************************************
* 函数名:LCD_WriteRAM()
* 输入 :uint16_t RGB_data 16bit颜色数据
* 输出 :void
* 描述 :向LCD的RAM写数据
* 调用 :外部调用
*****************************************************************************************************************/
void LCD_WR_DATA(u16 data)
{
LCD_RAM=data;
}
//写寄存器函数
//regval:寄存器值
void LCD_WR_REG(u16 regval)
{
LCD_REG=regval;//写入要写的寄存器序号
}
下面是LCD的初始化程序
/**************************************************************************************************************
* 函数名:LCD_Init()
* 输入 :void
* 输出 :void
* 描述 :LCD初始化函数
* 调用 :外部调用
*****************************************************************************************************************/
void LCD_Init(void)
{
LCD_FSMC_Config();
delay_nms(50);
LCD_WR_REG(0x0011); //退出睡眠模式,0x0010为进入
delay_nms(50);
LCD_WR_REG(0x0013); //进入普通显示模式
LCD_WR_REG(0x00D0); //设置电源参数,后续3个参数
LCD_WR_DATA(0x0007); //1.0xVci
LCD_WR_DATA(0x0040); //
LCD_WR_DATA(0x001c); //
LCD_WR_REG(0x00D1); //Vcom Control 后续三个参数
LCD_WR_DATA(0x0000); //
LCD_WR_DATA(0x0018); //
LCD_WR_DATA(0x001d); //
LCD_WR_REG(0x00D2); //设置普通模式下的电源参数,后续两个参数
LCD_WR_DATA(0x0001); //
LCD_WR_DATA(0x0011); //
LCD_WR_REG(0x00C0); //Panel Driving setting 后续5个参数
LCD_WR_DATA(0x0000); //设置扫描模式
LCD_WR_DATA(0x003B); //设定行数480行
LCD_WR_DATA(0x0000); //
LCD_WR_DATA(0x0002); //5frames
LCD_WR_DATA(0x0011); //
LCD_WR_REG(0x00C1); //Timing setting 后续3个参数
LCD_WR_DATA(0x0010); //
LCD_WR_DATA(0x000B); //
LCD_WR_DATA(0x0088); //
LCD_WR_REG(0x00C5); //Frame Rate and Inversion Control 后续一个参数
LCD_WR_DATA(0x0001); //100hz
LCD_WR_REG(0x00C8); //伽马校正,后续12个参数
LCD_WR_DATA(0x0000);LCD_WR_DATA(0x0030);LCD_WR_DATA(0x0036);
LCD_WR_DATA(0x0045);LCD_WR_DATA(0x0004);LCD_WR_DATA(0x0016);
LCD_WR_DATA(0x0037);LCD_WR_DATA(0x0075);LCD_WR_DATA(0x0077);
LCD_WR_DATA(0x0054);LCD_WR_DATA(0x000f);LCD_WR_DATA(0x0000);
LCD_WR_REG(0x00E4);LCD_WR_DATA(0x00A0);
LCD_WR_REG(0x00F0);LCD_WR_DATA(0x0001);
LCD_WR_REG(0x00F3);LCD_WR_DATA(0x0040);
LCD_WR_DATA(0x000A);
LCD_WR_REG(0x00F7);LCD_WR_DATA(0x0080);
LCD_WR_REG(0x0036);LCD_WR_DATA(0x000a);
LCD_WR_REG(0x003A);LCD_WR_DATA(0x0055);
LCD_WR_REG(0x002A);
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0001);
LCD_WR_DATA(0x003F);
LCD_WR_REG(0x002B);
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0000);
LCD_WR_DATA(0x0001);
LCD_WR_DATA(0x00df);
delay_nms(50);
LCD_WR_REG(0x0029); //开显示
LCD_WR_REG(0x002C); //开始写数据
GPIO_SetBits(GPIOB,GPIO_Pin_5);
LCD_Clear(~WHITE);
LCD_SetFont(&Font16x24);
}
基本的程序就是这样的,剩下的都是一些工具似的子程序,最基本就是描点子程序
/**************************************************************************************************************
* 函数名:DrawPixel()
* 输入 :int16_t x, int16_t y 点的坐标
* 输出 :void
* 描述 :画一个象素点
* 调用 :外部调用
*****************************************************************************************************************/
void DrawPixel(uint16_t x, uint16_t y)
{
LCD_SetCursor(x,y);
LCD_WR_REG(0x002C);
LCD_WR_DATA(TextColor);
}
就这样简单的这样总结一下吧,现在开始其他模块的编程,希望能在比赛之前移植完所有的程序(之前一直用F103来调这小车)!!!!!!!!!!
|
|