stm32触摸屏 ILI9341
ILI9341 简介
对于spi速度的参考看这评论区
其他介绍可查看这篇文章
我这里使用的240 * 320 的2.8寸的屏幕。四线SPI
cubemx配置
配置spi推荐不要超过20 m
配置片选 数据/命令 复位 背光
背光如果不需要调节的话,直接接在3.3v上就可以亮了
触摸采用的是的spi,读取,使用软件spi
IRQ要拉高。不然不接屏幕的时候会发送错误。
显示代码移植
参考这里1主要用的这个 ,,额外参考这个
把文件中的这几个添加到keil中
参考的历程使用的是f7,我们需要修改一些内容
这个#include "stm32f7xx_hal.h"
改为main.h
这几个引脚
给为
这时候编译会在ILI9341_GFX.c
里面有好几个报错,
把对于的GPIO的操作修改一下
初始化的地方也需要修改
运行一个帧率测试函数
// 获取当前时间,单位为毫秒
uint32_t Get_Time_ms(void) {
return HAL_GetTick();
}
// 帧率测试函数
void Test_ScreenFrameRate(void) {
const uint16_t test_color = 0xFFFF; // 测试颜色,白色
const uint32_t test_duration_ms = 5000; // 测试时长5秒
uint32_t start_time = Get_Time_ms();
uint32_t end_time = start_time + test_duration_ms;
uint32_t current_time;
uint32_t frame_count = 0;
// 开始测试
while ((current_time = Get_Time_ms()) < end_time) {
// 填充屏幕,作为一个帧的绘制操作
ILI9341_Fill_Screen(test_color);
frame_count++; // 记录帧数
}
// 测试结束,计算帧率
uint32_t elapsed_time_ms = Get_Time_ms() - start_time;
float frame_rate = frame_count / (elapsed_time_ms / 1000.0f); // 帧数/秒
// 打印帧率结果
char xianshi[50];
sprintf(xianshi,"Total Frames: %d", frame_count);
ILI9341_Draw_Text(xianshi, 0, 0, WHITE, 2, BLACK);
sprintf(xianshi,"Elapsed Time: %d ms", elapsed_time_ms);
ILI9341_Draw_Text(xianshi, 0, 20, WHITE, 2, BLACK);
sprintf(xianshi,"Frame Rate: %.2f FPS", frame_rate);
ILI9341_Draw_Text(xianshi, 0, 40, WHITE, 2, BLACK);
}
主函数这么写
ILI9341_Init();//initial driver setup to drive ili9341
ILI9341_Fill_Screen(BLACK);
Test_ScreenFrameRate();
触摸代码移植
#define TP_CLK_PORT T_CLK_GPIO_Port
#define TP_CLK_PIN T_CLK_Pin
#define TP_CS_PORT T_CS_GPIO_Port
#define TP_CS_PIN T_CS_Pin
#define TP_MISO_PORT T_MISO_GPIO_Port
#define TP_MISO_PIN T_MISO_Pin
#define TP_MOSI_PORT T_MOSI_GPIO_Port
#define TP_MOSI_PIN T_MOSI_Pin
#define TP_IRQ_PORT T_IRQ_GPIO_Port
#define TP_IRQ_PIN T_IRQ_Pin
void touch_test(void)
{
ILI9341_Fill_Screen(WHITE);
ILI9341_Set_Rotation(SCREEN_HORIZONTAL_2);
ILI9341_Draw_Text("Touchscreen", 10, 10, BLACK, 2, WHITE);
ILI9341_Draw_Text("Touch to draw", 10, 30, BLACK, 2, WHITE);
ILI9341_Set_Rotation(SCREEN_VERTICAL_1);
while(1)
{
if(TP_Touchpad_Pressed())
{
uint16_t x_pos = 0;
uint16_t y_pos = 0;
//
// HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_SET);
led_contral('2',on);
uint16_t position_array[2];
if(TP_Read_Coordinates(position_array) == TOUCHPAD_DATA_OK)
{
x_pos = position_array[0];
y_pos = position_array[1];
ILI9341_Draw_Filled_Circle(x_pos, y_pos, 2, BLACK);
ILI9341_Set_Rotation(SCREEN_HORIZONTAL_2);
char counter_buff[30];
sprintf(counter_buff, "POS X: %.3d", x_pos);
ILI9341_Draw_Text(counter_buff, 10, 80, BLACK, 2, WHITE);
sprintf(counter_buff, "POS Y: %.3d", y_pos);
ILI9341_Draw_Text(counter_buff, 10, 120, BLACK, 2, WHITE);
ILI9341_Set_Rotation(SCREEN_VERTICAL_1);
}
//ILI9341_Draw_Pixel(x_pos, y_pos, BLACK);
}
else
{
led_contral('2',off);
// HAL_GPIO_WritePin(GPIOB, LD3_Pin|LD2_Pin, GPIO_PIN_RESET);
}
}
}
作者:林叔叔336