jz_xk 2014-04-26 02:00 采纳率: 0%
浏览 1945

STM32F013用FSMC驱动SSD1289控制气的问题

尊敬的大侠们,菜鸟我刚买了个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

  • 写回答

1条回答

  • CSDN-Ada助手 CSDN-AI 官方账号 2022-10-25 19:53
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:

    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    评论

报告相同问题?

悬赏问题

  • ¥15 SQL Server下载
  • ¥15 python如何将动态的多个子列表,拼接后进行集合的交集
  • ¥20 vitis-ai量化基于pytorch框架下的yolov5模型
  • ¥15 如何实现H5在QQ平台上的二次分享卡片效果?
  • ¥15 python爬取bilibili校园招聘网站
  • ¥30 求解达问题(有红包)
  • ¥15 请解包一个pak文件
  • ¥15 不同系统编译兼容问题
  • ¥100 三相直流充电模块对数字电源芯片在物理上它必须具备哪些功能和性能?
  • ¥30 数字电源对DSP芯片的具体要求