惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Forbes - Security
Forbes - Security
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
F
Fortinet All Blogs
B
Blog
T
The Blog of Author Tim Ferriss
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
Y
Y Combinator Blog
Microsoft Azure Blog
Microsoft Azure Blog
L
LangChain Blog
Recent Announcements
Recent Announcements
U
Unit 42
Martin Fowler
Martin Fowler
M
MIT News - Artificial intelligence
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
The Register - Security
The Register - Security
Recorded Future
Recorded Future
C
Check Point Blog
V
V2EX
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
WordPress大学
WordPress大学
Google DeepMind News
Google DeepMind News
酷 壳 – CoolShell
酷 壳 – CoolShell
F
Full Disclosure
小众软件
小众软件
A
About on SuperTechFans
云风的 BLOG
云风的 BLOG
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
有赞技术团队
有赞技术团队
MongoDB | Blog
MongoDB | Blog
爱范儿
爱范儿
P
Proofpoint News Feed
罗磊的独立博客
量子位
D
Docker
博客园_首页
D
DataBreaches.Net
Project Zero
Project Zero
博客园 - 司徒正美
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
博客园 - Franky
Security Latest
Security Latest
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
N
Netflix TechBlog - Medium
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 三生石上(FineUI控件)
H
Hackread – Cybersecurity News, Data Breaches, AI and More
大猫的无限游戏
大猫的无限游戏

嵌入式开发

求推荐支持 eBPF 的国产 ARM 开发板 求个长期合作的逆向开发 ******野火开发板 stm32 教程错误很多***** - V2EX 嵌入式开发能不能借助 AI 编写程序 - V2EX 有没有类似 ESP32 的芯片,内存要大的? - V2EX 有干嵌入式的老哥吗? stm32+jlink,使用 swd 调试时经常蓝屏是怎么回事 - V2EX 有干嵌入式的老哥吗,有一个 keil 的问题 - V2EX =RS485 总线冲突 Gemini 和 Chatgpt 给出不同的答案=== - V2EX 嵌入式软件工程师如何提升自己? - V2EX ST-Link 在 CLion 下载失败求助 - V2EX 个人认为嵌入式领域最无用的发明---色环电阻 - V2EX v 嵌入式设备适合用 vlc 吗 - V2EX 有玩 mcuboot 的吗,可否帮忙看看我的应用为啥启动不了。 - V2EX 解析 pads pt9 格式文件,大家有没有什么好办法解析,可以有偿 - V2EX 请教嵌入式自学路径 - V2EX 嵌入式 AI 系统 SDK - V2EX 从开发一个六足机器人入手,要怎么做 - V2EX 请教实现 嵌入式二维码扫描的问题, 新手, 非常新 - V2EX 0 基础嵌入式开发学习 - V2EX 嵌入式软件(单片机)相关问题 - V2EX ESP32C6 系列教学视频,每天增加,大概 20 集,如果有用的可以下载 - V2EX 嵌入式入职没人带 ,如何提升自己的开发工作经验呢?提升能力?有没有教程推荐 - V2EX 想给和家亲摄像头刷 OpenIPC,求助 u-boot 相关问题 - V2EX 嵌入式软硬件交流贴 - V2EX 嵌入式设备(无任何界面,带喇叭)的语音通话技术选型 - V2EX 需要开发吸顶灯和可视化门铃,有人接单么 - V2EX 业余想学习和玩一下单片机,求助一下 - V2EX 最近的想法<打造下一代的嵌入式软件开发 IDE> - V2EX 想将投影仪接入米家,请教一下 ESP32 重放投影仪蓝牙遥控器的按键,用于控制投影仪的开关 - V2EX 想学嵌入式,黑马的嵌入式培训怎么样? - V2EX 付费求教 ESP32-C3 射频设计问题,目前 WiFi 不能连接其他 AP,无法成功创建 AP,但能正常搜索到其他 AP - V2EX 嵌入式前景怎么样 - V2EX 嵌入式怎么涨了那么多? - V2EX 需要做一个 PCB 板,增压和降压以及蓝牙控制 - V2EX 纯新手业余爱好者怎么入门 PCB 设计、嵌入式开发啊? - V2EX NCU972 启动卡内核加载 - V2EX NCU970 qt4.8.5 交叉编译环境搭建 - V2EX micropython 开发推荐什么 ide - V2EX 求问交叉编译中 gdb 的使用 - V2EX 移植好 U8g2 图形库的 STM32F407 标准库工程模板, 0.96 寸 OLED 驱动程序 - V2EX Java 岗想转嵌入式,但不知哪个行业更有前途越老越香的那种 - V2EX 求推荐一个 RK3588 开发版 - V2EX 这段浮点运算代码性能为何如此低下 - V2EX 解决请喝奶茶,实在搞不定了 esp32 heap_caps_malloc 分配内存崩溃 - V2EX arm 架构下 u-boot 可不可以不指定 dtb 启动内核? - V2EX 嵌入式的私活好少啊,嵌入式项目资源共享群有吗? - V2EX 感觉嵌入式开发的门槛不在语言而在环境上… - V2EX 有没有哪款 arm 的开发板支持 smmu(iommu)? - V2EX 楼主最近需要研究 arm 架构,想请教 v 友买哪款 arm 的开发板比较合适? - V2EX 用 stm32cubeide 碰到了一个奇怪的 bug,串口发送要凑满 1kb 的数据才能发
过年时候写的,劣质古早 mcu 的 TFT 屏幕 +ILI9341 亮度控制方案 - V2EX
zxkmm · 2024-04-16 · via 嵌入式开发

前言

亮度控制一般有两种方案,DC 调光和 PWM 调光。

但是某些奇怪的单片机设计直接把 TFT 屏的背光灯绑定在电源上,所以你只能开关背光,不能控制电压;所以只能被迫使用 PWM 调光。

然而对于单片机/RTOS 来说,每个 tick 都花一部分性能在控制方面可能有比较大的性能损耗,加上如果设备是无线电相关的话,PWM 带来的噪音可能会辐射到无线电部分导致未知的结果,所以只能采取第三种方案:伪颜色。

伪颜色

本质上 ILI9341 IC 的驱动当中是一个像素点一个像素点地画图

void lcd_write_pixel(ui::Color pixel) {
        lcd_write_data(pixel.v);
    }

这就相当简单了,直接把颜色通过浮点运算化为更“黑”的颜色即可实现“伪”亮度控制

void darken_color(ui::Color& pixel, float darken_level) {
    uint16_t r = (pixel.v >> 11) & 0x1F;
    uint16_t g = (pixel.v >> 5) & 0x3F;
    uint16_t b = pixel.v & 0x1F;

    r = static_cast<uint16_t>(r / darken_level);  // darken
    g = static_cast<uint16_t>(g / darken_level);
    b = static_cast<uint16_t>(b / darken_level);

    pixel.v = (r << 11) | (g << 5) | b;  // combine back
}

但是浮点运算在单片机上相当慢,最后出来而结果可以用,但是渲染速度肉眼可见的下降。最后我的方案是损失一些调控精度,用移位运算代替浮点运算

void darken_color(ui::Color& pixel, uint8_t darken_level_shift) {
        // TODO: 1. do we need edge control?
        // currently didn't see and issue without edge control
        // but maybe hurts screen hardware without one?

        // TODO: 2. de-color mode for accessibility
        // TODO: 3. high contrast mode for accessibility

        uint16_t r = (pixel.v >> 11) & 0x1F;  // extract
        uint16_t g = (pixel.v >> 5) & 0x3F;
        uint16_t b = pixel.v & 0x1F;

        r = r >> darken_level_shift;
        g = g >> darken_level_shift;
        b = b >> darken_level_shift;

        pixel.v = (r << 11) | (g << 5) | b;
    }
其中 darken_level_shift 是一个 uint8,0 代表 100%亮度,1 代表 50%亮度,以此类推

最后出来的结果终于可以用了:

void lcd_write_pixels(ui::Color pixel, size_t n) {
        if (get_dark_cover()) {
            darken_color(pixel, get_brightness());  // Darken
        }
void lcd_write_pixels_unrolled8(ui::Color pixel, size_t n) {
        if (get_dark_cover()) {
            darken_color(pixel, get_brightness());  // Darken 
        }

最后欢迎关注我的 github

https://github.com/zxkmm