尊敬的大侠们,菜鸟我刚买了个stm32f103的板子,用fsmc驱动时发现当你使用变化的数据流往寄存器写数据时(即显示图片时),他无法刷屏,直接是当前的刷屏背景,复位都没有用,但是你写入一种颜色数据确实正常的....代码附上,求大神帮忙
、、、、、、、、、、、、这是LCD.C中的、、、、、、、、、、、、、、、、、、、
#include "include.h"
/*
*函数名: void LCD_FSMCConfig(void)
*描述: 初始化FSMC
*输入参数:
*返回值:
*调用方法: 直接调用
*/
void LCD_FSMCConfig(void)
{
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef p;
//设置地址建立时间
p.FSMC_AddressSetupTime = 5;
//设置地址保持时间
p.FSMC_AddressHoldTime = 0;
//设置数据建立时间
p.FSMC_DataSetupTime = 10;
//总线返转时间
p.FSMC_BusTurnAroundDuration = 0;
//时钟分频
p.FSMC_CLKDivision = 0;
//数据保持时间
p.FSMC_DataLatency = 0;
//FSMC选用模式
p.FSMC_AccessMode = FSMC_AccessMode_A;
//选择设置的BANK以及片选信号(BANK1中的第一个block)
FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;
//设置是否数据地址总线时分复用(No)
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;
//设置存储器类型(NOR)
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_NOR;
//设置数据宽度(16bit)
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
//设置是否使用迸发访问模式(连续读写模式)(No)
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;
//设置WAIT信号的有效电平(低电平有效)
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
//设置是否使用还回模式(No)
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;
//设置WAIT信号有效时机(在wait状态之前)
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;
//设置是否使能写操作(Yes)
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
//设置是否使用WAIT信号(No)
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
//设置是否使用扩展模式(读写时序相互独立)(No)
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;
//设置是否使用迸发写模式(No)
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
//设定读写时序
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &p;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &p;
FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);
/* Enable FSMC Bank1_SRAM Bank */
FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);
}
/*
*函数名: void LCD_IOConfig(void)
*描述: 初始化LCD的IO口
*输入参数:
*返回值:
*调用方法: 直接调用
*/
void LCD_IOConfig(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
//打开FSMC时钟和GPIO口时钟
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE|RCC_APB2Periph_AFIO,ENABLE);
/********************打开FSMC的数据端口D[15:0]****************************/
/*初始化GPIOD口,电路图从左至右*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_14|GPIO_Pin_0|GPIO_Pin_9|
GPIO_Pin_5|GPIO_Pin_15|GPIO_Pin_1|GPIO_Pin_8|GPIO_Pin_10
|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOD , &GPIO_InitStructure);
/*初始化GPIOE口,电路图从左至右*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7|GPIO_Pin_9|GPIO_Pin_11|
GPIO_Pin_13|GPIO_Pin_15|GPIO_Pin_8|GPIO_Pin_10|GPIO_Pin_12|GPIO_Pin_14;
GPIO_Init(GPIOE , &GPIO_InitStructure);
/* RS接PD11---A16*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;
GPIO_Init(GPIOD , &GPIO_InitStructure);
/*NE1------LCD_CS--->GPIOD-7*/
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7;
GPIO_Init(GPIOD , &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_ResetBits(GPIOD, GPIO_Pin_12);//取消LCD 的复位
}
/*
*函数名: void delay_ms(uint16_t ms)
*描述:
*输入参数:
*返回值:
*调用方法:
*/
void delay_ms(uint16_t ms)
{
uint16_t i,j;
for( i = 0; i < ms; i++ )
{
for( j = 0; j < 1141; j++ );
}
}
/*
函数名: __inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
*描述: 写LCD寄存器(内联写寄存器,不重入压栈,加快速度)
*输入参数: LCD寄存器地址和写入寄存器的值
*返回值:
*调用方法:
*/
__inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue)
{
/ 写入寄存器16位地址然后写入寄存器的值 /
// Clr_Cs;RS=0;
BANK1_LCD_REG=LCD_Reg;
/ Write 16-bit Reg , RS=1*/
BANK1_LCD_RAM=LCD_RegValue;
// Set_Cs;
}
/*
*函数名: void LCD_SetCursor()
*描述: 设置LCD数据写入的起始坐标0x4e--xpos,0x4f---ypos;
*输入参数: LCD寄存器地址和写入寄存器的值
*返回值:
*调用方法:
*/
void LCD_SetCursor(uint16_t Xpos , uint16_t Ypos)
{
LCD_WriteReg(0x004e , Xpos);
LCD_WriteReg(0x004f , Ypos);
}
/*
*函数名: LCD_GetPoint(xpos , ypos);
*描述: 获取屏幕上一个点的颜色数据
*输入参数: 坐标参数
*返回值: 颜色数据
*调用方法:
*/
uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos)
{
uint16_t RGBColor=0;
LCD_SetCursor( Xpos , Ypos);
BANK1_LCD_REG=0x22;
RGBColor=BANK1_LCD_RAM;
RGBColor=BANK1_LCD_RAM;
return RGBColor;
}
/*
函数名: LCD_SetPoint(xpos , ypos);
*描述: 在屏幕上打一个点
*输入参数: 坐标参数
*返回值:
*调用方法:
*/
void LCD_SetPoint(uint16_t Color)
{
BANK1_LCD_RAM=Color;
}
/
函数名: LCD_SetDispArea
*描述: 设置显示区域
*输入参数: 起始终止坐标
*返回值:
*调用方法:
*/
void LCD_SetDispArea(uint16_t Xspos , uint16_t Yspos , uint16_t Xepos , uint16_t Yepos)
{
LCD_WriteReg(0x44,Xspos+(Xepos<<8)); /水平坐标起始(低八位)和终止(高八位)*/
LCD_WriteReg(0x45,Yspos); /*Yspos*/
LCD_WriteReg(0x46,Yepos); /*Yepos*/
}
/*
*函数名: LCD_ClearArea(uint16_t Xspos , uint16_t Yspos , uint_t Xepos ,uint_t Yepos,uint16_t Color)
*描述: 清屏
*输入参数:
*返回值:
*调用方法:
*/
void LCD_Clear(uint16_t Color)
{
int i=0;
LCD_SetDispArea(0, 0,239,320);
LCD_SetCursor(0 , 0);
BANK1_LCD_REG=0x22;
for(i=0 ; i<240*320 ; i++)
{
LCD_SetPoint(Color);
}
}
void DispImag(const unsigned char Image , unsigned int Lenth)
{
int i=0;
uint16_t Color;
LCD_SetDispArea(0, 0,239,320);
LCD_SetCursor(0 , 0);
BANK1_LCD_REG=0x22;
if(i<Lenth/2)
{
Color = (u16)(Image[2*i]<<8) + Image[2*i+1];
BANK1_LCD_RAM=Color;
i++;
}
}
/
*函数名: void LCD_Init(void)
*描述: 初始化LCD
*输入参数:
*返回值:
*调用方法: 直接调用
*/
void LCD_Init(void)
{
LCD_IOConfig();
LCD_FSMCConfig();
GPIO_ResetBits(GPIOD, GPIO_Pin_12);
LCD_WriteReg(0x0000,0x0001); //打开晶振
LCD_WriteReg(0x0003,0xA8A4); //0xA8A4
LCD_WriteReg(0x000C,0x0000);
LCD_WriteReg(0x000D,0x080C);
LCD_WriteReg(0x000E,0x6800);
LCD_WriteReg(0x001E,0x00B0);
LCD_WriteReg(0x0001,0x6B3F); //驱动输出控制320*240 0x693F 0x2B3F 0x293F
LCD_WriteReg(0x0002,0x0600); //LCD Driving Waveform control
LCD_WriteReg(0x0010,0x0000);
LCD_WriteReg(0x0011,0x6078); //0x4030 //定义数据格式 16位色 0x6070 横屏 0x6058
LCD_WriteReg(0x0005,0x0000);
LCD_WriteReg(0x0006,0x0000);
LCD_WriteReg(0x0016,0xEF1C);
LCD_WriteReg(0x0017,0x0003);
LCD_WriteReg(0x0007,0x0233); //0x0233
LCD_WriteReg(0x000B,0x0000);
LCD_WriteReg(0x000F,0x0000); //扫描开始地址
LCD_WriteReg(0x0041,0x0000);
LCD_WriteReg(0x0042,0x0000);
LCD_WriteReg(0x0048,0x0000);
LCD_WriteReg(0x0049,0x013F);
LCD_WriteReg(0x004A,0x0000);
LCD_WriteReg(0x004B,0x0000);
LCD_WriteReg(0x0044,0xEF00);
LCD_WriteReg(0x0045,0x0000);
LCD_WriteReg(0x0046,0x013F);
LCD_WriteReg(0x0030,0x0707);
LCD_WriteReg(0x0031,0x0204);
LCD_WriteReg(0x0032,0x0204);
LCD_WriteReg(0x0033,0x0502);
LCD_WriteReg(0x0034,0x0507);
LCD_WriteReg(0x0035,0x0204);
LCD_WriteReg(0x0036,0x0204);
LCD_WriteReg(0x0037,0x0502);
LCD_WriteReg(0x003A,0x0302);
LCD_WriteReg(0x003B,0x0302);
LCD_WriteReg(0x0023,0x0000);
LCD_WriteReg(0x0024,0x0000);
LCD_WriteReg(0x0025,0x8000);
LCD_WriteReg(0x004e,0); //列(X)首址0
LCD_WriteReg(0x004f,0); //行(Y)首址0
}
、、、、、、、、、、、、、、这是LCD.H的、、、、、、、、、、、、、、、、、、、、、
#ifndef LCD_H
#define LCD_H
#include "include.h"
/* Private define
------------------------------------------------------------*/
/*
挂载于不同的BANK,使用不同地址是自行换算
/
#define BANK1_LCD_REG (((volatile unsigned short ) 0x60000000))
/*RS = 0 ,写寄存器值/
#define BANK1_LCD_RAM (*((volatile unsigned short ) 0x60020000))
/*RS = 1 ,写寄存器索引/
/* LCD Color */
#define LCD_COLOR_WHITE 0xFFFF
#define LCD_COLOR_BLACK 0x0000
#define LCD_COLOR_GREY 0xF7DE
#define LCD_COLOR_BLUE 0x001F
#define LCD_COLOR_BLUE2 0x051F
#define LCD_COLOR_RED 0xF800
#define LCD_COLOR_MAGENTA 0xF81F
#define LCD_COLOR_GREEN 0x07E0
#define LCD_COLOR_CYAN 0x7FFF
#define LCD_COLOR_YELLOW 0xFFE0
/**
- @brief LCD Registers */
void FMSC_Init(void);
void LCD_IOInit(void);
void LCD_Init(void);
__inline void LCD_WriteReg(uint16_t LCD_Reg,uint16_t LCD_RegValue);
void LCD_Clear(uint16_t Color);
uint16_t LCD_GetPoint(uint16_t Xpos , uint16_t Ypos);
void DispImag(const unsigned char *Image , unsigned int Lenth);
#endif