打印
[开发板]

CW32L010开发板尝鲜体验+驱动TFT屏幕ST7735S

[复制链接]
51|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
第一句:认真看原理图
SPI的使用其实很简单,但是驱动SPI接口的TFT还需要几个IO配合,RST、CS、DC
根据原理图选择合适的引脚使用,至关重要
#define ST7735_RST_Pin       GPIO_PIN_5
#define ST7735_RST_GPIO_Port CW_GPIOB

#define ST7735_DC_Pin        GPIO_PIN_6
#define ST7735_DC_GPIO_Port  CW_GPIOB

#define ST7735_CS_Pin        GPIO_PIN_2
#define ST7735_CS_GPIO_Port  CW_GPIOA

#define ST7735_SCK_Pin         GPIO_PIN_5
#define ST7735_SCK_GPIO_Port   CW_GPIOA

#define ST7735_MOSI_Pin        GPIO_PIN_4
#define ST7735_MOSI_GPIO_Port  CW_GPIOA

#define ST7735_SPI  CW_SPI
然后就可以愉快的使用这些映射合适引脚的宏和外设了
 GPIO_InitTypeDef GPIO_InitStructure;        
                //推挽输出
        GPIO_InitStructure.Pins = ST7735_CS_Pin;
        GPIO_InitStructure.IT = GPIO_IT_NONE;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);       

        GPIO_InitStructure.Pins = ST7735_DC_Pin;
        GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);       

        GPIO_InitStructure.Pins = ST7735_RST_Pin;
        GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);       
       
        GPIO_InitStructure.Pins = ST7735_SCK_Pin;
        GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
       
        GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
        GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);

        PA05_AFx_SPI1SCK();
        PA04_AFx_SPI1MOSI();
        SYSCTRL_APBPeriphClk_Enable1(SYSCTRL_APB1_PERIPH_SPI, ENABLE);
       
        SPI_InitTypeDef SPI_InitStructure;
        SPI_InitStructure.SPI_Direction = SPI_Direction_1Line_TxOnly;         //单工只发
        SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                         // 主机模式
        SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                     // 帧数据长度为8bit
        SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                           // 时钟空闲电平为高
        SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                          // 第2个边沿采样
        SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                             // 片选信号由SSI寄存器控制
        SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4;    // 波特率为PCLK的4分频
        SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                    // 最高有效位 MSB 收发在前
        SPI_InitStructure.SPI_Speed = SPI_Speed_Low;                          // 低速SPI
        SPI_Init(ST7735_SPI, &SPI_InitStructure);
        SPI_Cmd(ST7735_SPI, ENABLE);
接下来就可以调用库函数执行相关的数据传输指令了
void ST7735_delay(uint8_t i)
{
        delay1ms(i);
}

void ST7735_SPI_SendByte(uint8_t byte)
{
//        判断是否可以继续发送放在之后判断可以避免CS拉高后还没发送结束。可以确保每一次发送都是成功的。
        SPI_SendData(ST7735_SPI, byte);
        while(SPI_GetFlagStatus(ST7735_SPI, SPI_FLAG_TXE) == RESET);
}

void ST7735_SPI_RST_SetLow(void)
{
        GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_RST_SetHigh(void)
{
        GPIO_WritePin(ST7735_RST_GPIO_Port,ST7735_RST_Pin,GPIO_Pin_SET);
}

void ST7735_SPI_CS_SetLow(void)
{
        GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_CS_SetHigh(void)
{
        GPIO_WritePin(ST7735_CS_GPIO_Port,ST7735_CS_Pin,GPIO_Pin_SET);
}

void ST7735_SPI_DC_SetLow(void)
{
        GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_RESET);
}
void ST7735_SPI_DC_SetHigh(void)
{
        GPIO_WritePin(ST7735_DC_GPIO_Port,ST7735_DC_Pin,GPIO_Pin_SET);
}

/*
以下函数不用修改,以下函数调用上面的几个基础函数完成ST7735接口的操作。
*/

void ST7735_Reset(void)
{
        ST7735_SPI_RST_SetLow();
        ST7735_delay(100);
        ST7735_SPI_RST_SetHigh();
        ST7735_delay(100);
}

void ST7735_WriteCommand(uint8_t cmd)
{
        ST7735_SPI_CS_SetLow();
        ST7735_SPI_DC_SetLow();       
        ST7735_SPI_SendByte(cmd);
        ST7735_SPI_CS_SetHigh();
}

void ST7735_WriteByte(uint8_t data)
{
        ST7735_SPI_CS_SetLow();
        ST7735_SPI_DC_SetHigh();
        ST7735_SPI_SendByte(data);
        ST7735_SPI_CS_SetHigh();
}

void ST7735_WriteData(uint8_t *data, size_t data_size)
{
        ST7735_SPI_CS_SetLow();
        ST7735_SPI_DC_SetHigh();
        for(int i=0;i<data_size;i++) ST7735_SPI_SendByte(*(data+i));
        ST7735_SPI_CS_SetHigh();
}
在主函数完成代码
int32_t main(void)
{       

    SYSCTRL_HSI_Enable(SYSCTRL_HSIOSC_DIV12);   
    __SYSCTRL_GPIOA_CLK_ENABLE();
    __SYSCTRL_GPIOB_CLK_ENABLE();         
       
        GPIO_InitTypeDef GPIO_InitStructure;       
                //推挽输出
        GPIO_InitStructure.IT = GPIO_IT_NONE;
        GPIO_InitStructure.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStructure.Pins = GPIO_PIN_2;
        GPIO_Init(CW_GPIOB, &GPIO_InitStructure);
       
       
        GPIO_InitStructure.Pins = ST7735_CS_Pin;
        GPIO_Init(ST7735_CS_GPIO_Port, &GPIO_InitStructure);       

        GPIO_InitStructure.Pins = ST7735_DC_Pin;
        GPIO_Init(ST7735_DC_GPIO_Port, &GPIO_InitStructure);       

        GPIO_InitStructure.Pins = ST7735_RST_Pin;
        GPIO_Init(ST7735_RST_GPIO_Port, &GPIO_InitStructure);       
       
        GPIO_InitStructure.Pins = ST7735_SCK_Pin;
        GPIO_Init(ST7735_SCK_GPIO_Port, &GPIO_InitStructure);
       
        GPIO_InitStructure.Pins = ST7735_MOSI_Pin;
        GPIO_Init(ST7735_MOSI_GPIO_Port, &GPIO_InitStructure);
       
        SPI_Configuration();
       
        ST7735_Init();
        ST7735_FillScreen(ST7735_BLACK);
        ST7735_DrawRectangle(0,0,10,5,ST7735_YELLOW);
        ST7735_DrawRectangle(15,5,10,20,ST7735_BLUE);       
        ST7735_DrawRectangle(30,25,10,10,ST7735_RED);       
        ST7735_DrawString(0,35,"Hello",ST7735_GREEN,ST7735_BLACK,&Font_11x18);
        ST7735_DrawString(0,55,"Hello",ST7735_MAGENTA,ST7735_BLACK,&Font_7x10);

        while(1)
        {
                GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_RESET);               
                Delay(0xFFFF);

                GPIO_WritePin(CW_GPIOB,GPIO_PIN_2,GPIO_Pin_SET);               
                Delay(0xFFFF);
        }


}
编译烧录,点亮屏幕

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:西安公路研究院南京院
简介:主要工作从事监控网络与通信网络设计,以及从事基于嵌入式的通信与控制设备研发。擅长单片机嵌入式系统物联网设备开发,音频功放电路开发。

1957

主题

15903

帖子

207

粉丝