yinwuqing110 发表于 2024-5-26 23:33

【AT-START-F405测评】驱动tft-lcd屏

本帖最后由 yinwuqing110 于 2024-5-26 23:52 编辑

    前段时间一直在调试,想在F405开发板上连接DS18B20模块,采集周围环境温度并于内部ADC温度采集值进行对比,但调试的结果值一直是某一固定值,似乎是IO口的设置存在问题,因为DS18B20采用的是单总线通讯,因此对IO的时序操作比较严苛,后续有时间再研究。此次就AT-START-F405开发板正常驱动SPI TFT彩屏内容进行简单分享,抛砖引玉。
      此次借助电子森林提供的SPI电阻式触摸屏做为TFT屏外设,该屏是集成XPT2046TS触摸屏控制器+ST7735S屏显驱动器,本次只分享正常驱动屏显示。基本工程框架可以使用“AT32 Work Bench”工具生成,然后根据屏厂大王“中景园”提供的参考示例代码进行移植。
管脚的分布如下,均采用杜邦线与AT-START-F405开发板相连。

      然后结合电子森林提供的扩展底板部分的电路原理图进行硬件上的连线。

      连接好硬件电路后,在基本工程框架中移植ST7735S驱屏源码,这里展示下部分代码:#define TFT_RST_GPIO_PORT    GPIOA
#define TFT_RST_PIN          GPIO_PINS_0
#define TFT_DC_GPIO_PORT   GPIOA
#define TFT_DC_PIN         GPIO_PINS_1
#define TFT_CS_GPIO_PORT   GPIOA
#define TFT_CS_PIN         GPIO_PINS_4
#define TFT_SCLK_GPIO_PORT   GPIOA
#define TFT_SCLK_PIN         GPIO_PINS_5
#define TFT_MOSI_GPIO_PORT   GPIOA
#define TFT_MOSI_PIN         GPIO_PINS_7
#define TFT_BLK_GPIO_PORT    GPIOB
#define TFT_BLK_PIN          GPIO_PINS_12

#define LCD_RES_LOW()   gpio_bits_reset(TFT_RST_GPIO_PORT, TFT_RST_PIN)//RES
#define LCD_RES_HIGH()gpio_bits_set(TFT_RST_GPIO_PORT, TFT_RST_PIN)

#define LCD_DC_LOW()    gpio_bits_reset(TFT_DC_GPIO_PORT, TFT_DC_PIN) //DC
#define LCD_DC_HIGH()   gpio_bits_set(TFT_DC_GPIO_PORT, TFT_DC_PIN)
                     
#define LCD_BLK_LOW()   gpio_bits_reset(TFT_BLK_GPIO_PORT, TFT_BLK_PIN) //BLK
#define LCD_BLK_HIGH()gpio_bits_set(TFT_BLK_GPIO_PORT, TFT_BLK_PIN)

#define LCD_CS_LOW()    gpio_bits_reset(TFT_CS_GPIO_PORT, TFT_CS_PIN) //CS
#define LCD_CS_HIGH()   gpio_bits_set(TFT_CS_GPIO_PORT, TFT_CS_PIN)

#define LCD_SCLK_LOW()gpio_bits_reset(TFT_SCLK_GPIO_PORT, TFT_SCLK_PIN) //SCLK
#define LCD_SCLK_HIGH() gpio_bits_set(TFT_SCLK_GPIO_PORT, TFT_SCLK_PIN)

#define LCD_MOSI_LOW()gpio_bits_reset(TFT_MOSI_GPIO_PORT, TFT_MOSI_PIN) //MOSI
#define LCD_MOSI_HIGH() gpio_bits_set(TFT_MOSI_GPIO_PORT, TFT_MOSI_PIN)
int main(void)
{
system_clock_config();
nvic_config();
uart_print_init(115200);
usart_init_conf();
gpio_config();
delay_init();
LcdInit();
while(1)
{
       Display_Test();
}
}void Display_Test(void)
{
      LcdFill(0,0,LCD_W,LCD_H,BLACK);
      LcdShow16x16Hz(8, 0, 0, YELLOW, BLACK);
      LcdShow16x16Hz(24, 0, 1, YELLOW, BLACK);
      LcdShow16x16Hz(40, 0, 2, YELLOW, BLACK);
      LcdShow16x16Hz(56, 0, 3, YELLOW, BLACK);
      LcdShow16x16Hz(72, 0, 4, YELLOW, BLACK);
      LcdShow16x16Hz(88, 0, 5, YELLOW, BLACK);
      LcdShow16x16Hz(104,0, 6, YELLOW, BLACK);
      LcdShowString(12,24,"AT32F405",RED, BLACK,24);
      delay_ms(300);
      LcdShow16x16Hz(38,60, 7, BLUE, WHITE);
      delay_ms(300);
      LcdShow16x16Hz(56,60, 8, BLUE, WHITE);
      delay_ms(300);
      LcdShow16x16Hz(74,60, 9, BLUE, WHITE);
      delay_ms(1000);
      LCD_ShowPicture(0,0,128,160,gImage_1);
      delay_ms(1000);
}void system_clock_config(void)
{
/* reset crm */
crm_reset();

/* config flash psr register */
flash_psr_set(FLASH_WAIT_CYCLE_6);

/* enable pwc periph clock */
crm_periph_clock_enable(CRM_PWC_PERIPH_CLOCK, TRUE);

/* config ldo voltage */
pwc_ldo_output_voltage_set(PWC_LDO_OUTPUT_1V3);

/* enable lick */
crm_clock_source_enable(CRM_CLOCK_SOURCE_LICK, TRUE);

/* wait till lick is ready */
while(crm_flag_get(CRM_LICK_STABLE_FLAG) != SET)
{
}

/* enable hick */
crm_clock_source_enable(CRM_CLOCK_SOURCE_HICK, TRUE);

/* wait till hick is ready */
while(crm_flag_get(CRM_HICK_STABLE_FLAG) != SET)
{
}

/* config pll clock resource */
crm_pll_config(CRM_PLL_SOURCE_HICK, 108, 1, CRM_PLL_FP_4);
/* config pllu div */
crm_pllu_div_set(CRM_PLL_FU_18);
/* enable pll */
crm_clock_source_enable(CRM_CLOCK_SOURCE_PLL, TRUE);
/* wait till pll is ready */
while(crm_flag_get(CRM_PLL_STABLE_FLAG) != SET)
{
}
/* config ahbclk */
crm_ahb_div_set(CRM_AHB_DIV_1);

/* config apb2clk, the maximum frequency of APB2 clock is 216 MHz*/
crm_apb2_div_set(CRM_APB2_DIV_1);

/* config apb1clk, the maximum frequency of APB1 clock is 120 MHz*/
crm_apb1_div_set(CRM_APB1_DIV_2);

/* enable auto step mode */
crm_auto_step_mode_enable(TRUE);

/* select pll as system clock source */
crm_sysclk_switch(CRM_SCLK_PLL);

/* wait till pll is used as system clock source */
while(crm_sysclk_switch_status_get() != CRM_SCLK_PLL)
{
}

   /* enable gpioa periph clock */
crm_periph_clock_enable(CRM_GPIOA_PERIPH_CLOCK, TRUE);

   /* enable gpiob periph clock */
crm_periph_clock_enable(CRM_GPIOB_PERIPH_CLOCK, TRUE);
      
/* enable usart1 periph clock */
crm_periph_clock_enable(CRM_USART1_PERIPH_CLOCK, TRUE);
      
/* disable auto step mode */
crm_auto_step_mode_enable(FALSE);

/* update system_core_clock global variable */
system_core_clock_update();
}      移植完后编译下载到开发板中,即可看到TFT屏刷出字符图片效果,当然这里的字符显示需要借助“PCtoLCD2002”工具,而彩色图片制作借助与“Img2Lcd‘工具,这里的中文字符设置跟0.96寸OLED屏设置一样,彩色图片制作需要注意制作的原始图片是bmp格式,并且不能超过屏的最大尺寸,即128 X 160(竖屏显示),当然源码中也有提供横屏或竖屏显示的宏定义设置。如果超过最大尺寸再交由“Img2Lcd‘工具处理,最后在TFT屏上显示则得不到自己想看到的效果。
      这里将LCD字符与图片取模工具分享出来,感兴趣的坛友可自行下载尝试。

      关于该屏显驱动芯片ST7735S数据手册如下附件:

       工程展现的显示效果如下,总体来说AT-START-F405性能稳定,刷屏流畅不迟滞。此次就简单分享下,后续再对DS18B20模块进行调试,完成屏的触摸功能。






LEDyyds 发表于 2024-6-17 16:05

优质内容,很不错
页: [1]
查看完整版本: 【AT-START-F405测评】驱动tft-lcd屏