OpenEdv-开源电子网

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

我用 FSMC 总线来控制一个彩屏,刷屏发现好慢

[复制链接]

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-7-8
在线时间
2 小时
发表于 2012-2-14 15:51:02 | 显示全部楼层 |阅读模式
不知是哪里没设置,640*480的65K的屏,刷屏(全屏显某一种颜色)一次竟然要150ms。。。。

代码是参考原子的,请各位代为分析是什么原因导致的呢?

相关的代码如下:
void MYRCC_DeInit(void)    //初始化时钟系列。
{     
RCC->APB1RSTR = 0x00000000;//复位结束  
RCC->APB2RSTR = 0x00000000; 
 
  RCC->AHBENR = 0x00000014;  //睡眠模式闪存和SRAM时钟使能.其他关闭.  
  RCC->APB2ENR = 0x00000000; //外设时钟关闭.   
  RCC->APB1ENR = 0x00000000;   
RCC->CR |= 0x00000001;     //使能内部高速时钟HSION  
RCC->CFGR &= 0xF8FF0000;   //复位SW[1:0],HPRE[3:0],PPRE1[2:0],PPRE2[2:0],ADCPRE[1:0],MCO[2:0]  
 //   RCC->CFGR = 0xF0F0F0AA;   //Test
RCC->CR &= 0xFEF6FFFF;     //复位HSEON,CSSON,PLLON
RCC->CR &= 0xFFFBFFFF;     //复位HSEBYP    
RCC->CFGR &= 0xFF80FFFF;   //复位PLLSRC, PLLXTPRE, PLLMUL[3:0] and USBPRE 
RCC->CIR = 0x00000000;     //关闭所有中断
//配置向量表  
#ifdef  VECT_TAB_RAM
MY_NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);
#else   
MY_NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
#endif
}
void Stm32_Clock_Init(u8 PLL)  //初始化时钟的函数
{
unsigned char temp=0;   
MYRCC_DeInit();  //复位并配置向量表
RCC->CR|=0x00010000;  //外部高速时钟使能HSEON
while(!(RCC->CR>>17));//等待外部时钟就绪
RCC->CFGR=0X00000400; //APB1=DIV2;APB2=DIV1;AHB=DIV1;
PLL-=2;//抵消2个单位
RCC->CFGR|=PLL<<18;   //设置PLL值 2~16
RCC->CFGR|=1<<16;  //PLLSRC ON 
FLASH->ACR|=0x32;  //FLASH 2个延时周期

RCC->CR|=0x01000000;  //PLLON
while(!(RCC->CR>>25));//等待PLL锁定
RCC->CFGR|=0x00000002;//PLL作为系统时钟  
while(temp!=0x02)     //等待PLL作为系统时钟设置成功
{   
temp=RCC->CFGR>>2;
temp&=0x03;
}    
}


void RA8875_Init(void)
{
RCC->AHBENR|=1<<8;       //使能FSMC时钟  
  RCC->APB2ENR|=1<<3;      //使能PORTB时钟
RCC->APB2ENR|=1<<5;      //使能PORTD时钟
RCC->APB2ENR|=1<<6;      //使能PORTE时钟
RCC->APB2ENR|=1<<7;      //使能PORTF时钟
  RCC->APB2ENR|=1<<8;      //使能PORTG时钟
RCC->APB2ENR|=1<<0;      //使能AFIO时钟  
GPIOB->CRL&=0XFFFFFFF0;  //PB0 推挽输出 背光 这个作为RST
GPIOB->CRL|=0X00000003;   
//PORTD复用推挽输出
GPIOF->CRH&=0X0FFFFFFF; //使用PF15
GPIOF->CRH|=0XB0000000;

GPIOD->CRH&=0X00FFF000; //8  9  10  14  15 
GPIOD->CRH|=0XBB000BBB; 
GPIOD->CRL&=0XFF00FF00;  // 0  1  4  5
GPIOD->CRL|=0X00BB00BB;    
//PORTE复用推挽输出
GPIOE->CRH&=0X00000000; //7  8  9  10  11  12  13  14  15  
GPIOE->CRH|=0XBBBBBBBB; 
GPIOE->CRL&=0X0FFFFFFF; //7  
GPIOE->CRL|=0XB0000000;          
//PORTG12复用推挽输出 作为片选信号      
GPIOG->CRH&=0XFFF0FFFF;  // 12
GPIOG->CRH|=0X000B0000; 
GPIOG->CRL&=0XFFFFFFF0;//PG0->RS  //0 
GPIOG->CRL|=0X0000000B; 
  
//寄存器清零
//bank1有NE1~4,每一个有一个BCR+TCR,所以总共八个寄存器。
//这里我们使用NE4 ,也就对应BTCR[6],[7]。    
FSMC_Bank1->BTCR[6]=0X00000000;
FSMC_Bank1->BTCR[7]=0X00000000;
FSMC_Bank1E->BWTR[6]=0X00000000;
//操作BCR寄存器 使用异步模式
FSMC_Bank1->BTCR[6]|=1<<12;//存储器写使能
FSMC_Bank1->BTCR[6]|=1<<4; //存储器数据宽度为16bit    
//操作BTR寄存器    
//3个HCLK(HCLK=72M)因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。  
FSMC_Bank1->BTCR[7]|=1<<9; //数据保存时间为3个HCLK  
//闪存写时序寄存器  
FSMC_Bank1E->BWTR[6]=0x0FFFFFFF;//默认值
//使能BANK4(PC卡设备)
FSMC_Bank1->BTCR[6]|=1<<0;    
 
DelayMs(50); // delay 50 ms 
// LCD_WriteReg(0x0000,0x0001);
DelayMs(50); // delay 50 ms 
  //因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
FSMC_Bank1->BTCR[7]|=0XF<<8; //数据保存时间为16个HCLK
    FSMC_Bank1->BTCR[7]|=1<<28;   //用B模式 
// DeviceCode = LCD_ReadReg(0x0000);   
FSMC_Bank1->BTCR[7]&=~(0XF<<8); //数据保存时间为0
//因为液晶驱动IC的写信号脉宽,最少也得50ns。72M/3=24M=42ns,已经超频了。  
// FSMC_Bank1->BTCR[7]|=3<<8;      //数据保存时间为3个HCLK 
    FSMC_Bank1->BTCR[7]&= 0xFFFF00FF;
FSMC_Bank1->BTCR[7]|= 0x00000100;

     RST=1;
     DelayMs(2);               //上电延时100ms
RST=0;  
DelayMs(10);           
RST=1; 
DelayMs(10);                 //在上升沿的10才进行其他动作

LCD_OneCommand(PLLC1,0x05);   //
DelayMs(10);
LCD_OneCommand(PLLC2,0x02);   //  system clock = 25MHz
DelayMs(10);                   //更改PLL参数后要延时1ms

     LCD_OneCommand(PWRR,0x0001);  
DelayMs(10);
LCD_OneCommand(PWRR,0x0000);   //完成复位并关掉显示
DelayMs(10);                   //延时10ms
     LCD_OneCommand(SYSR,0x000F); //设置色彩深度、选择16bit的数据接口
DelayMs(1);
LCD_OneCommand(SFCLR,0x0000);   //Serail Flash/ROM频率设置,此处将Serial Flash/ROM频率设置与system clock一样
DelayUs(1);
LCD_OneCommand(P1CR,0x85);
LCD_OneCommand(P1DCR,0x0010);   //频率约为305Hz,占空比为50%
DelayMs(1);
     LCD_OneCommand(PCSR,0x0003);
LCD_OneCommand(HDWR,79);         //水平方向的像素点= (79+1)*8
LCD_OneCommand(HNDFTR,0x0005);   //水平非显示的像素(微调)
LCD_OneCommand(HNDR,0x000F);     //水平非显示的像素
LCD_OneCommand(HSTR,0x0001);     //水平同步信号起始宽度
LCD_OneCommand(HPWR,0x0000);     //水平同步信号脉冲宽度

LCD_OneCommand(VDHR0,0x00DF);
LCD_OneCommand(VDHR1,0x0001);    //以上两句为设置垂直方向的像素
LCD_OneCommand(VNDR0,0x000A);
LCD_OneCommand(VNDR1,0x0000);    //以上两句为设置垂直非显示的像素
LCD_OneCommand(VSTR0,0x001F);
LCD_OneCommand(VSTR1,0x0000);    //以上两句为设置垂直同步信号起始像素
LCD_OneCommand(VPWR, 0x0001);    //设置垂直同步脉冲信号宽度
     
     LCD_OneCommand(DPCR,0x0000);     //设置单图层、扫描方向等
LCD_OneCommand(MWCR0,0x0000);    //选择绘图模式、光标显示
LCD_OneCommand(MWCR1,0x0000);  
}








正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2012-2-14 16:30:36 | 显示全部楼层
怎么你的界面风格这么乱>
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
86
金钱
86
注册时间
2011-7-8
在线时间
2 小时
 楼主| 发表于 2012-2-14 17:32:50 | 显示全部楼层
回复【2楼】正点原子:
怎么你的界面风格这么乱>
---------------------------------
乱是乱了点。。

晚上回去再整理整理吧。。。

下班了。。
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-24 22:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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