OpenEdv-开源电子网

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

stm32f103使用FSMC驱动ST7789花屏

[复制链接]

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
发表于 2022-4-5 21:10:38 | 显示全部楼层 |阅读模式
1金钱
大家好,
我最近使用STM32F103去控制ST7789V,使用GPIO方式能正常工作,就是刷新率太慢,手上的TFTLCD就只引出DB0~DB7,WR,RD,RST,RS和电源引脚,设想提高刷新率就只能使用FSMC了。
具体管脚对应如下:
CS-->FSMC_NE1, RS-->FSMC_A16,其他就跟芯片一一对应。
我代码是参考原子哥的,但就是结果出来花屏。我感觉我的问题是出在FSMC初始化吧,因为使用GPIO模拟8080方式是可以亮屏的,估计对LCD的初始化是没问题吧。
以下是我FSMC的初始化代码,大佬们可以帮忙看看哪里有问题吗?

1) LCD初始化
typedef struct
{
    uint8_t LCD_REG;
    uint8_t LCD_RAM;
} LCD_TypeDef;

#define LCD_BASE        ((uint32_t)(0x60000000 | 0x00000FFFF))   // FSMC_NE1-->0x60000000, 8bit输出对应RS偏移值-->0xFFFF
#define LCD             ((LCD_TypeDef *) LCD_BASE)



2) FSMC初始化代码
void LCD_Init(void)
{                  
    GPIO_InitTypeDef GPIO_InitStructure;
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  readWriteTiming;
    FSMC_NORSRAMTimingInitTypeDef  writeTiming;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);   //使能FSMC时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOE,ENABLE);//使能PORTB,D,E,G以及AFIO复用功能时钟

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;               //PD12 推挽输出 背光
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;                //PE1 RST
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;         //推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);

    //PORTD复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_7|GPIO_Pin_11|GPIO_Pin_14|GPIO_Pin_15;                // //PORTD复用推挽输出  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOD, &GPIO_InitStructure);

    //PORTE复用推挽输出  
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10;              // //PORTE复用推挽输出  
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;          //复用推挽输出   
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOE, &GPIO_InitStructure);                                                      

    readWriteTiming.FSMC_AddressSetupTime = 0x01;    //地址建立时间(ADDSET)为2个HCLK 1/36M=27ns
    readWriteTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(ADDHLD)模式A未用到
    readWriteTiming.FSMC_DataSetupTime = 0x0f;       // 数据保存时间为16个HCLK,因为液晶驱动IC的读数据的时候,速度不能太快,尤其对1289这个IC。
    readWriteTiming.FSMC_BusTurnAroundDuration = 0x00;
    readWriteTiming.FSMC_CLKDivision = 0x00;
    readWriteTiming.FSMC_DataLatency = 0x00;
    readWriteTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A


    writeTiming.FSMC_AddressSetupTime = 0x00;    //地址建立时间(ADDSET)为1个HCLK  
    writeTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(A     
    writeTiming.FSMC_DataSetupTime = 0x03;       ////数据保存时间为4个HCLK  
    writeTiming.FSMC_BusTurnAroundDuration = 0x00;
    writeTiming.FSMC_CLKDivision = 0x0f;
    writeTiming.FSMC_DataLatency = 0x00;
    writeTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A

    // BTCR为寄存器BCRx,BTRx, x=(NE1~NE4)
    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM1;//  这里我们使用NE1 ,也就对应BTCR[0],[1]。
    // BCRx[1] --> MUXEN地址/数据复用使能位
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
    // BCRx[3:2] --> MTYP存储器类型
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
    // BCRx[5:4] --> MWID:存储器数据总线宽度
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_8b;//存储器数据宽度为16bit   
    FSMC_NORSRAMInitStructure.FSMC_BurstAccessMode =FSMC_BurstAccessMode_Disable;// FSMC_BurstAccessMode_Disable;
    FSMC_NORSRAMInitStructure.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;
    FSMC_NORSRAMInitStructure.FSMC_AsynchronousWait=FSMC_AsynchronousWait_Disable;
    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_Enable; // 读写使用不同的时序
    FSMC_NORSRAMInitStructure.FSMC_WriteBurst = FSMC_WriteBurst_Disable;
    FSMC_NORSRAMInitStructure.FSMC_ReadWriteTimingStruct = &readWriteTiming; //读写时序
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &writeTiming;  //写时序

    FSMC_NORSRAMInit(&FSMC_NORSRAMInitStructure);  //初始化FSMC配置

    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1, ENABLE);  // 使能BANK1

    delay_ms(50);           // delay 50 ms
    //复位
    set_gpio_value(GPIOE, GPIO_Pin_1, 0);
    delay_ms(1000);
    set_gpio_value(GPIOE, GPIO_Pin_1, 1);

    delay_ms(50);           // delay 50 ms

    LCD_WR_REG(0x36);      // 显示扫描方向
    LCD_WR_DATA(0xA0);     // 00:从左到右,从上到下
                            // A0:从下到上,从左到右
                            // 60:从上到下,从右到左
    ...                     // 其他初始化命令






最佳答案

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

最新的程序就是有兼容了7789的
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2022-4-5 21:10:39 | 显示全部楼层
TimChan 发表于 2022-4-6 15:19
你好,我在资料下载中心看到2.8寸屏幕也还是9341的,你有7789的下载链接吗?麻烦发下可以吗?

最新的程序就是有兼容了7789的
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2022-4-6 10:28:45 | 显示全部楼层
你单独给背光引脚个3.3V也能亮的
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
 楼主| 发表于 2022-4-6 14:31:39 | 显示全部楼层
疾如风 发表于 2022-4-6 10:28
你单独给背光引脚个3.3V也能亮的

现在亮屏没问题,就是花屏了
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2022-4-6 14:37:10 | 显示全部楼层
正点原子最新的2.8寸屏幕的驱动就是7789的,你可以参考参考。
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
 楼主| 发表于 2022-4-6 15:03:45 | 显示全部楼层
疾如风 发表于 2022-4-6 14:37
正点原子最新的2.8寸屏幕的驱动就是7789的,你可以参考参考。

好的,谢谢你~
最新的驱动在资料下载中心可以找到是吧?
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
 楼主| 发表于 2022-4-6 15:19:25 | 显示全部楼层
疾如风 发表于 2022-4-6 14:37
正点原子最新的2.8寸屏幕的驱动就是7789的,你可以参考参考。

你好,我在资料下载中心看到2.8寸屏幕也还是9341的,你有7789的下载链接吗?麻烦发下可以吗?
回复

使用道具 举报

13

主题

644

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1976
金钱
1976
注册时间
2021-4-16
在线时间
505 小时
发表于 2022-4-6 15:37:31 | 显示全部楼层
http://www.openedv.com/docs/modules/lcd/2.8-TFT%20LCD-320240.html
不过貌似只有参考程序,没有7789的手册啥的。
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
 楼主| 发表于 2022-4-8 20:23:10 | 显示全部楼层
疾如风 发表于 2022-4-7 09:45
最新的程序就是有兼容了7789的

好的,谢谢你~
回复

使用道具 举报

0

主题

30

帖子

0

精华

初级会员

Rank: 2

积分
136
金钱
136
注册时间
2020-8-5
在线时间
30 小时
发表于 2022-4-15 10:08:28 | 显示全部楼层

你好,点亮了吗?最近项目也在使用2.4寸7789的驱动芯片
回复

使用道具 举报

6

主题

21

帖子

0

精华

初级会员

Rank: 2

积分
113
金钱
113
注册时间
2019-3-20
在线时间
22 小时
 楼主| 发表于 2022-5-6 13:49:25 | 显示全部楼层
吉双章 发表于 2022-4-15 10:08
你好,点亮了吗?最近项目也在使用2.4寸7789的驱动芯片

你好,已经点亮了。花屏说明初始化没有问题,我上面的FSMC初始化程序是ok的,出现问题是发送颜色数据出现了问题
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-2-27 07:13

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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