基于STM32F7的可编程电源显示系统设计与实现

2021-07-14 01:30王鹏举陈国平
液晶与显示 2021年7期
关键词:寄存器时钟电源

王鹏举,何 丰,陈国平,管 春,张 祥

(重庆邮电大学 光电工程学院,重庆400065)

1 引 言

近年来,电子设备飞速发展,关于人机界面显示的开发也越来越多。因为薄膜晶体管液晶显示屏(TFT-LCD)性价比高,所以在嵌入式系统显示应用中占了主要部分[1]。在电源领域也不例外,但是目前市面上绝大部分的台式电源的人机交互都采用LCD显示输出加机械按键输入的形式,如文献[2]利用AT89C51单片机设计了一款简单灵活、经济、携带方便的数字稳压电源,但其机械按键的设计存在按键易磨损、不易调准、电路构成复杂等缺点。

针对上述问题,本文设计了一种TFT液晶屏触摸显示系统,采用480×272分辨率TFT触摸彩屏作为电源系统的人机交互部分,实现对电源系统的触摸控制。并利用STM32的可变存储控制器(FMC)扩展外部同步动态随机存取存储器(SDRAM)作为显存,同时用其显示控制器(LTDC)直接驱动液晶显示面板,简化了系统电路结构。提出了一种基于STM32的可编程电源人机交互新方案,满足了数字电源系统高可靠性要求。此外,通过移植STemWin缩短和降低了界面设计的过程和难度。通过嵌入FreeRTOS实时操作系统实现系统任务的稳定运行。扩展了TFT液晶屏的适应性和使用范围[3]。

2 系统总体设计

2.1 数字电源系统简介

数字电源系统如图1所示。可编程功率输出部分由开关预调节模块和线性后稳压模块构成,前级预调节模块采用降压Buck拓扑,高效地降低电压,减少整个系统的损耗。线性后调节模块采用基于线性稳压芯片LT3081的稳压结构,极大地抑制由前级开关带来的噪音和干扰,实现精准低纹波输出。线性后稳压的输出电压由DAC通过放大电路进行控制。输出电压通过跟踪电路反馈给前级开关预调节模块,通过调节控制开关导通信号的占空比大小,实现前级输出跟随的目的。让前级的输出电压始终比后级只高2 V左右,以此来减小线性后稳压部分的压降损耗,提高效率。

图1 电源系统总体框图Fig.1 General block diagram of power supply system

可编程电压的实现过程为:控制器接收处理来自触摸显示屏的用户操作,通过SPI通信控制调节监控芯片AD7292的DAC电压的输出大小,DAC的输出通过放大电路控制线性调节的输出。

2.2 显示系统总体设计

如图2所示,显示部分大致可以分为5部分,微控制器(MCU)、TFT液晶显示屏、SDRAM模块、SD卡的读写模块和其他外设。微控制器接收来自触摸控制模块的信息并加以处理,LCD屏作为主要输出设备用以显示图像信息,SDRAM主要作为LCD屏的显存及动态内存设备,为LCD显示提供支持,SD卡读写模块存储图片等作为外部存储设备为界面设计提供资源。

图2 系统总体架构图Fig.2 System architecture diagram

3 显示系统硬件设计

3.1 FMC和SDRAM硬件设计

FMC可以驱动包括SRAM(静态随机存取存储器)、SDRAM(同步动态随机存取存储器)、NOR FLASH 以及NAND FLSAH 类型的存储器[4]。因FMC将外部存储单元直接映射到STM32内部寻址空间,所以可以直接通过访问地址来读写数据,只需在程序中定义指向该地址的指针,完成FMC_SDCR 控制寄存器和FMC_SDTR 时序寄存器的配置后就可由FMC自动完成数据访问。

图3所示为处理器内核的存储空间与STM32 FMC 外设地址的映射关系。SDRAM 的存储区域被分成了两块:Bank1 和Bank2,由FMC_SDCKE 时钟使能信号线和FMC_SDCLK 信号线决定存储区域,选择FMC_SDCKE0 和FMC_SDCLK0,地址范围是0xC0000000-0xCFFFFFFF,而选择FMC_SDCKE1 和FMC_SDCLK1,地址范围是0xD0000000-0xDFFFFFFF。

图3 FMC 的地址映射Fig.3 Address mapping for the FMC

SDRAM和内部SRAM功能一样[5],但SDRAM容量较大,价格却很便宜,所以使用SDRAM能很大程度降低外扩内存的成本且较好地支持GUI的开发。本次设计选用的芯片是IS42S16400J-7TL,内存大小为8 M,支持FMC接口。

SDRAM与MCU的连接如图4所示,相连的引脚主要为地址线和数据线,还有一些具有特定功能的引脚。设计使用的存储区域为Bank2,需要选择FMC_SDCKE1 和FMC_SDCLK1,地址线为12根,地址范围为0xD0000000-0xD0FFFFFF,有16根数据线。

图4 SDRAM 硬件连接图Fig.4 SDRAM hardware connection diagram

3.2 LTDC和DMA2D

在STM32F7系列微处理器中,内部自带一个LTDC 液晶控制器,将带有LTDC功能的引脚连接至LCD-TFT面板,就可通过处理器直接控制面板显示图像。

图5所示为LTDC控制器内部结构和外部与TFT液晶屏的连线图。LTDC内部有图像处理单元、寄存器及时钟信号。图像处理单元可处理两层图像。外部通过信号线与显示屏连接,用以驱动液晶显示面板。此外,由于显示的数据容量非常大,ST公司为提高芯片的图像处理能力设计了一款图形专用DMA,即DMA2D,用于对图像进行填充和搬运而完全不用CPU干预,它可以快速绘制矩形、直线,进行分层数据混合、数据复制以及图像数据格式转换。

图5 LTDC硬件连接图Fig.5 Diagram of LTDC hardware connection

3.3 LCD背光电源的设计

图6所示为液晶屏背光电源模块,选择TPS61169芯片为液晶屏背光提供18 V的电源电压。TPS61169 是一款升压转换器,配有额定电压为40 V的集成开关场效应晶体管(FET),可驱动LED串。升压转换器内部具有一个40 V、1.8 A的金属氧化物半导体场效应晶体管(MOSFET),电流下限为1.2 A,可针对小型或大型面板背光照明驱动单个LED或LED串。运行期间,LED电流可通过施加到CTRL引脚上的脉宽调制(PWM)信号加以控制,该信号占空比的大小决定了反馈引脚(FB)电压的大小。因此,可以通过控制CTRL引脚的PWM达到控制液晶屏亮度的效果。

图6 电源电路原理图Fig.6 Schematic diagram of power supply circuit

3.4 SPI接口设计

图7所示为控制器与数字电源系统的SPI接口设计图。选择控制器的第5组SPI接口与监控芯片AD7292相应引脚进行连接,实现通信功能,控制器通过AD7292实现对电源系统的控制和监测。AD7292是一款集通用模拟信号监控和控制所需功能于一体的单芯片,具有一个8通道10位ADC、4个10位DAC、一个精度为±1 ℃的内部温度传感器以及12个GPIO,可协助系统监控和控制。其中,10位高速低功耗逐次逼近型(SAR)ADC专为监控多种单端输入信号而设计。AD7292提供寄存器可编程ADC序列器,可选择用于转换的可编程通道序列。

图7 SPI通信接口连接图Fig.7 Diagram of SPI communication interface connection

4 显示系统软件设计

系统的软件编译环境是Keil MDK,程序初始化配置使用STM32CubeMX软件。因为该软件基于Cube库,所以它能够调用完整的HAL库进行开发,而它具备的图形向导特性能够很大程度减少开发工作量,其支持全系列的STM32芯片。所以对于STM32单片机开发者来说,只需简单地根据图形界面向导来配置参数,就能够很方便地初始化程序代码。FreeRTOS和STemwin的移植也可直接在CubeMX进行配置完成。FreeRTOS有诸多优点,可以满足中小型嵌入式系统对RTOS的需求。用户可根据需求配置任务管理、内存管理、时间管理、通讯管理等基本管理功能[6]。

数字电源系统的任务划分如表1所示,单独用一个任务实现人机交互功能,即GUI任务。GUI任务是除了空闲任务以外优先级最低的任务,因为emWin极占用系统资源而且时间较长,如果这个任务设置为高优先级,会直接影响低优先级任务的执行。电源系统任务是优先级最高的,因为其任务是实现电源系统主要功能且需要对数据进行实时处理。

表1 系统任务划分Tab.1 System task division

4.1 FMC和SDRAM软件配置

SDRAM初始化流程与读写流程如图8、图9所示,其中tRP、tRFC、tMRD为SDRAM中很重要的参数,需要根据具体的芯片进行配置。具体配置如下:由硬件连接决定选择存储区域SDRAM bank2,列数为8位2进制数,行数则为12位,CAS潜伏期根据时钟定为2个周期,写保护一般配置为无,SDRAM 时钟配置为2分频,即108 MHz,每个周期时间为9.25 ns,CAS潜伏期后直接读取数据。加载模式寄存器命令和激活或刷新命令之间的延迟为2个周期。发出自刷新命令到发出激活命令之间的延迟设为7个时钟周期,即7×9.25 ns=64.75 ns。最短自刷新周期设为5个时钟周期,即5×9.25=46.25 ns,约大于最小值42 ns。刷新命令和激活命令之间的延迟设为7个时钟周期,即7×9.25=64.75 ns,约大于最小值63 ns。写命令和预充电命令之间的延迟设为2个时钟周期。预充电命令与其他命令之间的延迟设为2个时钟周期,即2×9.25=18.5 ns,约大于最小值15 ns。激活命令与读/写命令之间的延迟设为2个时钟周期。

图8 SDRAM初始化流程Fig.8 SDRAM initialization process

图9 SDRAM读写流程Fig.9 SDRAM read-write flow

对应代码如下:

void MX_FMC_Init(void){

FMC_SDRAM_TimingTypeDef SdramTiming={0};

hsdram1.Instance=FMC_SDRAM_DEVICE;

/* SDRAM初始化配置 */

hsdram1.Init.SDBank=FMC_SDRAM_BANK2;//使用BANK2

hsdram1.Init.ColumnBitsNumber=FMC_SDRAM_COLUMN_BITS_NUM_8;

hsdram1.Init.RowBitsNumber=FMC_SDRAM_ROW_BITS_NUM_12;

hsdram1.Init.MemoryDataWidth=FMC_SDRAM_MEM_BUS_WIDTH_16;

hsdram1.Init.InternalBankNumber=FMC_SDRAM_INTERN_BANKS_NUM_4;

hsdram1.Init.CASLatency=FMC_SDRAM_CAS_LATENCY_3;

hsdram1.Init.WriteProtection=FMC_SDRAM_WRITE_PROTECTION_DISABLE;

hsdram1.Init.SDClockPeriod=FMC_SDRAM_CLOCK_PERIOD_2;

hsdram1.Init.ReadBurst=FMC_SDRAM_RBURST_DISABLE;

hsdram1.Init.ReadPipeDelay=FMC_SDRAM_RPIPE_DELAY_1;

/* SDRAM时序参数配置 */

SdramTiming.LoadToActiveDelay=2;//加载延时2个时钟周期

SdramTiming.ExitSelfRefreshDelay=7;

SdramTiming.SelfRefreshTime=4; //自刷新时间4个时钟周期

SdramTiming.RowCycleDelay=6;

SdramTiming.WriteRecoveryTime=2;

SdramTiming.RPDelay=2;

SdramTiming.RCDDelay=2;}

4.2 LTDC配置

本文介绍的是通过LDTC控制RGB接口的屏幕,即屏幕是不带控制器的,与带控制芯片的8080系列接口的屏幕不同。RGB时序图如图10所示,RGB接口的屏幕是通过MCU不断发送显示数据到屏幕,逐行扫描显示。

图10 RGB时序图Fig.10 Diagram of RGB sequence

其中VSYNC表示垂直同步信号,当LCD屏一帧的数据传输结束时,该信号线电平跳变。HSYNC表示水平同步信号,当某一行数据传输完毕,该信号线会发生电平跳变。VDEN是数据使能信号。对应参数配置代码如下:

void MX_LCD_Init(void){

/*配置LTDC */

hltdc.Instance=LTDC;

hltdc.Init.HSPolarity=LTDC_HSPOLARITY_

AL;

hltdc.Init.VSPolarity=LTDC_VSPOLARITY_

AL;

hltdc.Init.DEPolarity=LTDC_DEPOLARITY_

AL;

hltdc.Init.PCPolarity=LTDC_PCPOLARITY_

IPC;

hltdc.Init.HorizontalSync=19;//配置水平刷新时间

hltdc.Init.VerticalSync=2; //配置垂直刷新时间

hltdc.Init.AccumulatedHBP=159;

hltdc.Init.AccumulatedVBP=22;

hltdc.Init.AccumulatedActiveW=1183;

hltdc.Init.AccumulatedActiveH=622;

hltdc.Init.TotalWidth=1343;

hltdc.Init.TotalHeigh=634;

hltdc.Init.Backcolor.Blue=0;

hltdc.Init.Backcolor.Green=0;

hltdc.Init.Backcolor.Red=0;//设置背景色

pLayerCfg.WindowX0=0;

pLayerCfg.WindowX1=480;

pLayerCfg.WindowY0=0;

pLayerCfg.WindowY1=272;//坐标点配置

pLayerCfg.PixelFormat=LTDC_PIXEL_FORMAT_RGB888;//配置为RGB88格式

pLayerCfg.Alpha=0xFF;

pLayerCfg.Alpha0=0;

pLayerCfg.BlendingFactor1=LTDC_BLENDING_FACTOR1_PAxCA;

pLayerCfg.BlendingFactor2=LTDC_BLENDING_FACTOR2_PAxCA;

pLayerCfg.FBStartAdress=0xD0000000;

pLayerCfg.ImageWidth=480;

pLayerCfg.ImageHeight=272;

pLayerCfg.Backcolor.Blue=0;

pLayerCfg.Backcolor.Green=0;

pLayerCfg.Backcolor.Red=0;}

关于LTDC参数配置,首先由硬件决定分辨率为480×272,设置像素点宽度为480,高度为272。然后是图层的配置:考虑到内存大小,图层数设为1层;设置窗口从坐标(0,0)开始,大小为480×272像素点;像素点格式设为RGB888;层的透明度设置为0xFF;显存起始地址设置为0xD000 0000,即外部SDRAM映射地址的首地址,背景颜色默认为黑色。

4.3 GT911触摸芯片

触摸芯片一般集成在LCD屏上,本次设计所使用的是109.2 mm(4.3 in)电容触摸屏,配套的触控芯片是GT911,其内部结构框图如图11所示。

图11 GT911内部框图Fig.11 Internal block diagram of GT911

由图可知,想要驱动GT911,只需要关心4个引脚即可,即I2C通讯接口SCL和SDA,中断信号引脚INT和复位引脚/RSTB。

GT911主要通过标准I2C协议进行数据传输,从设备地址有两组:0xBA/0xBB 和0x28/0x29,可以在上电初始化时控制Reset 和INT 口状态进行设定。图12为设定0xBA/0xBB设备时的上电时序图。

图12 上电时序图Fig.12 Power on timing diagram

在MX中进行初始化,设置PD7为外部中断,采用软件I2C方式通讯,所以只需将PD11、PD12、PD13设为通用输出引脚,根据I2C原理编写软件I2C底层操作函数,写入CT12C.c文件,并将声明放在CT12C.h文件中,在GT911.c中进行调用。由前文的GT911通讯原理可以写出读写寄存器操作函数如下:

static uint8_t GT911_WR_Reg(uint16_t reg,uint8_t *buf,uint8_t len){

uint8_t i;

uint8_t ret=0;

CT_I2C_Start();

CT_I2C_Send_Byte(CT_CMD_WR);

CT_I2C_Wait_Ack();

CT_I2C_Send_Byte(reg>>8);

CT_I2C_Wait_Ack();

CT_I2C_Send_Byte(reg&0XFF);

CT_I2C_Wait_Ack();

for(i=0;i

{CT_I2C_Send_Byte(buf[i]);

ret=CT_I2C_Wait_Ack();

if(ret)break; }

CT_I2C_Stop();

return ret;}

static void GT911_RD_Reg(uint16_t reg,uint8_t *buf,uint8_t len){

uint8_t i;

CT_I2C_Start();

CT_I2C_Send_Byte(CT_CMD_WR);

CT_I2C_Wait_Ack();

CT_I2C_Send_Byte(reg>>8);

CT_I2C_Wait_Ack();

CT_I2C_Send_Byte(reg&0XFF);

CT_I2C_Wait_Ack();

CT_I2C_Stop();

CT_I2C_Start();

CT_I2C_Send_Byte(CT_CMD_RD);

CT_I2C_Wait_Ack();

for(i=0;i

{buf[i]=CT_I2C_Read_Byte(i==(len-1)?0:1);}

CT_I2C_Stop(); }

触摸状态扫描函数软件流程图如图13所示,该函数需要放在定时器中断中,间隔一段时间执行一次,获取触摸点的信息。首先对触摸中断是否被触发进行判断,如有被触发则再判断寄存器的值,当寄存器中有值时读取触摸点的个数,根据个数再读取触摸点的值并更新信息。

图13 触摸状态扫描函数流程图Fig.13 Flow chart of touch state scan function

4.4 emWin界面制作

emWin是Segger公司为嵌入式平台开发的高效稳定的图形软件库,能够用于提供有效的,独立于处理器和显示控制器的图形用户界面[7]。利用STemWin自带的GUIBuilder工具可初步完成每个页面的设计,并利用emWin的API函数实现对页面各个控件的优化,最终设计出美观、人性化的界面。

图14为各页面执行流程图,在设计时根据系统功能需求而设计了不同的显示页面,根据用户的操作并利用emWin的WM_HideWindow()和WM_ShowWindow()函数实现页面切换的功能。

图14 页面执行流程图Fig.14 Page execution flowchart

5 实验结果

图15、图16、图17分别为最终设计完成的界面和实际应用情况,可以看出显示效果清晰流畅。通过对界面进行触摸操作,如设置输出电压、电流等,测试其对系统的控制和监控情况。

图15 系统主页面Fig.15 System main page

图16 设置输出页面Fig.16 Setting of output page

图17 实际应用情况Fig.17 Practical application

图18所示为显示屏对电源系统双通道的实时监控情况,通道一和通道二电压、电流预设值均为10 V、1 A,左边为通道一带50 Ω负载电阻时的屏幕显示情况。因输出电压设置为10 V,负载为50 Ω,所以输出电流理论值为200 mA,没有超过预设电流值,电源处于恒压模式输出。右边为通道二带1 Ω负载电阻时的屏幕显示情况。因输出电压设置为10 V,负载为1 Ω,所以输出电流理论值为10 A,超过预设电流值,电源处于恒流模式输出。此时实时输出电压显示为950 mV,与理论输出值1 V相差较大,其误差由负载电阻实际值与其标称值1 Ω的误差导致。

图18 双通道实时监控情况Fig.18 Dual channel real-time monitoring situation

6 结 论

系统用STM32F7作为核心处理器,采用109.2 mm(4.3 in)LCD触摸屏实现电源的人机交互功能,通过LCD触摸屏采用数字输入的形式克服了采用机械按键作为输入的直流电源存在的输入值不精确、电位器不易调准等问题。该系统显示效果清晰,能对电源系统进行实时控制和监测显示。此外,系统还通过移植FreeRTOS实时操作系统和emWin,在提高系统的实时稳定性的同时缩短了界面开发流程。本文设计为TFT触摸屏在电源领域的应用提供了参考。

猜你喜欢
寄存器时钟电源
STM32和51单片机寄存器映射原理异同分析
别样的“时钟”
古代的时钟
Lite寄存器模型的设计与实现
Cool Invention炫酷发明
有趣的时钟
时钟会开“花”
哪一款移动电源充电更多?更快?
阳光电源
高速数模转换器AD9779/AD9788的应用