返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

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

[复制链接]
 楼主| gaoyang9992006 发表于 2024-11-26 12:49 | 显示全部楼层 |阅读模式
第一步,认真阅读原理图,确认哪些引脚被使用了,哪些还可以使用。
经过阅读后,确认以下引脚和SPI片上外设,作为本次驱动ST7735的引脚
  1. #define ST7735_RST_Pin       GPIO_PINS_3
  2. #define ST7735_RST_GPIO_Port GPIOA

  3. #define ST7735_DC_Pin        GPIO_PINS_1
  4. #define ST7735_DC_GPIO_Port  GPIOA

  5. #define ST7735_CS_Pin        GPIO_PINS_2
  6. #define ST7735_CS_GPIO_Port  GPIOA

  7. #define ST7735_SCK_Pin         GPIO_PINS_5
  8. #define ST7735_SCK_GPIO_Port   GPIOA

  9. #define ST7735_MOSI_Pin        GPIO_PINS_7
  10. #define ST7735_MOSI_GPIO_Port  GPIOA

  11. #define ST7735_SPI  SPI1


接下来编写驱动接口程序

IO的配置
  1. static void gpio_config()
  2. {
  3.   gpio_init_type gpio_initstructure;
  4.   crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);


  5.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE5, GPIO_MUX_0);
  6.   gpio_pin_mux_config(GPIOA, GPIO_PINS_SOURCE7, GPIO_MUX_0);


  7.   gpio_default_para_init(&gpio_initstructure);
  8. //SCK
  9.   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  10.   gpio_initstructure.gpio_pull           = GPIO_PULL_DOWN;
  11.   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  12.   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  13.   gpio_initstructure.gpio_pins = GPIO_PINS_5;
  14.   gpio_init(GPIOA, &gpio_initstructure);

  15. //MOSI
  16.   gpio_initstructure.gpio_out_type       = GPIO_OUTPUT_PUSH_PULL;
  17.   gpio_initstructure.gpio_pull           = GPIO_PULL_UP;
  18.   gpio_initstructure.gpio_mode           = GPIO_MODE_MUX;
  19.   gpio_initstructure.gpio_drive_strength = GPIO_DRIVE_STRENGTH_STRONGER;
  20.   gpio_initstructure.gpio_pins = GPIO_PINS_7;
  21.   gpio_init(GPIOA, &gpio_initstructure);
  22.        
  23. // RST/DC/CS
  24.   gpio_initstructure.gpio_out_type  = GPIO_OUTPUT_PUSH_PULL;
  25.   gpio_initstructure.gpio_mode = GPIO_MODE_OUTPUT;
  26.   gpio_initstructure.gpio_pull = GPIO_PULL_NONE;
  27.        
  28.   gpio_initstructure.gpio_pins = GPIO_PINS_3|GPIO_PINS_1|GPIO_PINS_2;
  29.   gpio_init(GPIOA, &gpio_initstructure);

  30. }


SPI外设的配置
  1. static void spi_config(void)
  2. {
  3.   spi_init_type spi_init_struct;
  4.   crm_periph_clock_enable(CRM_SPI1_PERIPH_CLOCK, TRUE);
  5.   spi_default_para_init(&spi_init_struct);
  6.   spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
  7.   spi_init_struct.master_slave_mode = SPI_MODE_MASTER;
  8.   spi_init_struct.mclk_freq_division = SPI_MCLK_DIV_2;
  9.   spi_init_struct.first_bit_transmission = SPI_FIRST_BIT_MSB;
  10.   spi_init_struct.frame_bit_num = SPI_FRAME_8BIT;
  11.   spi_init_struct.clock_polarity = SPI_CLOCK_POLARITY_HIGH;
  12.   spi_init_struct.clock_phase = SPI_CLOCK_PHASE_2EDGE;
  13.   spi_init_struct.cs_mode_selection = SPI_CS_SOFTWARE_MODE;
  14.   spi_init(SPI1, &spi_init_struct);
  15.        
  16.   spi_half_duplex_direction_set(SPI1,SPI_HALF_DUPLEX_DIRECTION_TX);
  17.   spi_enable(SPI1, TRUE);
  18. }


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

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

  11. void ST7735_SPI_RST_SetLow(void)
  12. {
  13.         gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,FALSE);
  14. }
  15. void ST7735_SPI_RST_SetHigh(void)
  16. {
  17.         gpio_bits_write(ST7735_RST_GPIO_Port,ST7735_RST_Pin,TRUE);
  18. }

  19. void ST7735_SPI_CS_SetLow(void)
  20. {
  21.         gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,FALSE);
  22.        
  23. }
  24. void ST7735_SPI_CS_SetHigh(void)
  25. {
  26.         gpio_bits_write(ST7735_CS_GPIO_Port,ST7735_CS_Pin,TRUE);
  27. }

  28. void ST7735_SPI_DC_SetLow(void)
  29. {
  30.         gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,FALSE);
  31. }
  32. void ST7735_SPI_DC_SetHigh(void)
  33. {
  34.         gpio_bits_write(ST7735_DC_GPIO_Port,ST7735_DC_Pin,TRUE);
  35. }


编写测试主函数
函数中配合板载的LED闪烁。
  1. int main(void)
  2. {
  3.   __IO uint32_t index = 0;
  4.   system_clock_config();
  5.   at32_board_init();
  6.   gpio_config();
  7.   spi_config();
  8.        
  9.                 for(int i=0;i<5;i++)
  10.         {
  11.                 at32_led_on(LED2);
  12.                 delay_ms(100);
  13.                 at32_led_off(LED2);
  14.                 delay_ms(100);
  15.         }
  16.         ST7735_Init();
  17.         ST7735_FillScreen(ST7735_BLACK);

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

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

  45.         ST7735_DrawLine( 70,24+21,80,24+49,ST7735_BLUE);
  46.         ST7735_DrawLine( 90,24+21,80,24+49,ST7735_BLUE);
  47.         ST7735_DrawLine( 90,24+21,100,24+49,ST7735_BLUE);
  48.         ST7735_DrawLine( 110,24+21,100,24+49,ST7735_BLUE);       

  49.         ST7735_FillRoundRect(112,24+20+5,40,19,5,ST7735_GRAY);
  50.        
  51.         ST7735_DrawTriangle(70,24+78,100,24+52,100,24+78,ST7735_YELLOW);
  52.        
  53.         ST7735_FillTriangle(110,24+52,110,24+78,148,24+78,ST7735_GREEN);
  54.        
  55.         gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
  56.         delay_sec(1);
  57.         gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
  58.         delay_sec(1);
  59.         gpio_bits_write(LED4_GPIO,LED4_PIN,TRUE);
  60.         delay_sec(1);
  61.         gpio_bits_write(LED4_GPIO,LED4_PIN,FALSE);
  62.         delay_sec(1);
  63.        
  64.         ST7735_FillScreen(ST7735_BLACK);
  65.         ST7735_DrawImage(0, 24+0, 160, 80, **);
  66.                                                             
  67.         while(1)
  68.         {
  69.                 gpio_bits_write(LED3_GPIO,LED3_PIN,TRUE);
  70.                 delay_sec(1);
  71.                 gpio_bits_write(LED3_GPIO,LED3_PIN,FALSE);
  72.                 delay_sec(1);
  73.         }

  74. }


 楼主| gaoyang9992006 发表于 2024-11-26 12:58 | 显示全部楼层

测试视频,非常NICE。

打赏榜单

ArterySW 打赏了 10.00 元 2025-01-07
理由:作品优秀

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

本版积分规则

个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部
个人签名:如果你觉得我的分享或者答复还可以,请给我点赞,谢谢。

2045

主题

16350

帖子

222

粉丝
快速回复 在线客服 返回列表 返回顶部