本文主要是介绍STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
最近正在进行一个项目的开发,屏幕使用的是4.58寸长条屏幕,驱动是ST7701,该屏幕接口有点特殊,既有SPI接口,又有RGB接口,说实话刚拿到这款屏幕,我竟无从下手,问询了厂家技术支持,了解到这个屏幕需要先用SPI进行ST7701的配置,再通过RGB数据线写像素点。
// 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_CMD_W_ADDR ( ( uint32_t ) 0x60000000 ) //指令读写地址
//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;
}
/******************配置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初始化相关函数-结尾******************/
这篇关于STM32F1+SSD1963+4.58寸TFT屏幕移植FreeRTOS+ENWIM(已移植完,抽空补文章)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!