OpenEdv-开源电子网

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

stm32f407FSMC刷屏速度

[复制链接]

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
发表于 2015-11-23 13:25:58 | 显示全部楼层 |阅读模式
5金钱
测试了一下stm32f407FSMC刷lcd显示屏的速度,感觉有点慢7s时间刷了1000次,lcd尺寸是240*320,lcd芯片I是ili9328,FSMC数据16位,换算出来是1s能刷14帧吧,感觉速度有点慢,请问大神门的速度都是多少

最佳答案

查看完整内容[请看2#楼]

407刷240*320,400帧左右  计算方法很简单: 33M/320/240=430帧. 低于这个速度,可能你代码问题,也可能你FSMC配置问题,也可能你液晶速度跟不上.
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165371
金钱
165371
注册时间
2010-12-1
在线时间
2110 小时
发表于 2015-11-23 13:25:59 | 显示全部楼层
407刷240*320,400帧左右 
计算方法很简单:
33M/320/240=430帧.

低于这个速度,可能你代码问题,也可能你FSMC配置问题,也可能你液晶速度跟不上.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

9

主题

1385

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
11738
金钱
11738
注册时间
2013-3-8
在线时间
1251 小时
发表于 2015-11-23 15:34:35 | 显示全部楼层
14帧是怎么得出来的?
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
 楼主| 发表于 2015-11-24 08:08:55 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
#include "ili93xx.h"

#include "youxihou.h"

extern const  rt_uint16_t _acyouxihou[];
//BANK1-NE4-PA0
#define LCD_REG (*((volatile rt_uint16_t *) 0x6C000000)) /* RS = 0 */
#define LCD_RAM (*((volatile rt_uint16_t *) 0x6C000002)) /* RS = 1 */

static void ili93xx_fsmc_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
FSMC_NORSRAMInitTypeDef FSMC_NORSRAMInitStructure;
FSMC_NORSRAMTimingInitTypeDef FSMC_ReadWriteTimingInitStructure, FSMC_WriteTimingInitStructure;
/*clock init*/
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOD |\
 RCC_AHB1Periph_GPIOE | RCC_AHB1Periph_GPIOF | RCC_AHB1Periph_GPIOG, ENABLE);
RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC, ENABLE);

/*GPIO configuration*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_DOWN;
GPIO_Init(GPIOA, &GPIO_InitStructure);


GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;


GPIO_PinAFConfig(GPIOD, GPIO_PinSource0, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource1, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource4, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource5, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource8, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource9, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource10, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource14, GPIO_AF_FSMC);
GPIO_PinAFConfig(GPIOD, GPIO_PinSource15, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_8 |\
GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_14 | GPIO_Pin_15;
GPIO_Init(GPIOD, &GPIO_InitStructure);

  GPIO_PinAFConfig(GPIOE, GPIO_PinSource7, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource8, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource9, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_FSMC);
  GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_FSMC);
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);  
  
  GPIO_PinAFConfig(GPIOF, GPIO_PinSource0, GPIO_AF_FSMC);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_Init(GPIOF, &GPIO_InitStructure); 

  GPIO_PinAFConfig(GPIOG, GPIO_PinSource12, GPIO_AF_FSMC);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;
GPIO_Init(GPIOG, &GPIO_InitStructure);

  /*fsmc configuration*/
FSMC_ReadWriteTimingInitStructure.FSMC_AddressSetupTime = 8;//16HCLK
FSMC_ReadWriteTimingInitStructure.FSMC_AddressHoldTime = 0;
FSMC_ReadWriteTimingInitStructure.FSMC_DataSetupTime = 24;
FSMC_ReadWriteTimingInitStructure.FSMC_BusTurnAroundDuration = 0;//This parameter is only used for multiplexed NOR Flash memories.
FSMC_ReadWriteTimingInitStructure.FSMC_CLKDivision = 0;//This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses
FSMC_ReadWriteTimingInitStructure.FSMC_DataLatency = 0;//It is don't care in asynchronous NOR, SRAM or ROM accesses
FSMC_ReadWriteTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;

FSMC_WriteTimingInitStructure.FSMC_AddressSetupTime = 0;//8HCLK
FSMC_WriteTimingInitStructure.FSMC_AddressHoldTime = 0;
FSMC_WriteTimingInitStructure.FSMC_DataSetupTime = 4;
FSMC_WriteTimingInitStructure.FSMC_BusTurnAroundDuration = 0;//This parameter is only used for multiplexed NOR Flash memories.
FSMC_WriteTimingInitStructure.FSMC_CLKDivision = 0;//This parameter is not used for asynchronous NOR Flash, SRAM or ROM accesses
FSMC_WriteTimingInitStructure.FSMC_DataLatency = 0;//It is don't care in asynchronous NOR, SRAM or ROM accesses
FSMC_WriteTimingInitStructure.FSMC_AccessMode = FSMC_AccessMode_A;

  FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4; //ILI93XX_CS   G12   FSMC_NE4
FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable;//be used in nor SRAM
FSMC_NORSRAMInitStructure.FSMC_MemoryType = FSMC_MemoryType_SRAM;
FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;
FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//valid only with synchronous burst Flash memories
FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;//valid only when accessing memories in burst mode
FSMC_NORSRAMInitStructure.FSMC_WrapMode = FSMC_WrapMode_Disable;//valid only when accessing memories in burst mode
FSMC_NORSRAMInitStructure.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState;//valid only when accessing memories in burst mode
FSMC_NORSRAMInitStructure.FSMC_WriteOperation = FSMC_WriteOperation_Enable;
FSMC_NORSRAMInitStructure.FSMC_WaitSignal = FSMC_WaitSignal_Disable;
FSMC_NORSRAMInitStructure.FSMC_ExtendedMode = FSMC_ExtendedMode_Enable;
FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;//Enables or disables the write burst operation
FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &FSMC_ReadWriteTimingInitStructure;
FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_WriteTimingInitStructure;

FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);

FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM4, ENABLE);

}







static __inline void write_cmd(rt_uint16_t cmd)
{
// cmd = cmd;
LCD_REG = cmd;
}
static __inline void write_data(rt_uint16_t data)
{
//data = data;
LCD_RAM = data;
}
static __inline rt_uint16_t read_data(void)
{
// rt_uint16_t val=0;
// val = LCD_RAM;
// return val;
return LCD_RAM;
}

static __inline void write_reg(rt_uint16_t reg_addr,rt_uint16_t reg_val)
{
write_cmd(reg_addr);
write_data(reg_val);
}

static __inline rt_uint16_t read_reg(rt_uint16_t reg_addr)
{
rt_uint16_t reg_val=0;
  write_cmd(reg_addr);
  reg_val = read_data();
return reg_val;
}

void ili93xx_init(void)
{
rt_uint16_t deviceid[3]={0,0,0};
rt_uint16_t i=0;
ili93xx_fsmc_init();

deviceid[0] = read_reg(0x0000);
deviceid[1] = read_reg(0x0000);
deviceid[2] = read_reg(0x0000);

write_reg(0x0000,0x0001); //  OSC

write_reg(0x0001,0x0100); //?????SS=0, ?????????S1?S720
//(?????SS=1, ?????????S720?S1)
//SM=0,????(SM=1,????)

write_reg(0x0002,0x0700); //B/C=1?EOR=1:???(B/C=0:?/???)
write_reg(0x0003,0x0018); //AM=0,??????????1
//I/D[1:0] = 11:?????????
//BGR=1:??BGR??...BGR=0:??RGB??
//TRI=0?DFM=*:8?????????
write_reg(0x0004,0x0000); //??????:???

//????
write_reg(0x0008,0x0109); //???????? 
write_reg(0x0009,0x0000);//??????????ISC[3:0]
write_reg(0x000A,0x0000); //?????

write_reg(0x000C,0x0000);//RGB??????1
write_reg(0x000D,0x0000);//?????
write_reg(0x000F,0x0000);//RGB??????2

//????
write_reg(0x0010,0x0000);   
write_reg(0x0011,0x0007);  
write_reg(0x0012,0x0000);  
write_reg(0x0013,0x0000); 
//vgh 
write_reg(0x0010,0x1290);   
write_reg(0x0011,0x0227);
//delayms(100);
//vregiout 
write_reg(0x0012,0x001d); //0x001b
//delayms(100); 
//vom amplitude
write_reg(0x0013,0x1500);
//delayms(100); 
//vom H
write_reg(0x0029,0x0018); 
write_reg(0x002B,0x000D); 

//????
write_reg(0x0030,0x0004);
write_reg(0x0031,0x0307);
write_reg(0x0032,0x0002);//0006
write_reg(0x0035,0x0206);
write_reg(0x0036,0x0408);
write_reg(0x0037,0x0507); 
write_reg(0x0038,0x0204);//0200
write_reg(0x0039,0x0707); 
write_reg(0x003C,0x0405);//0504
write_reg(0x003D,0x0F02); 

//????
write_reg(0x0050,0x0000);//??????
write_reg(0x0051,0x00EF);//?????? ??EF
write_reg(0x0052,0x0000);//??????
write_reg(0x0053,0x013F);//?????? ??13F

write_reg(0x0060,0xA700);//?????,GS=1:?G320???G1,320?
write_reg(0x0061,0x0001); 
write_reg(0x006A,0x0000);
//
write_reg(0x0080,0x0000); 
write_reg(0x0081,0x0000); 
write_reg(0x0082,0x0000); 
write_reg(0x0083,0x0000); 
write_reg(0x0084,0x0000); 
write_reg(0x0085,0x0000); 
//
write_reg(0x0090,0x0010); 
write_reg(0x0092,0x0600); 
write_reg(0x0093,0x0003); 
write_reg(0x0095,0x0110); 
write_reg(0x0097,0x0000); 
write_reg(0x0098,0x0000);
write_reg(0x0007,0x0133);

}

static void ili93xx_SetCursor(rt_uint16_t x,rt_uint16_t y)
{
    write_reg(0x0020,x);    /* 0-239 */    //0x0020
    write_reg(0x0021,y);    /* 0-319 */    //0x0021
}
static void rw_data_prepare(void) 
{
write_cmd(0x0022);
}
static rt_uint16_t BGR2RGB(rt_uint16_t c)
{
    rt_uint16_t  r, g, b, rgb;
    b = (c>>0)  & 0x1f;
    g = (c>>5)  & 0x3f;
    r = (c>>11) & 0x1f;
    rgb =  (b<<11) + (g<<5) + (r<<0);
    return( rgb );
}
void ili93xx_set_pixel(rt_uint16_t pixel, rt_uint16_t x, rt_uint16_t y)
{
    ili93xx_SetCursor(x,y);
    rw_data_prepare();
    write_data(pixel);
}

void rt_hw_lcd_get_pixel(char* pixel, int x, int y)
{
ili93xx_SetCursor(x,y);
    rw_data_prepare();
    *(rt_uint16_t*)pixel = read_data();
*(rt_uint16_t*)pixel = read_data();
}

void stemwin_thread_entry(void *parameter)
{
rt_uint16_t pixel=0X0000;
rt_uint16_t i=0,j=0,k=0;
rt_tick_t rt_system_time=0;
ili93xx_init();
GPIO_SetBits(GPIOA, GPIO_Pin_1);
rt_thread_delay( RT_TICK_PER_SECOND*2 );

//pixel = BGR2RGB(0x0000);
while(1)
{
rt_system_time = rt_tick_get();
rt_kprintf("%d\n",rt_system_time);
  for(k=0;k<1000;k++){
for(i=0;i<240;i++)
{
for(j=0;j<320;j++)
{
// k=j*(i+1);
// ili93xx_set_pixel(_acyouxihou[k], i, j);
ili93xx_set_pixel(pixel, i, j);
// if(pixel<0xffff)pixel++;
// else pixel =0 ;
}
}
}
rt_system_time = rt_tick_get();
rt_kprintf("%d\n",rt_system_time);
rt_kprintf("%d\n",k);
if(k<0xffff) k++;
else k=0;
// i=0;
// rt_thread_delay( RT_TICK_PER_SECOND );
}

}



这是完整的程序,测试的方法是先设置指针位置然后写ram,刷新1000次屏幕测试一下时间,外部晶振8M HCLK速度168M

人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
 楼主| 发表于 2015-11-24 08:21:42 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
基本解决重新改了一下刷新方法,改成这样就OK了

rt_system_time = rt_tick_get();
rt_kprintf("%d\n",rt_system_time);
ili93xx_SetCursor(0,0);
    rw_data_prepare();
  for(k=0;k<1000;k++){
for(i=0;i<240*320;i++)
{
// for(j=0;j<320;j++)
{
write_data(pixel);
// k=j*(i+1);
// ili93xx_set_pixel(_acyouxihou[k], i, j);
// ili93xx_set_pixel(pixel, i, j);
// if(pixel<0xffff)pixel++;
// else pixel =0 ;
}
}
}
rt_system_time = rt_tick_get();
rt_kprintf("%d\n",rt_system_time);
// rt_kprintf("%d\n",k);
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2612
金钱
2612
注册时间
2011-1-25
在线时间
176 小时
发表于 2015-11-24 09:09:58 | 显示全部楼层
FSMC_ReadWriteTimingInitStructure.FSMC_AddressSetupTime = 8;//16HCLK 
FSMC_ReadWriteTimingInitStructure.FSMC_DataSetupTime = 24; 


改短
一直努力就很好。
回复

使用道具 举报

65

主题

440

帖子

0

精华

高级会员

Rank: 4

积分
782
金钱
782
注册时间
2012-8-29
在线时间
17 小时
 楼主| 发表于 2015-11-24 14:19:13 | 显示全部楼层
回复【6楼】qq942266575:
---------------------------------
刷屏只是写入访问
人生永远追逐着幻光,但谁把幻光看作幻光,谁便沉入无边的苦海
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-25 15:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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