打印
[AT32L021]

【AT-START-L021测评】+硬件SPI驱动ST7735S高清0.96寸IPS屏

[复制链接]
119|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaoyang9992006|  楼主 | 2024-11-26 12:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
第一步,认真阅读原理图,确认哪些引脚被使用了,哪些还可以使用。
经过阅读后,确认以下引脚和SPI片上外设,作为本次驱动ST7735的引脚
#define ST7735_RST_Pin       GPIO_PINS_3 
#define ST7735_RST_GPIO_Port GPIOA

#define ST7735_DC_Pin        GPIO_PINS_1
#define ST7735_DC_GPIO_Port  GPIOA

#define ST7735_CS_Pin        GPIO_PINS_2
#define ST7735_CS_GPIO_Port  GPIOA

#define ST7735_SCK_Pin         GPIO_PINS_5
#define ST7735_SCK_GPIO_Port   GPIOA

#define ST7735_MOSI_Pin        GPIO_PINS_7
#define ST7735_MOSI_GPIO_Port  GPIOA

#define ST7735_SPI  SPI1


接下来编写驱动接口程序

IO的配置
static void gpio_config()
{
  gpio_init_type gpio_initstructure;
  crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);


  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
  gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);


  gpio_default_para_init(&gpio_initstructure);
//SCK
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins = GPIO_PINS_5;
  gpio_init(GPIOA, &gpio_initstructure);

//MOSI
  gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  gpio_initstructure.gpio_pins = GPIO_PINS_7;
  gpio_init(GPIOA, &gpio_initstructure);
       
// RST/DC/CS
  gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
       
  gpio_initstructure.gpio_pins = GPIO_PINS_3|GPIO_PINS_1|GPIO_PINS_2;
  gpio_init(GPIOA, &gpio_initstructure);

}


SPI外设的配置
static void spi_config(void)
{
  spi_init_type spi_init_struct;
  crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
  spi_default_para_init(&spi_init_struct);
  spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
  spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2;
  spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  spi_init(SPI1, &spi_init_struct);
       
  spi_half_duplex_direction_set(SPI1,SPI_HALF_DUPLEX_DIRECTION_TX);
  spi_enable(SPI1, TRUE);
}


与ST7735库函数底层接口的映射
void ST7735_delay(uint8_t i)
{
        delay_us(i);
}

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

void ST7735_SPI_RST_SetLow(void)
{
        gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,FALSE);
}
void ST7735_SPI_RST_SetHigh(void)
{
        gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,TRUE);
}

void ST7735_SPI_CS_SetLow(void)
{
        gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,FALSE);
       
}
void ST7735_SPI_CS_SetHigh(void)
{
        gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,TRUE);
}

void ST7735_SPI_DC_SetLow(void)
{
        gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,FALSE);
}
void ST7735_SPI_DC_SetHigh(void)
{
        gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,TRUE);
}


编写测试主函数
函数中配合板载的LED闪烁。
int main(void)
{
  __IO uint32_t index = 0;
  system_clock_config();
  at32_board_init();
  gpio_config();
  spi_config();
       
                for(int i=0;i<5;i++)
        {
                at32_led_on(LED2);
                delay_ms(100);
                at32_led_off(LED2);
                delay_ms(100);
        }
        ST7735_Init();
        ST7735_FillScreen(ST7735_BLACK);

//针对0.96寸屏幕y的参数需要偏移24
//        ST7735_DrawRectangle(0,24,160,80,ST7735_BLUE);
        ST7735_DrawRoundRect(0,24,160,80,5,ST7735_BLUE);//绘制带圆角方框
        ST7735_DrawHLine(1,24+20,158,ST7735_CYAN);//绘制横线
        ST7735_DrawHLine(1,24+50,158,ST7735_CYAN);
        ST7735_DrawVLine(65-1,24+1,78,ST7735_CYAN);        //绘制竖线

        ST7735_FillRectangle(70,24+6,10,8,ST7735_MAGENTA);
        ST7735_DrawRectangle(85,24+6,11,8,ST7735_BLUE);
        for(int i=1;i<=4;i++)
        {
                ST7735_DrawPixel(85+2*i,24+6+3,ST7735_YELLOW);
                ST7735_DrawPixel(85+2*i,24+6+4,ST7735_YELLOW);
        }
        ST7735_DrawCircle(106,24+10,5,ST7735_YELLOW);
        ST7735_FillCircle(121,24+10,5,ST7735_PURPLE);
       
        ST7735_DrawCircleHelper(136,24+10,5,1,ST7735_BLUE);
        ST7735_DrawCircleHelper(136,24+10,5,2,ST7735_YELLOW);
        ST7735_DrawCircleHelper(136,24+10,5,4,ST7735_RED);
        ST7735_DrawCircleHelper(136,24+10,5,8,ST7735_LIME);
       
        ST7735_FillCircleHelper(151,24+10,5,1,0,ST7735_TEAL);
        ST7735_FillCircleHelper(151,24+10,5,2,0,ST7735_PURPLE);
       
        ST7735_DrawString(5,24+6,"Hello",ST7735_MAGENTA,ST7735_BLACK,&Font_7x10);//字体实际高度为8个像素,所以偏移6个像素刚好在第一行居中2*6+8=20
        ST7735_DrawString(5,24+20+7,"Hello",ST7735_GREEN,ST7735_BLACK,&Font_11x18);//字体实际高度为16个像素,所以偏移7个像素刚好在第一行居中2*7+16=30
        ST7735_DrawString(5,24+50+7,"Hello",ST7735_YELLOW,ST7735_BLACK,&Font_11x18);//字体实际高度为16个像素,所以偏移7个像素刚好在第一行居中2*7+16=30

        ST7735_DrawLine( 70,24+21,80,24+49,ST7735_BLUE);
        ST7735_DrawLine( 90,24+21,80,24+49,ST7735_BLUE);
        ST7735_DrawLine( 90,24+21,100,24+49,ST7735_BLUE);
        ST7735_DrawLine( 110,24+21,100,24+49,ST7735_BLUE);       

        ST7735_FillRoundRect(112,24+20+5,40,19,5,ST7735_GRAY);
       
        ST7735_DrawTriangle(70,24+78,100,24+52,100,24+78,ST7735_YELLOW);
       
        ST7735_FillTriangle(110,24+52,110,24+78,148,24+78,ST7735_GREEN);
       
        gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
        delay_sec(1);
        gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
        delay_sec(1);
        gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
        delay_sec(1);
        gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
        delay_sec(1);
       
        ST7735_FillScreen(ST7735_BLACK);
        ST7735_DrawImage(0, 24+0, 160, 80, **);
                                                            
        while(1)
        {
                gpio_bits_write(LED3_GPIO,LED3_PIN,TRUE);
                delay_sec(1);
                gpio_bits_write(LED3_GPIO,LED3_PIN,FALSE);
                delay_sec(1);
        }

}


使用特权

评论回复
沙发
gaoyang9992006|  楼主 | 2024-11-26 12:58 | 只看该作者

测试视频,非常NICE。

使用特权

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

本版积分规则

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

1966

主题

15954

帖子

208

粉丝