OpenEdv-开源电子网

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

有没有FSMC寄存器版本控制LCD例程

[复制链接]

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-11-24
在线时间
44 小时
发表于 2022-11-15 17:54:22 | 显示全部楼层 |阅读模式
1金钱
买了两块开发板,一块STM32F103MINI,一块STM32F767阿波罗
都不是FSMC寄存器版本控制LCD的,我想把手上一块407板用FSMC寄存器驱动
LCD。

最佳答案

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

767用FMC代替FSMC了 照你这么说429和767都没有FSMC
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-11-15 17:54:23 | 显示全部楼层
uint 发表于 2022-11-15 20:28
767不是FSMC驱动的,谢谢

767用FMC代替FSMC了 照你这么说429和767都没有FSMC
回复

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-11-24
在线时间
44 小时
 楼主| 发表于 2022-11-15 18:19:54 | 显示全部楼层
我要把这些函数全部改成寄存器版本,
对照芯片引脚,把端口和程序一一对应出来,
慢慢改成寄存器驱动,LCD控制器是ILI9327。

void TFTLCD_GPIO_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;//声明一个结构体,名字是GPIO_InitStructure,结构体原型由GPIO_InitTypeDef 确定引脚
//模式
//端口速率
//输出类型
//上下拉选择

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD|RCC_AHB1Periph_GPIOE|
                            RCC_AHB1Periph_GPIOF|RCC_AHB1Periph_GPIOG, ENABLE);//使能PD,PE,PF,PG时钟  


    GPIO_PinAFConfig(GPIOD,GPIO_PinSource14,GPIO_AF_FSMC);  //            FSMC_D0-FSMC_D15
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource15,GPIO_AF_FSMC);  //
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource0,GPIO_AF_FSMC);   //
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource1,GPIO_AF_FSMC);   //
    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_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_PinSource4,GPIO_AF_FSMC);  //FSMC_NOE
    GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_FSMC);  //FSMC_NWE
    GPIO_PinAFConfig(GPIOF,GPIO_PinSource12,GPIO_AF_FSMC);//FSMC_A6
    GPIO_PinAFConfig(GPIOG,GPIO_PinSource12,GPIO_AF_FSMC);//FSMC_NE4


    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_4  //FMSC D2+D3+ FMSC NOE
                                  | GPIO_Pin_5 | GPIO_Pin_8 | GPIO_Pin_9//FMSC NWE D13+D14
                                  | GPIO_Pin_10 | GPIO_Pin_14| GPIO_Pin_15;//PD0,1,4,5,8,9,10,14,15 D15+D0+D1
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOD, &GPIO_InitStructure);//初始化  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7 | GPIO_Pin_8 | GPIO_Pin_9 //FMSC D4+D5+D6
                                  | GPIO_Pin_10 | GPIO_Pin_11 | GPIO_Pin_12//FMSC D7+D8+D9
                                  | GPIO_Pin_13 | GPIO_Pin_14| GPIO_Pin_15;//PE7~15      FMSC D10+D11+D12
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PF12,FSMC_A6
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOF, &GPIO_InitStructure);//初始化  

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12;//PG12,FSMC_NE4
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用输出
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
    GPIO_Init(GPIOG, &GPIO_InitStructure);//初始化

}


void TFTLCD_FSMC_Init(void)
{
    FSMC_NORSRAMInitTypeDef  FSMC_NORSRAMInitStructure;
    FSMC_NORSRAMTimingInitTypeDef  FSMC_ReadNORSRAMTiming;
    FSMC_NORSRAMTimingInitTypeDef  FSMC_WriteNORSRAMTiming;

    RCC_AHB3PeriphClockCmd(RCC_AHB3Periph_FSMC,ENABLE);//使能FSMC时钟


    FSMC_ReadNORSRAMTiming.FSMC_AddressSetupTime = 0X01;     //地址建立时间(ADDSET)为2个HCLK 1/168M=6ns*2=12ns   
    FSMC_ReadNORSRAMTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(ADDHLD)模式A未用到   
    FSMC_ReadNORSRAMTiming.FSMC_DataSetupTime = 0x0f;            //数据保存时间为16个HCLK    因为液晶驱动IC的读数据的时候,速度不能太快
    FSMC_ReadNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
    FSMC_ReadNORSRAMTiming.FSMC_CLKDivision = 0x00;
    FSMC_ReadNORSRAMTiming.FSMC_DataLatency = 0x00;
    FSMC_ReadNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A

#ifdef TFTLCD_ILI9488
    FSMC_WriteNORSRAMTiming.FSMC_AddressSetupTime =0x03;          //地址建立时间(ADDSET)为1个HCLK  
    FSMC_WriteNORSRAMTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(A        
    FSMC_WriteNORSRAMTiming.FSMC_DataSetupTime = 0x08;         //数据保存时间为6ns*9个HCLK=54ns
    FSMC_WriteNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_CLKDivision = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_DataLatency = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A
#endif

#ifdef TFTLCD_NT35510
    FSMC_WriteNORSRAMTiming.FSMC_AddressSetupTime =0x03;          //地址建立时间(ADDSET)为1个HCLK  
    FSMC_WriteNORSRAMTiming.FSMC_AddressHoldTime = 0x00;     //地址保持时间(A        
    FSMC_WriteNORSRAMTiming.FSMC_DataSetupTime = 0x02;         //数据保存时间为6ns*9个HCLK=54ns
    FSMC_WriteNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_CLKDivision = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_DataLatency = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A
#endif

#ifdef    TFTLCD_HX8352C
    FSMC_WriteNORSRAMTiming.FSMC_AddressSetupTime =0x10;          //地址建立时间(ADDSET)为1个HCLK  
    FSMC_WriteNORSRAMTiming.FSMC_AddressHoldTime = 0x10;     //地址保持时间(A        
    FSMC_WriteNORSRAMTiming.FSMC_DataSetupTime = 0x18;         //数据保存时间为6ns*9个HCLK=54ns
    FSMC_WriteNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_CLKDivision = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_DataLatency = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A
#endif


#ifdef    TFTLCD_ILI9327
    FSMC_WriteNORSRAMTiming.FSMC_AddressSetupTime =0x10;          //地址建立时间(ADDSET)为1个HCLK  
    FSMC_WriteNORSRAMTiming.FSMC_AddressHoldTime = 0x10;     //地址保持时间(A        
    FSMC_WriteNORSRAMTiming.FSMC_DataSetupTime = 0x18;         //数据保存时间为6ns*9个HCLK=54ns
    FSMC_WriteNORSRAMTiming.FSMC_BusTurnAroundDuration = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_CLKDivision = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_DataLatency = 0x00;
    FSMC_WriteNORSRAMTiming.FSMC_AccessMode = FSMC_AccessMode_A;     //模式A
#endif

    FSMC_NORSRAMInitStructure.FSMC_Bank = FSMC_Bank1_NORSRAM4;//  这里我们使用NE4 ,也就对应BTCR[6],[7]。
    FSMC_NORSRAMInitStructure.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; // 不复用数据地址
    FSMC_NORSRAMInitStructure.FSMC_MemoryType =FSMC_MemoryType_SRAM;// FSMC_MemoryType_SRAM;  //SRAM   
    FSMC_NORSRAMInitStructure.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b;//存储器数据宽度为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 = &FSMC_ReadNORSRAMTiming; //读写时序
    FSMC_NORSRAMInitStructure.FSMC_WriteTimingStruct = &FSMC_WriteNORSRAMTiming;  //写时序

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

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

}
————————————————


回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-11-15 19:31:26 | 显示全部楼层
mini板没有FSMC吧 F767没用过 不过资料A盘里不是有TFTLCD的寄存器例程吗?
回复

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-11-24
在线时间
44 小时
 楼主| 发表于 2022-11-15 19:57:49 | 显示全部楼层
下载了407 429例程都不是FSMC寄存器操作,手头有一块407触摸屏
回复

使用道具 举报

16

主题

426

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2676
金钱
2676
注册时间
2018-11-8
在线时间
431 小时
发表于 2022-11-15 20:04:34 | 显示全部楼层
这不就是吗 F767的-。-

实验13 TFTLCD(MCU屏)实验.rar

198.47 KB, 下载次数: 3

回复

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-11-24
在线时间
44 小时
 楼主| 发表于 2022-11-15 20:28:29 | 显示全部楼层
babyrabbit 发表于 2022-11-15 20:04
这不就是吗 F767的-。-

767不是FSMC驱动的,谢谢
回复

使用道具 举报

6

主题

42

帖子

0

精华

初级会员

Rank: 2

积分
123
金钱
123
注册时间
2019-11-24
在线时间
44 小时
 楼主| 发表于 2022-11-15 21:41:28 | 显示全部楼层
babyrabbit 发表于 2022-11-15 20:31
767用FMC代替FSMC了 照你这么说429和767都没有FSMC

#ifndef __LCD_H
#define __LCD_H               
#include "sys.h"         
#include "stdlib.h"
//////////////////////////////////////////////////////////////////////////////////         
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//ALIENTEK STM32开发板
//2.8寸/3.5寸/4.3寸/7寸 TFT液晶驱动          
//支持驱动IC型号包括:ILI9341/NT35310/NT35510/SSD1963等                    
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
//创建日期:2016/7/12
//版本:V1.0
//版权所有,盗版必究。
//Copyright(C) 广州市星翼电子科技有限公司 2014-2024
//All rights reserved         
//////////////////////////////////////////////////////////////////////////////////         

//LCD重要参数集
typedef struct  
{                          
        u16 width;                        //LCD 宽度
        u16 height;                        //LCD 高度
        u16 id;                                //LCD ID
        u8  dir;                        //横屏还是竖屏控制:0,竖屏;1,横屏。       
        u16        wramcmd;                //开始写gram指令
        u16 setxcmd;                //设置x坐标指令
        u16 setycmd;                //设置y坐标指令
}_lcd_dev;           

//LCD参数
extern _lcd_dev lcddev;        //管理LCD重要参数
//LCD的画笔颜色和背景色          
extern u32  POINT_COLOR;//默认红色   
extern u32  BACK_COLOR; //背景颜色.默认为白色


//////////////////////////////////////////////////////////////////////////////////         
//-----------------MCU屏 LCD端口定义----------------
#define LCD_LED(x)                GPIO_Pin_Set(GPIOB,PIN5,x)                //LCD背光        PB5         

//LCD地址结构体
typedef struct
{
        vu16 LCD_REG;
        vu16 LCD_RAM;
} LCD_TypeDef;
//使用NOR/SRAM的 Bank1.sector1,地址位HADDR[27,26]=00 A18作为数据命令区分线
//注意设置时STM32内部会右移一位对其!                              
#define LCD_BASE        ((u32)(0x60000000 | 0x0007FFFE))
#define LCD             ((LCD_TypeDef *) LCD_BASE)
//////////////////////////////////////////////////////////////////////////////////
         
//扫描方向定义
#define L2R_U2D  0                 //从左到右,从上到下
#define L2R_D2U  1                 //从左到右,从下到上
#define R2L_U2D  2                 //从右到左,从上到下
#define R2L_D2U  3                 //从右到左,从下到上

#define U2D_L2R  4                 //从上到下,从左到右
#define U2D_R2L  5                 //从上到下,从右到左
#define D2U_L2R  6                 //从下到上,从左到右
#define D2U_R2L  7                //从下到上,从右到左         

#define DFT_SCAN_DIR  L2R_U2D  //默认的扫描方向

//画笔颜色
#define WHITE                  0xFFFF
#define BLACK                  0x0000          
#define BLUE                  0x001F  
#define BRED             0XF81F
#define GRED                          0XFFE0
#define GBLUE                         0X07FF
#define RED                    0xF800
#define MAGENTA                0xF81F
#define GREEN                  0x07E0
#define CYAN                   0x7FFF
#define YELLOW                 0xFFE0
#define BROWN                          0XBC40 //棕色
#define BRRED                          0XFC07 //棕红色
#define GRAY                           0X8430 //灰色
//GUI颜色

#define DARKBLUE               0X01CF        //深蓝色
#define LIGHTBLUE               0X7D7C        //浅蓝色  
#define GRAYBLUE                0X5458 //灰蓝色
//以上三色为PANEL的颜色

#define LIGHTGREEN              0X841F //浅绿色
//#define LIGHTGRAY        0XEF5B //浅灰色(PANNEL)
#define LGRAY                          0XC618 //浅灰色(PANNEL),窗体背景色

#define LGRAYBLUE        0XA651 //浅灰蓝色(中间层颜色)
#define LBBLUE           0X2B12 //浅棕蓝色(选择条目的反色)
                                                                                                                                      
void LCD_Init(void);                                                                                                                   //初始化
void LCD_DisplayOn(void);                                                                                                        //开显示
void LCD_DisplayOff(void);                                                                                                        //关显示
void LCD_Clear(u32 Color);                                                                                                         //清屏
void LCD_SetCursor(u16 Xpos, u16 Ypos);                                                                                //设置光标
void LCD_DrawPoint(u16 x,u16 y);                                                                                        //画点
void LCD_Fast_DrawPoint(u16 x,u16 y,u32 color);                                                                //快速画点
u32  LCD_ReadPoint(u16 x,u16 y);                                                                                         //读点
void LCD_Draw_Circle(u16 x0,u16 y0,u8 r);                                                                         //画圆
void LCD_DrawLine(u16 x1, u16 y1, u16 x2, u16 y2);                                                        //画线
void LCD_DrawRectangle(u16 x1, u16 y1, u16 x2, u16 y2);                                                   //画矩形
void LCD_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u32 color);                                                   //填充单色
void LCD_Color_Fill(u16 sx,u16 sy,u16 ex,u16 ey,u16 *color);                                //填充指定颜色
void LCD_ShowChar(u16 x,u16 y,u8 num,u8 size,u8 mode);                                                //显示一个字符
void LCD_ShowNum(u16 x,u16 y,u32 num,u8 len,u8 size);                                                  //显示一个数字
void LCD_ShowxNum(u16 x,u16 y,u32 num,u8 len,u8 size,u8 mode);                                //显示 数字
void LCD_ShowString(u16 x,u16 y,u16 width,u16 height,u8 size,u8 *p);                //显示一个字符串,12/16字体

void LCD_WriteReg(u16 LCD_Reg, u16 LCD_RegValue);
u16 LCD_ReadReg(u16 LCD_Reg);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
void LCD_SSD_BackLightSet(u8 pwm);                                                        //SSD1963 背光控制
void LCD_Scan_Dir(u8 dir);                                                                        //设置屏扫描方向
void LCD_Display_Dir(u8 dir);                                                                //设置屏幕显示方向
void LCD_Set_Window(u16 sx,u16 sy,u16 width,u16 height);        //设置窗口                                                                                                                                                                                                                                                       
//LCD分辨率设置
#define SSD_HOR_RESOLUTION                800                //LCD水平分辨率
#define SSD_VER_RESOLUTION                480                //LCD垂直分辨率
//LCD驱动参数设置
#define SSD_HOR_PULSE_WIDTH                1                //水平脉宽
#define SSD_HOR_BACK_PORCH                46                //水平前廊
#define SSD_HOR_FRONT_PORCH                210                //水平后廊

#define SSD_VER_PULSE_WIDTH                1                //垂直脉宽
#define SSD_VER_BACK_PORCH                23                //垂直前廊
#define SSD_VER_FRONT_PORCH                22                //垂直前廊
//如下几个参数,自动计算
#define SSD_HT        (SSD_HOR_RESOLUTION+SSD_HOR_BACK_PORCH+SSD_HOR_FRONT_PORCH)
#define SSD_HPS        (SSD_HOR_BACK_PORCH)
#define SSD_VT         (SSD_VER_RESOLUTION+SSD_VER_BACK_PORCH+SSD_VER_FRONT_PORCH)
#define SSD_VPS (SSD_VER_BACK_PORCH)

#endif  
         

回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 22:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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