STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)

阅读: 评论:0

STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)

STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)

         最近正在进行一个项目的开发,屏幕使用的是4.58寸长条屏幕,驱动是ST7701,该屏幕接口有点特殊,既有SPI接口,又有RGB接口,说实话刚拿到这款屏幕,我竟无从下手,问询了厂家技术支持,了解到这个屏幕需要先用SPI进行ST7701的配置,再通过RGB数据线写像素点。

                                                            HYS-4.58UT4S2P001 屏幕的实物图以及接口定义如上图所示,接下来就进行电路设计了,使用主控芯片型号是STM32103VET6(这个芯片有些啥功能就不介绍了,大家可以下载datasheet自行查看)主要是支持FSMC接口,引脚足够多,屏幕控制器使用SSD1963,设计之初想的使用8080模式,RGB565来实现屏幕的驱动。 再提一嘴,这个屏幕背光供电是12V,整个硬件系统是3.3V,SSD1963某些引脚需要1.2V供电,我这边引入了两路电,一路是5V,通过两个LDO分别转3.3V和1.2V,另一路12V输入仅供给屏幕背光,这样整套系统的“血管”就建立完成了。 接下来进行电路的设计,SSD1963部分原理图如下,这个芯片好是好,就是电源引脚太多了,画原理图的时候还好一点,等到了画PCB的时候,真的会原地裂开,SSD1963上半部分引脚连到了主控芯片,下半部分连到了屏幕,所以在画PCB布局的时候,SSD1963介于主控芯片和屏幕之间再好不过了。

我也是第一次在CSDN上发表自己的文章,插入的图片不知道是否可以单击放大,先发表试试看,如果不能放大的话我会再发一篇文章,上图是主控芯片及SSD1963的引脚连接图,大家可以按照我这样来接线,注意一下SSD1963第128引脚,该引脚功能是CONF,通过电平高低来确定SSD1963工作在哪种模式( 6800 or 8080 )数据手册给出CONF引脚接VDDIO也就是3.3V可以配置为8080工作模式,因此R10电阻不焊接,仅焊接R2即可。SSD1963数据命令引脚,第122号引脚连接到了主控芯片FSMC_A16,了解过FSMC大家可以知道,我这套连接方式使用了NE1,基地址为0x60000000,通过A16来确定命令还是数据地址 //    地址线接A16  其中高4位固定为6
//    0110  0000  0000  0001       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000 又因为涉及对齐问题,需要左移一位
//    当A17为1时表示数据读写地址  当A17为0时表示指令读写地址
//    0110  0000  0000  0010       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000 因此我们可以在头文件中定义数据读写地址和指令读写地址 #define  SSD1963_DATA_RW_ADDR      ( ( uint32_t ) 0x60020000 )  //数据读写地址
#define  SSD1963_CMD_W_ADDR         ( ( uint32_t ) 0x60000000 )  //指令读写地址 在C文件中封装具体读写函数

//SSD1963写命令
void SSD1963_Write_Cmd ( uint16_t usCmd )
{
    * ( __IO uint16_t * ) ( SSD1963_CMD_W_ADDR ) = usCmd;

}
//SSD1963写数据
void SSD1963_Write_Data ( uint16_t usData )
{
    * ( __IO uint16_t * ) ( SSD1963_DATA_RW_ADDR ) = usData;
}

到这里主机给SSD1963写命令及写数据就实现了,主要就是地址对齐这里会有点问题,接下来在附上FSMC的IO初始化及FSMC初始化代码(完整版)

/******************配置FSMC有关的宏定义-开头****************************/
//地址线接A16  其中高4位固定为6
//   当A17为1时表示数据读写地址  当A17为0时表示指令读写地址
//    0110  0000  0000  0001       0110  0000  0000  0000
//    0000  0000  0000  0000       0000  0000  0000  0000
//涉及对齐 须左移一位
#define  SSD1963_DATA_RW_ADDR      ( ( uint32_t ) 0x60020000 )  //数据读写地址
#define  SSD1963_CMD_W_ADDR         ( ( uint32_t ) 0x60000000 )  //指令读写地址

/*A地址信号线*/    
#define SSD1963FSMC_A16_GPIO_PORT        GPIOD
#define SSD1963FSMC_A16_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_A16_GPIO_PIN            GPIO_Pin_11

/*D 数据信号线*/
#define SSD1963FSMC_D0_GPIO_PORT          GPIOD
#define SSD1963FSMC_D0_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D0_GPIO_PIN              GPIO_Pin_14

#define SSD1963FSMC_D1_GPIO_PORT          GPIOD
#define SSD1963FSMC_D1_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D1_GPIO_PIN              GPIO_Pin_15

#define SSD1963FSMC_D2_GPIO_PORT          GPIOD
#define SSD1963FSMC_D2_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D2_GPIO_PIN              GPIO_Pin_0

#define SSD1963FSMC_D3_GPIO_PORT          GPIOD
#define SSD1963FSMC_D3_GPIO_CLK             RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D3_GPIO_PIN              GPIO_Pin_1

#define SSD1963FSMC_D4_GPIO_PORT          GPIOE
#define SSD1963FSMC_D4_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D4_GPIO_PIN              GPIO_Pin_7

#define SSD1963FSMC_D5_GPIO_PORT          GPIOE
#define SSD1963FSMC_D5_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D5_GPIO_PIN              GPIO_Pin_8

#define SSD1963FSMC_D6_GPIO_PORT          GPIOE
#define SSD1963FSMC_D6_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D6_GPIO_PIN              GPIO_Pin_9

#define SSD1963FSMC_D7_GPIO_PORT          GPIOE
#define SSD1963FSMC_D7_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D7_GPIO_PIN              GPIO_Pin_10

#define SSD1963FSMC_D8_GPIO_PORT          GPIOE
#define SSD1963FSMC_D8_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D8_GPIO_PIN              GPIO_Pin_11

#define SSD1963FSMC_D9_GPIO_PORT          GPIOE
#define SSD1963FSMC_D9_GPIO_CLK             RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D9_GPIO_PIN              GPIO_Pin_12

#define SSD1963FSMC_D10_GPIO_PORT        GPIOE
#define SSD1963FSMC_D10_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D10_GPIO_PIN            GPIO_Pin_13

#define SSD1963FSMC_D11_GPIO_PORT        GPIOE
#define SSD1963FSMC_D11_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D11_GPIO_PIN            GPIO_Pin_14

#define SSD1963FSMC_D12_GPIO_PORT        GPIOE
#define SSD1963FSMC_D12_GPIO_CLK           RCC_APB2Periph_GPIOE
#define SSD1963FSMC_D12_GPIO_PIN            GPIO_Pin_15

#define SSD1963FSMC_D13_GPIO_PORT        GPIOD
#define SSD1963FSMC_D13_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D13_GPIO_PIN            GPIO_Pin_8

#define SSD1963FSMC_D14_GPIO_PORT        GPIOD
#define SSD1963FSMC_D14_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D14_GPIO_PIN            GPIO_Pin_9

#define SSD1963FSMC_D15_GPIO_PORT        GPIOD
#define SSD1963FSMC_D15_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_D15_GPIO_PIN            GPIO_Pin_10

/*控制信号线*/  
/*CS片选*/
#define SSD1963FSMC_CS_GPIO_PORT         GPIOD
#define SSD1963FSMC_CS_GPIO_CLK            RCC_APB2Periph_GPIOD
#define SSD1963FSMC_CS_GPIO_PIN             GPIO_Pin_7

/*WE写使能*/
#define SSD1963FSMC_WE_GPIO_PORT        GPIOD
#define SSD1963FSMC_WE_GPIO_CLK           RCC_APB2Periph_GPIOD
#define SSD1963FSMC_WE_GPIO_PIN            GPIO_Pin_5

/*OE读使能*/
#define SSD1963FSMC_OE_GPIO_PORT         GPIOD
#define SSD1963FSMC_OE_GPIO_CLK            RCC_APB2Periph_GPIOD
#define SSD1963FSMC_OE_GPIO_PIN             GPIO_Pin_4


/*FSMC_NWAIT*/
#define SSD1963FSMC_NWAIT_GPIO_PORT     GPIOD
#define SSD1963FSMC_NWAIT_GPIO_CLK        RCC_APB2Periph_GPIOD
#define SSD1963FSMC_NWAIT_GPIO_PIN         GPIO_Pin_6

/*FSMC_RESET*/
#define SSD1963FSMC_RESET_GPIO_PORT     GPIOD
#define SSD1963FSMC_RESET_GPIO_CLK        RCC_APB2Periph_GPIOD
#define SSD1963FSMC_RESET_GPIO_PIN         GPIO_Pin_3


//RES设置高低
#define   SSD1963FSMC_RES_LOW      GPIO_ResetBits( SSD1963FSMC_RESET_GPIO_PORT, SSD1963FSMC_RESET_GPIO_PIN )
#define   SSD1963FSMC_RES_HIGH     GPIO_SetBits( SSD1963FSMC_RESET_GPIO_PORT, SSD1963FSMC_RESET_GPIO_PIN )
/******************配置FSMC有关的宏定义-结尾****************************/

/*******************FSMC初始化相关函数-开头******************/
//FSMC的GPIO初始化
void FSMC_GPIO_Init(void)
{
    GPIO_InitTypeDef  GPIO_InitStructure;
 
    /* 使能SRAM相关的GPIO时钟 */
    RCC_APB2PeriphClockCmd(SSD1963FSMC_A16_GPIO_CLK|
         SSD1963FSMC_D0_GPIO_CLK | SSD1963FSMC_D1_GPIO_CLK | SSD1963FSMC_D2_GPIO_CLK | 
         SSD1963FSMC_D3_GPIO_CLK | SSD1963FSMC_D4_GPIO_CLK | SSD1963FSMC_D5_GPIO_CLK |
         SSD1963FSMC_D6_GPIO_CLK | SSD1963FSMC_D7_GPIO_CLK | SSD1963FSMC_D8_GPIO_CLK |
         SSD1963FSMC_D9_GPIO_CLK | SSD1963FSMC_D10_GPIO_CLK| SSD1963FSMC_D11_GPIO_CLK|
         SSD1963FSMC_D12_GPIO_CLK| SSD1963FSMC_D13_GPIO_CLK| SSD1963FSMC_D14_GPIO_CLK|
         SSD1963FSMC_D15_GPIO_CLK|


         /*控制信号线*/
         SSD1963FSMC_CS_GPIO_CLK | SSD1963FSMC_WE_GPIO_CLK | SSD1963FSMC_OE_GPIO_CLK |
         SSD1963FSMC_NWAIT_GPIO_CLK | SSD1963FSMC_RESET_GPIO_CLK, ENABLE);


     /*-- GPIO 配置 -----------------------------------------------------*/

    /* 通用 GPIO 配置 */
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;       //配置为推挽复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;     

    /*A地址信号线 针对引脚配置*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_A16_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_A16_GPIO_PORT, &GPIO_InitStructure);

    /*DQ数据信号线 针对引脚配置*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D0_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D0_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D1_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D1_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D2_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D2_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D3_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D3_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D4_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D4_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D5_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D5_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D6_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D6_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D7_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D7_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D8_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D8_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D9_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D9_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D10_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D10_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D11_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D11_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D12_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D12_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D13_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D13_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D14_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D14_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_D15_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_D15_GPIO_PORT, &GPIO_InitStructure);

    /*控制信号线*/
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_CS_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_CS_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_WE_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_WE_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_OE_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_OE_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;    //NWAIT配置为浮空输入
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_NWAIT_GPIO_PIN;
    GPIO_Init(SSD1963FSMC_NWAIT_GPIO_PORT, &GPIO_InitStructure);
    
    GPIO_InitStructure.GPIO_Pin = SSD1963FSMC_RESET_GPIO_PIN;
    GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP;              //配置为推挽复用功能
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(SSD1963FSMC_RESET_GPIO_PORT, &GPIO_InitStructure);
}

//初始化FSMC模式      时序结构体作为一个指针写进初始化结构体中
static void FSMC_Mode_Config(void)
{
    FSMC_NORSRAMTimingInitTypeDef  ReadTimInitStruct;
    FSMC_NORSRAMInitTypeDef        SRAMInitStruct;

    //使能AHB时钟  FSMC
    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_FSMC,ENABLE);
    
    ReadTimInitStruct.FSMC_AccessMode = FSMC_AccessMode_B;
    ReadTimInitStruct.FSMC_AddressHoldTime = 0x00;
    ReadTimInitStruct.FSMC_AddressSetupTime = 0x01;
    ReadTimInitStruct.FSMC_BusTurnAroundDuration = 0x00;
    ReadTimInitStruct.FSMC_CLKDivision = 0x00;
    ReadTimInitStruct.FSMC_DataLatency = 0x00;
    ReadTimInitStruct.FSMC_DataSetupTime = 0x04;
    
    //使用的结构体
    SRAMInitStruct.FSMC_Bank = FSMC_Bank1_NORSRAM1;         //设置要控制的BANK区域
    SRAMInitStruct.FSMC_MemoryDataWidth = FSMC_MemoryDataWidth_16b; //设置数据宽度
    SRAMInitStruct.FSMC_MemoryType = FSMC_MemoryType_NOR;          //设置存储器的类型
    SRAMInitStruct.FSMC_WriteOperation = FSMC_WriteOperation_Enable;   //设置是否写使能
    
    //SSD1963未使用
    SRAMInitStruct.FSMC_BurstAccessMode = FSMC_BurstAccessMode_Disable;//突发访问模式
    SRAMInitStruct.FSMC_AsynchronousWait = FSMC_AsynchronousWait_Disable; 
    SRAMInitStruct.FSMC_DataAddressMux = FSMC_DataAddressMux_Disable; //数据地址复用
    SRAMInitStruct.FSMC_WaitSignal = FSMC_WaitSignal_Disable;   //是否使能等待状态插入
    SRAMInitStruct.FSMC_WaitSignalActive = FSMC_WaitSignalActive_BeforeWaitState; 
    SRAMInitStruct.FSMC_WaitSignalPolarity = FSMC_WaitSignalPolarity_Low;  //等待信号极性
    SRAMInitStruct.FSMC_WrapMode = FSMC_WrapMode_Disable; //是否支持对齐的突发模式
    SRAMInitStruct.FSMC_WriteBurst = FSMC_WriteBurst_Disable;      //是否使能写突发操作
    SRAMInitStruct.FSMC_ExtendedMode = FSMC_ExtendedMode_Disable;  //是否使能拓展模式
    
    //读写时序结构体
    SRAMInitStruct.FSMC_ReadWriteTimingStruct = &ReadTimInitStruct;
    SRAMInitStruct.FSMC_WriteTimingStruct = &ReadTimInitStruct;
    
    //配置写入到寄存器
    FSMC_NORSRAMInit(&SRAMInitStruct);
    //使能FSMC
    FSMC_NORSRAMCmd(FSMC_Bank1_NORSRAM1,ENABLE);
}
//FSMC初始化
void FSMC_Init(void)
{
    //FSMC的GPIO初始化
    FSMC_GPIO_Init();
    //FSMC的模式初始化
    FSMC_Mode_Config();
    
    SSD1963FSMC_RES_LOW;
    Delay_1Ms(10);
    SSD1963FSMC_RES_HIGH;
}
/*******************FSMC初始化相关函数-结尾******************/

本文发布于:2024-02-02 20:12:22,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170687594446166.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:屏幕   文章   ENWIM   FreeRTOS   TFT
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23