STM32 FSMC驱动TFTLCD 难点解析

本篇文章三个主题:FSMC有关配置、一串字符显示原理汉字显示原理。。下面进入正题
一、FSMC的有关配置(博主用的是FSMC_A10):
      来自别人家的博客http://blog.youkuaiyun.com/jxnu_xiaobing/article/details/8718566

      FSMC的介绍就不介绍了,网上一大片
。我们就讨论讨论为什么用FSMC的地址线与TFTLCD的RS引脚相连?以及我们如何往LCD写数据/命令?
      FSMC称为可变静态存储控制器。可变:之所以称为“可变”,是由于通过对特殊功能寄存器的设置,FSMC 能够根据不同的外部存储器类型,发出相应的数据/地址/控制信号类型以匹配信号的速度。(这点很重要,后文会提到。。)
      简单说明一下吧~为什么不拿STM32的IO口直接接LCD的对应引脚?(看看我上边发的链接就清楚了),大致就是操作麻烦,效率低嘛。。好,FSMC是吧TFTLCD当成SRAM设备来用的,其操作时序和SRAM的控制完全类似,唯一不同的就是TFTLCD有RS信号,但是没有地址信号。
      TFTLCD是通过RS信号来决定传送的数据是数据还是命令,本质上可以理解为一个地址信号,比如我们把RS接在A10上面(当然A0-Axx都可以)。那么LCD到底是怎么判断我们写的是命令还是数据呢?下面是重点!!!
      以战舰的程序为例:

      这里因为数据线宽度是16位时,HADDR[25:1]->FSMC[24:0],相当于右移一位。下面是战舰给出的A10偏移量:
     
      0x6c000000相比大家都没有问题。按理说A10的偏移量应该是2的11次方(0-10)=2048,转换为16进制就是800,那也比7FE大两位!
      (这里复习下基础知识:RS=0,写命令;RS=1,写数据。)
      为什么呢?我是这么理解的(倒推法):按我的思路推,如果我们取LCD->LCD_REG的地址0x6c000800的话,当地址右移时,第10位就不是0了,而是1。对应RS=1,那么对于LCD就不是写命令了,而变成写数据了;又因为结构体内部成员对齐规则,
LCD->LCD_RAM的地址就是0x6c00802了,当地址右移时,第10位也是1,对应RS=1。还是写数据!!!!
      推到这应该明白了。如果按正常算法来计算的话,RS就只会等与1,就不会区分写命令和写数据了。
      故我们要将A10的偏移量减去两位。就得到图中战舰的0x000007FE了。
LCD->LCD_REG的地址就是0x6c0007FE了。当地址右移一位时第10位是0,对应RS=0,为对于LCD就是写命令了;而因为结构体内部成员对齐规则,LCD->LCD_RAM的地址就是0x6c000800了。当地址右移一位时第10位是1,对应RS=1,为对于LCD就是写数据了。这样FSMC就能区分传送的是数据还是命令了。。大功告成!
      到这里,问题来了:我们就控制A10这一根线怎么就可以完成读写了呢?那些十多个引脚的电平又是谁在控制呢?
      这个神秘的‘人物’就是上文我们提到的FSMC啦!先看一个战舰上的写寄存器函数:
             
      第一个图:这里的LCD->LCD_REG是一个地址(0x6c000007FE),这里的寄存器序号哦:是指LCD手册里定义的寄存器地址。只要我们往LCD->LDC_REG这个地址里写一个变量(地址)。因为
LCD->LDC_REG这个地址是FSMC管辖的。所以这时候FSMC就要勇敢的站出来管了~FSMC会自己生成相应的时序,包括CS、WR、RD和IO方向都是由FSMC控制!这就大大便利了我们对LCD的控制。
         第二个图:这里的LCD->LCD_RAM也是一个地址(0x6c00000800)LCD->LCD_RAM=data;是往该寄存器地址里面写入数据。

二、一串字符的显示原理(战舰)
     
1、比如我们要显示一个字符串LCD_ShowString(x,x,x,"hello 21ic");x:是一些坐标哦和字体大小参数,先不管→_→
      2、那我们就得调用字符显示函数:LCD_ShowChar();来把一个字符的点阵全部取完。
      3、字符是有点组成的,故在字符函数中不断调用画点函数LCD_DrawPoint();来画点(往LCD->LCD_RAM里写颜色值,这个颜色值在lcd.h里被定义为16位的地址)。
      4、至此,在lcd_init()中有过LCD屏的初始化(设置显示参数),就可以显示了。
     
      5、简析一下叠加和非叠加的原理吧
→_→
      叠加就是字符点阵中是‘1’就用赋画笔颜色,是‘0’就赋背景颜色(那个字符的背景颜色,与全屏背景颜色无关),没毛病!因为最后显示的时候有个覆盖的作用。就是先把全屏颜色显示出来,再在全屏颜色的基础上覆盖上你的字符。所以就显示出叠加和非叠加(只有一个画笔颜色)了。

三、汉字显示原理
     
其实汉字显示和英文显示一个原理。很简单!显示的原理就是根据你的汉字字模字节大小来画点。
      简单说说哈:大家都知道,字母的显示原理就是两个for循环(博主就知道这个),第一个for是控制‘行’的,第二个for是控制‘列’的。先给两个例子:比如显示一个16*08的字母,第一个for是循环16次,第二个for是循环8次;显示一个24*24的汉字,第一个for是循环72次,第二个for还是循环8次。不知道到这里大家看没看出来什么规律来
→_→
      规律:第一个for是字模所占的字节数,第二个for是每次画8位(从列最高处往下描8个点),字符显示函数中间会有y-y0的字样,这是判断一列点数是否达到16或者24个了,是就x+1,换下一列。
      总的来说,汉字的字模字节说就是比字母字模字节数大。修改的也就是第一个fo和y-y0里面的参数。

      博主不才,大牛不喜勿喷哦~!
<think>好的,我现在需要帮助用户设计一个基于STM32的PCB电路板,包含触摸,用于监控和控制机箱内的温度、湿度及灰尘。用户还希望这个系统能够通过额外的端口获取主板的CPU/GPU信息,并在触摸显示。我需要详细考虑硬件设计、传感器接口、软件算法以及系统集成等方面。首先,用户提到要使用STM32作为核心控制器。这意味着我需要选择合适的STM32型号,考虑到需要处理多个传感器数据、触摸控制以及可能的通信接口,可能需要一个性能较高的型号,比如STM32F4系列,具备足够的GPIO和通信接口(如I2C、SPI、UART)。 接下来是触摸的设计。用户需要动态监控和控制,所以触摸的选型很重要。电阻式或电容式触摸?考虑到成本和易用性,可能选择电阻式,但电容式更适合多点触控。需要确定幕的分辨率和尺寸,以及如何与STM32连接,可能需要使用FSMC接口或者SPI。传感器部分需要支持多种接口,包括温度、湿度、灰尘传感器。温度传感器可能需要DS18B20或者DHT22,湿度可以用HIH6130,灰尘传感器比如GP2Y1010AU0F。这些传感器有不同的接口(数字、模拟、I2C等),所以PCB设计时要考虑这些接口的布局,避免信号干扰。然后是如何获取主板的数据。用户提到不依赖CPU/GPU传感器,但又要通过额外端口获取这些信息。这可能意味着需要设计一个通信接口,比如USB或UART,连接到主板上的某些节点,读取温度、频率、电压等数据。可能需要解析主板提供的传感器数据协议,比如SMBus或I2C,或者使用AD转换读取模拟信号。降低湿度和灰尘涉及到风扇控制、过滤系统等。可能需要设计PWM控制的风扇驱动电路,以及灰尘传感器的反馈控制。防尘可能需要正压设计,使用HEPA滤网,湿度控制可能需要除湿模块,比如半导体制冷片或者冷凝装置。 软件方面,需要编写STM32的固件,处理传感器数据,控制触摸显示,实现用户交互界面,以及PID控制算法来调节温度。还需要设计通信协议与主板通信,获取数据。可能需要使用RTOS来管理多任务,比如FreeRTOS。 PCB布局方面,需要将高速信号(如触摸的接口)与模拟信号(传感器)分开,避免干扰。电源部分需要稳定,可能使用LDO或开关电源,确保各个模块供电稳定。STM32的时钟电路、复位电路等需要正确设计。触摸驱动电路可能需要电平转换,如果幕电压与STM32不同。用户还提到自定义传感器阈值、范围和名称,这需要在软件中实现配置界面,可能通过触摸上的设置菜单,允许用户输入参数,存储到EEPROM或Flash中。安全方面需要考虑过压、过流保护,可能在电源入口加入保险丝和TVS二极管。EMC设计也很重要,避免噪声影响传感器读数。 测试阶段需要验证各个传感器的准确性,触摸的响应速度,通信接口的稳定性,以及控制算法的效果。可能需要使用示波器、逻辑分析仪等工具进行调试。 可能遇到的问题包括传感器数据冲突、触摸刷新率低、通信协议不兼容等。需要逐一排查,优化代码和硬件设计。 最后,生成相关问题需要考虑用户在实现过程中可能遇到的难点,比如传感器校准、通信协议解析、触摸UI设计等。</think>### 基于STM32的智能机箱监控系统设计方案 #### 一、硬件架构设计 1. **核心控制器选型** 推荐STM32F407VGT6,具备: - 168MHz Cortex-M4内核 - 1MB Flash + 192KB RAM - 3个I2C、4个USART、2个SPI接口 - FSMC接口支持触摸控制 2. **触摸接口设计** 采用4.3寸TFT-LCD(800×480)带电容触摸: ```c /* FSMC初始化示例 */ void FSMC_Config() { FSMC_NORSRAMInitTypeDef init; init.FSMC_AddressSetupTime = 2; init.FSMC_AddressHoldTime = 1; init.FSMC_DataSetupTime = 5; // 根据幕时序调整 FSMC_NORSRAMInit(&init); } ``` 3. **传感器接口电路** | 传感器类型 | 接口方式 | 信号调理电路 | |---|---|----| | 温度(SHT35) | I2C | 10k上拉电阻 | | 湿度(HIH6130) | I2C | 低通滤波器(RC=10ms) | | 灰尘(GP2Y1010) | ADC | 运算放大器(增益=5) | #### 二、关键电路设计 1. **多协议通信接口** - SMBus接口电路: $$V_{IH} \geq 2.1V, V_{IL} \leq 0.8V$$ - 电平转换电路设计: ![电平转换电路](https://via.placeholder.com/300x100.png?text=Level+Shifter) 2. **功率驱动电路** 半导体制冷片驱动设计: $$R_{DS(on)} = \frac{V_{GS(th)}}{I_D} = \frac{2.5V}{10A} = 0.25Ω$$ 采用IRF3710 MOSFET搭建全桥电路,配合HIP4081驱动芯片。 #### 三、软件算法实现 1. **多传感器数据融合** 使用卡尔曼滤波算法: $$ \begin{cases} \hat{x}_k^- = A\hat{x}_{k-1} + Bu_{k-1} \\ P_k^- = AP_{k-1}A^T + Q \end{cases} $$ 其中$Q$为过程噪声协方差矩阵[^1]。 2. **温度控制算法** 改进型模糊PID控制结构: ```mermaid graph TD A[温度误差] --> B(模糊化) B --> C{规则库} C --> D(解模糊) D --> E[PID参数调整] ``` #### 四、PCB布局规范 1. **分层策略** | 层序 | 功能 | 线宽规则 | |---|---|---| | Top | 传感器信号 | 6mil(阻抗控制) | | Inner1 | GND平面 | 完整覆铜 | | Inner2 | 电源平面 | 分割为3.3V/5V | | Bottom | 功率电路 | 40mil(载流能力) | 2. **EMC设计要点** - 数字/模拟地分割间距:≥2mm - 晶振包地处理:环形guard trace - 信号完整性:满足$$t_r < 0.35/f_{max}$$ #### 五、系统集成方案 1. **人机交互设计** - 动态参数配置界面 ![UI示例](https://via.placeholder.com/300x200.png?text=Touch+UI) - 自定义传感器命名规则: ```json { "sensor1": { "name": "蒸发器温度", "range": [0, 100], "unit": "℃" } } ``` 2. **主板数据获取** - SMBus协议解析流程: ```c void ParseSMBus() { while(DRDY引脚为低) { 读取地址字节; if(匹配设备地址) { 读取数据包; CRC校验; } } } ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值