STM32F103ZET6驱动ILI9341实现TXT小说阅读器

STM32F103ZET6驱动ILI9341实现TXT小说阅读器 ## 1. 项目概述 ### 1.1 系统架构 本小说阅读器系统采用STM32F103ZET6作为主控芯片通过FSMC接口驱动2.8英寸ILI9341 TFT显示屏配合XPT2046触摸控制器实现人机交互。存储系统由SPI接口的SD卡模块和I2C接口的AT24C02 EEPROM组成分别用于存放文本/字体文件和触摸校准参数。 系统工作流程 1. 上电初始化硬件外设SPI、FSMC、I2C 2. 从EEPROM加载触摸校准参数若存在 3. 挂载FATFS文件系统读取SD卡内容 4. 进入主界面显示首本小说第一页内容 ### 1.2 核心功能 - **文本显示**支持GBK编码的TXT文件解析 - **触摸交互**实现翻页、切换小说、调整字体和颜色 - **校准存储**四点触摸校准参数非易失性存储 - **调试输出**通过USART1实时反馈系统状态 ## 2. 硬件设计 ### 2.1 主控电路 STM32F103ZET6最小系统包含 - 8MHz晶振 32.768kHz RTC晶振 - 复位电路10kΩ上拉电阻 100nF电容 - BOOT选择跳线模式0从主Flash启动 - 3.3V LDO稳压电路AMS1117 ### 2.2 显示接口 ILI9341驱动电路关键参数 | 信号线 | 对应引脚 | 备注 | |--------|----------|------| | DB0-DB15 | FSMC_D0-D15 | 16位8080并行接口 | | RD | FSMC_NOE | 读使能 | | WR | FSMC_NWE | 写使能 | | CS | FSMC_NE1 | 片选 | | RESET | PC0 | 硬件复位 | | RS | FSMC_A16 | 命令/数据选择 | ### 2.3 触摸控制 XPT2046典型连接电路 c // SPI2接口配置 #define TOUCH_CS PB12 #define TOUCH_IRQ PB13 #define TOUCH_SCK PB14 #define TOUCH_MISO PB15 #define TOUCH_MOSI PB162.4 存储系统SD卡模块SPI模式最高18MHz时钟支持FAT32文件系统典型电路包含74LVC125电平转换芯片AT24C02电路// I2C1接口 #define EEPROM_SCL PB6 #define EEPROM_SDA PB73. 软件实现3.1 文件系统移植FATFS配置要点#define _CODE_PAGE 936 // 简体中文编码 #define _USE_LFN 1 // 启用长文件名 #define _FS_REENTRANT 0 // 单线程模式文件读取流程f_mount()挂载文件系统f_open()打开目标文件f_read()分块读取内容f_close()释放资源3.2 触摸校准算法四点校准实现代码void Touch_Calibrate(void) { uint16_t phyX[4] {50, 50, 230, 230}; // 物理坐标 uint16_t phyY[4] {50, 310, 310, 50}; uint16_t lcdX[4], lcdY[4]; // 采集四个角触摸数据 for(uint8_t i0; i4; i) { LCD_DrawCircle(phyX[i], phyY[i], 5, RED); while(!Touch_GetPress()); Touch_GetAdc(lcdX[i], lcdY[i]); delay_ms(200); } // 计算校准参数 calib.a ((phyX[0]-phyX[2])*(lcdY[1]-lcdY[3]) - (phyX[1]-phyX[3])*(lcdY[0]-lcdY[2])) / ((lcdX[0]-lcdX[2])*(lcdY[1]-lcdY[3]) - (lcdX[1]-lcdX[3])*(lcdY[0]-lcdY[2])); // 参数保存至EEPROM EEPROM_WriteBytes(0, (uint8_t*)calib, sizeof(calib)); }3.3 文本渲染引擎字体显示关键函数void Show_Char(uint16_t x, uint16_t y, uint8_t num, uint16_t color) { uint8_t temp, t1; uint16_t colortemp color; uint8_t *pfont (uint8_t*)font16[num*32]; // 16x16字模 for(t10; t116; t1) { temp pfont[t1*2]; for(uint8_t t0; t8; t) { if(temp (0x01t)) LCD_DrawPoint(xt, yt1, colortemp); } temp pfont[t1*21]; for(uint8_t t0; t8; t) { if(temp (0x01t)) LCD_DrawPoint(xt8, yt1, colortemp); } } }4. BOM清单器件型号数量关键参数主控芯片STM32F103ZET61LQFP144封装TFT显示屏ILI934112.8寸 320x240触摸芯片XPT20461集成在显示屏SD卡模块通用SPI接口1支持FAT32EEPROMAT24C021I2C接口晶振8MHz1±20ppmLDOAMS1117-3.31800mA输出5. 关键设计要点分页算法16x16字体每页30行×20字600字符24x24字体每页20行×15字300字符动态计算换行位置避免截断汉字触摸防抖处理#define DEBOUNCE_TIME 50 // 消抖时间(ms) uint8_t Touch_GetValidPress(void) { static uint32_t last_time 0; if(HAL_GetTick() - last_time DEBOUNCE_TIME) return 0; if(Touch_GetPress()) { last_time HAL_GetTick(); return 1; } return 0; }颜色切换实现const uint16_t colorTable[] { 0x0000, // 黑 0xFFFF, // 白 0xF800, // 红 0x07E0, // 绿 0x001F // 蓝 }; void Change_TextColor(void) { static uint8_t index 0; index (index 1) % (sizeof(colorTable)/2); currentColor colorTable[index]; LCD_Clear(BACK_COLOR); Refresh_Page(); }6. 调试技巧串口输出配置void USART1_Init(uint32_t baudrate) { huart1.Instance USART1; huart1.Init.BaudRate baudrate; huart1.Init.WordLength UART_WORDLENGTH_8B; huart1.Init.StopBits UART_STOPBITS_1; huart1.Init.Parity UART_PARITY_NONE; HAL_UART_Init(huart1); }常见问题排查SD卡无法识别检查SPI时钟相位(CPHA1)触摸坐标漂移重新校准并确认EEPROM写入成功汉字显示乱码确保文本文件使用GBK编码性能优化使用DMA加速FSMC写操作预读下一页内容到缓冲区部分刷新代替全屏刷新