用48脚的STM32驱动16位并口TFT彩屏

发布者:科技创造者最新更新时间:2024-03-22 来源: elecfans关键字:STM32  驱动  TFT彩屏 手机看文章 扫描二维码
随时随地手机看文章

TFT屏的接口有SPI,8080/6800并口,RGB,MIPI等许多种,用在单片机上的一般就是前两种。SPI的好处是简单,只需要连接六七条线,缺点是速度太慢了。SPI的最高时钟频率一般是单片机主频二分频,16位彩色时写一个像素需要33~34个时钟周期(传16位数据32个周期,协议消耗增加一两个周期),分辨率低了还好,320*240的屏刷全屏需要24.6万时钟周期,48M主频时就是51ms左右,已经有点嫌慢了。好在SPI可以用DMA方式异步写屏,CPU占用率低一些。


8080并口就快多了,一般用FSMC+DMA来驱动,实测最快时平均每个像素只需要12.6个时钟周期,也可以异步写屏,但是得用100脚或者144脚的STM32才有FSMC。(DMA用了M2M方式,效率不高,如果不用DMA直接写,做循环展开,还能再稍快一点点。)有时我们主要就是驱动个屏,其他管脚用得不多,有没有办法让48脚的STM32也用上并口屏呢?得试一下。



48脚的STM32F030有完整的PA0-15, PB0-15这两组16位GPIO, 考虑到PA13和PA14需要作为SWCLK和SWDIO,还是把屏接在GPIOB吧。GPIOA出五个脚接RS/CS/RD/WR/RESET,一路PWM用作背光调节,PA9和10当串口,PA5~7作为SPI接个W25,再加个W25的CS脚,差不多了。原理图过于简单就不贴上来了。


焊好,开机,调试,显示一切正常。然而要测试刷屏速度怎么做呢?在F1/F3/F4上都可以打开DWT,然后在清屏前后各读取一次DWT->CYCCNT的值,相减即可。F0没有DWT,F030也没有32位定时器,只好用SysTick代替了。缺点是它的计数值最大只能到16777215,勉强够了。至于SysTick中断怎么办呢?用TIM16配置成每ms中断,代替一下吧。


最关键的写屏函数,把它作为回调函数传给TFT驱动,我们先写成这样:


static void fastwrite(void* buf, int count)

{

    register unsigned short* ptr = buf;

    while(count > 0) {

        GPIOA- >BRR = LCD_WR;

        GPIOB- >ODR = *ptr++;

        GPIOA- >BSRR = LCD_WR;

        count--;

    }

}

实测结果,刷屏消耗大约1816362个时钟周期,平均每23.7个时钟周期写一个像素。这是什么情况,比SPI只快这么一点?看来是这个循环效率太低了,展开试试。怎么展开呢,试试达夫设备, 首先把前面三条端口操作做成一个宏readwrite_macro,然后如下:


static void fastwrite(void* buf, register int count)

{

    register unsigned short* ptr = buf;

    register int n = (count + 7) / 8;

    switch(count % 8) {

        case 0: do { readwrite_macro(*ptr++);

        case 7: readwrite_macro(*ptr++);

        case 6: readwrite_macro(*ptr++);

        case 5: readwrite_macro(*ptr++);

        case 4: readwrite_macro(*ptr++);

        case 3: readwrite_macro(*ptr++);

        case 2: readwrite_macro(*ptr++);

        case 1: readwrite_macro(*ptr++);

    } while(--n > 0);

}


看上去很奇怪是不是,do..while还能包在switch里?事实上它工作得很好,现在刷全屏只需要1059652个周期了,平均每13.8周期输出一个像素,已经接近FSMC的水平了。


继续优化,考虑到有时是写TFT寄存器,只需要写一两个字节的数据,对这些情况单独处理一下,可以做到798990周期刷全屏,平均每像素10.4周期,超过了FSMC的速度。


然而以上这些办法的缺点是没法做到异步写屏,如果全屏都需要刷新、刷新率较高的话,CPU负担恐怕重了点。能不能设法做到和FSMC+DMA一样的效果呢?还得再想办法。


这里的关键还是写端口的三条语句,把WR脚拉低再拉高,太浪费时间了,能不能用PWM来代替呢?正好,WR脚同时也是TIM15的1通道输出。可以把TIM15配置成PWM,写好GPIO之后PWM提供WR脚的上升沿。实测了一下,果然可行,不过速度比之前慢了不少,估计是PWM参数得好好优化。


下一步,解决了写一个数据,怎么写多个数据呢?思路是用TIM15的溢出事件触发DMA传输,把新的像素数据写到GPIOB。关键是写够了得能停下来,得再用上定时器级联功能,用TIM15的溢出事件作为子定时器(TIM3)的时钟源,计数到预定数值时,TIM3中断里把TIM15关掉——这样可以吗?不行,中断太慢了,这样肯定会写多。感觉可以用TIM3的溢出或者匹配事件再触发一次DMA传输,写TIM15的CR1寄存器,把TIM15关掉。这样应该就可以做成和FSMC+DMA一样的效果了。不过具体操作起来麻烦事还很多。


关键字:STM32  驱动  TFT彩屏 引用地址:用48脚的STM32驱动16位并口TFT彩屏

上一篇:STM32U5 ADC+DMA配置演示
下一篇:STM32 ILI9341驱动TFTLCD屏(一)

推荐阅读最新更新时间:2026-03-21 00:36

基于STM32的FSMC接口驱动TFT彩屏
TFT-LCD技术是微电子技术和LCD技术巧妙结合的高新技术。随着人们对图像清晰度、刷新率、保真度的要求越来越高,TFT-LCD的应用范围越来越广。本文提出了一种能直接驱动数字液晶屏的设计方案,方案先介绍了TFT数字彩屏的工作原理,利用STM32处理器的FSMC接口设计的硬件电路和软件程序均能对显示控制芯片进行有效的控制。在实际应用中显示清晰流畅,并且CPU有足够的时间来处理用户程序。该方案能成功应用在电脑横机的人机界面显示中,且其硬件电路结构简单、控制方式灵活、对于其他型号的接口芯片也能提供参考。 0 引言 随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏。
[单片机]
基于<font color='red'>STM32</font>的FSMC接口<font color='red'>驱动</font><font color='red'>TFT彩屏</font>
基于STM32 的FSMC接口驱动TFT彩屏的设计
0 引言 随着电子产品的不断更新,各种显示界面的开发越来越多,由于TFT彩屏的性价比高,因而被广泛用在各种电子设备上作为显示屏。目前驱动TFT彩屏的方案有很多,可以用底端单片机驱动一个终端类型的液晶模组,这种模组价格比较贵,当然用起来还是很方便的。 只要单片机通过串口或并行口向TFT发送几个字节的命令,就能在屏幕上显示你需要的效果。本设计利用STM32 的FSMC 总线直接驱动TFT 数字彩屏。这种方案对相应的寄存器进行配置后就可以自动向TFT数字彩屏发送数据,无需CPU参与,让CPU有足够时间来处理其他程序。 1 STM32 简介 STM32 是基于ARM 内核Cortex-M3 的32 位微控制器系列。Cortex-M
[单片机]
基于<font color='red'>STM32</font> 的FSMC接口<font color='red'>驱动</font><font color='red'>TFT彩屏</font>的设计
STM32单片机AD4630-24驱动程序
AD4630-24是亚德诺推出的一款24位双通道支持同步采样的ADC,高昂的售价注定了这不会是一款常用芯片,我在做驱动开发期间在中文互联网基本没有找到可以参考的资料或例程。但这次毕竟做的是一款高精度同步电压电流表,这款芯片是领导亲自选的,要求很明确,就是分辨率拉满,咱也只能硬着头皮开干。 这次也是分享以下驱动开发的思路和例程,希望能够帮助到相关人士,顺便,这款芯片要求5V和1.8V双电源供电也是让硬件同事疯狂吐槽。 1.通讯接口 AD4630-24支持串行通讯,为了提高采样结果的读取速率,SDO最高支持8通道同步输出,但很可惜这次使用的单片机是STM32F407,意法连QSPI都不给,只能使用标准的SPI接口通讯,例程也
[单片机]
STM32驱动WS2812指南
题目简介 使用stm32驱动单一ws2812b灯珠实现呼吸灯效果,驱动及实现方法不限 演示效果 动图 快速入门,在stm32核心板上点灯 单片机介绍 采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、多种I/O口和中断系统、定时器/计数器等功能(可能还包括显示驱动电路、脉宽调制电路、模拟多路转换器、A/D转换器等电路)集成到一块硅片上构成的一个小而完善的微型计算机系统入门阶段可以粗略的将其认为一个可以控制电路的小计算机招新题所用的单片机型号为stm32f103c6t6,开发语言为c语言 前置软件 组合一:stm32cubeide 组合二:stm32cubemx+keil5
[单片机]
STM32 HAL库 模拟SPI驱动 DAC8560
网上关于DAC8560相关的模拟SPI驱动的资料少的可怜,甚至连DAC8560的中文资料都不多,更不要提用HAL库进行编程的了,这实在是一块冷门芯片,本文主要是介绍讲解STM32 HAL库使用模拟SPI驱动DAC8560。 首先是SPI相关的简介: SPI通信 高冠避役 · 800阅读 然后是用STM32CubeMx初始化模拟SPI的引脚: STM32CubeMx的GPIO输出的配置可以参考: STM32CubeMx GPIO口输出 高冠避役 · 960阅读 这里之所以是只用开三个GPIO输出来模拟SPI是因为它只用到了半双工通信。 我所用到的三个输出口分别对应8560上的三个SPI通信口。 SYNC:PA6 SCLK
[单片机]
<font color='red'>STM32</font> HAL库 模拟SPI<font color='red'>驱动</font> DAC8560
STM32驱动的自动温控风扇设计:原理与实践全解析
引言 在电子设备散热、智能家居温控等场景中,自动温控风扇能根据环境温度灵活调节转速,既保证散热效果,又能降低能耗和噪音。本文将详细介绍基于 STM32 微控制器的自动温控风扇设计,包括硬件选型、电路设计、软件开发及调试优化全过程。 一、系统架构设计 自动温控风扇系统主要由以下模块组成: 温度采集模块:负责实时监测环境温度 主控模块:处理温度数据并决策风扇转速 风扇驱动模块:根据控制信号调节风扇转速 通信与显示模块:可选模块,用于数据交互和状态显示 系统工作流程:温度传感器采集环境温度 → STM32 处理温度数据 → 根据预设阈值输出 PWM 信号 → 驱动电路控制风扇转速。 二、硬件设计与实现 1. 主控芯片选型
[单片机]
STM32的TIM系列(六):PWM驱动舵机的实战详解
介绍:本章节主要讲解如何在 STM32C8T6 上使用 PWM 驱动舵机。通过按键输入控制,输出以 PWM 信号调整舵机转动角度,从而实现对舵机的精准控制。 目录 一、接线图 二、相关参数的计算 三、相关代码的编写 四、程序现象 一、接线图 二、相关参数的计算 PWM频率:•Freq = CK_PSC / (PSC + 1) / (ARR + 1) Freq =72M/(PSC + 1) / (ARR + 1)=1/20(ms)=50Hz 周期20ms ARR设为20K 那么PSC设置为72M。 PWM占空比: Duty = CCR / (ARR + 1) 那我们就可以通过设置CCR
[单片机]
<font color='red'>STM32</font>的TIM系列(六):PWM<font color='red'>驱动</font>舵机的实战详解
小广播
最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

厂商技术中心

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2026 EEWORLD.com.cn, Inc. All rights reserved