-
【嵌入式开发】LED 驱动 ( LED发光二极管原理 | 底板原理图分析 | 核心板原理图分析 | GPIO | 裸板程序烧写...
2018-07-30 22:06:00LED 灯 简介 1. LED 原理图 (1) LED 底板 原理图 (2) LED 核心板 原理图 开发板 的 LED 灯 作用 : 嵌入式软件的开发初期, 如 开发 BootLoader 代码 或者 Kernel 内核代码 过程中, 有效...文章目录
开发板 的 LED 灯 作用 : 嵌入式软件的开发初期, 如 开发 BootLoader 代码 或者 Kernel 内核代码 过程中, 有效的调试方法有限, 此时通常使用 开发板上的 LED 灯 作为 程序调试的手段 ; 另外除 LED 灯 之外 并不是没有调试手段, JLink 调试器可以进行本阶段的调试 ;
之后的博客中开始接触 外围 硬件的操作, 外围硬件包括 串口, Flash, SD卡, 网卡 等; LED 是最简单的一种 外围硬件;
外围硬件驱动程序设计流程 : ① 分析原理图 ② 阅读分析 芯片手册, ③ 驱动设计, ④ 代码编写 ;
本博客的参考文章及相关资料下载 :
- 1.本博客代码及参考手册下载 : https://download.csdn.net/download/han1202012/10573310
#一. LED 简介
##1. LED 原理图
###(1) LED 底板 原理图
LED 底板原理图分析 :
- 1.LED 发光原理 : LED 是发光二极管, 二极管两端的电压差到达一个阈值, 就会处于导通状态, 此时就是发光状态;
- 2.OK6410 LED 底板图分析 : 以 第一个 LED1 为例, 右侧时高电平, 左侧是低电平, 当电压差到达一定程度 LED 就会处于导通状态, 低电平端引脚是 NLED1 ;
###(2) LED 核心板 原理图
LED 核心板原理图 :
- 1.OK6410 核心板原理图分析 : 下图是 核心板 原理图的部分截图, 可以看到
NLED1
接在 CPU GPIO 的GPM0
引脚上, 因此可以通过操作 GPIO 的 GPM0 引脚 来进行设置 NLED1 引脚的低电平操作;
##2. GPIO
###( 1 ) GPIO 简介
GPIO 简介 : 英文全称 General-Purpose Input / Output Ports, 中文翻译为 : 通用输入输出端口;
- 1.GPIO 作用 : 很多结构简单的外部设备 或者 电路 只要求两种状态 : 开 或 关, GPIO 端口 只用于传输 开关 信号, CPU 通过 GPIO 端口来操作这些简单的设备;
- 2.串口 和 USB 作用 : 用于传输复杂数据, 因此简单的 开关 使用 GPIO 比较 合适;
- 3.LED 灯场景 : 此处通过操作 GPIO 的 GPM0 引脚, 来给 LED 灯一段加低电平, 只需要 加 或者 不加 两种操作;
- 4.GPIO 使用 : 每个 GPIO 端口都至少需要两个寄存器来使用, ① 控制寄存器 选择端口的 输入/输出 操作, ② 数据寄存器 用于存放数据;
###( 2 ) GPIO 文档
参考手册 : ARM芯片 手册 S3C6410X.pdf ( 基于 6410 开发板 ARM 11 )
- 1.手册对应章节 : 10 章节 10-GPIO;
- 2.S3C6410X.pdf手册下载地址 :https://download.csdn.net/download/han1202012/10573310
GPIO 文档 :
- 1.GPIO 引脚说明 : S3C6410 有 187 个输入输出引脚, 分属于 17 个端口; 其中的 LED1 就是属于 GPM0;
- 2.GPM 控制寄存器 : GPM 控制寄存器分为 4 位, 其中 LED1 连接的引脚为 GPM0, GPM0 引脚 对应的控制寄存器的 [3 : 0] 位, 设置 0b0000 即 设置为输入数据, 设置 0b0001 即设置为输出数据;
- 3.GPM 数据寄存器 : GPM 数据寄存器 有 6 位 [5 : 0], 设置 第 0 位 数据, 当端口被设置为 输入/输出 功能, 其设置的 0 或 1 数据就是引脚的状态 ;
###( 3 ) 点亮 LED 灯
点亮 LED 灯 :
-
1.地板原理图分析 : 四个 LED 灯的低电平, 分别由 NLED1, NLED2, NLED3, NLED4 四个引脚控制;
-
2.核心板原理图 : NLED1, NLED2, NLED3, NLED4 四个引脚分别接在了 GPIO 端口的 GPM0, GPM1, GPM2, GPM3 四个引脚上;
-
3.设置 GPIO 控制寄存器 : 设置 GPM0, GPM1, GPM2, GPM3 对应的 控制寄存器 ;
-
4.设置 GPIO 数据寄存器 : 设置 GPM0, GPM1, GPM2, GPM3 对应的 数据寄存器 ; 其中 设置 0 为 低电平, 设置 1 为 高电平, 使 LED 灯亮起来, 该引脚需要设置 低电平 达到 发光二极管的电压差阈值, LED 才能亮起来;
##3. 外设基地址初始化
###( 1 ) C15 寄存器 简介
C15 寄存器 : 英文全称 Peripheral Port Memory Remap Register, 外设端口内存映射寄存器 ;
- 1.外设端口内存映射寄存器 作用 : 为 非共享 的设备 重新进行内存映射, 覆盖页表中的内存映射关系, 可以通过一个地址强制访问外设端口;
- 2.无使用前提 : 不管 MMU 是否启用, 都不影响 外设端口地址内存 的重新映射;
- 3.权限说明 : 外设端口内存映射寄存器 拥有最高级别的权限, 高于 Primery 和 Normal 级别的内存映射寄存器;
###( 2 )外设端口内存映射寄存器 属性
外设端口内存映射寄存器 属性 :
- 1.寄存器编号 : 该寄存器是 CP15 协处理器中的 C15 寄存器;
- 2.寄存器属性 : 该寄存器是一个 32 位 的可读写寄存器;
- 3.访问权限 : 只有在特权模式下才可以访问 ;
#二. LED 控制代码编写
##1. 汇编代码编写
###(1) 控制 LED 开关
LED 控制 汇编代码编写 : 基于 OK6410 开发板; 1 ~ 3 步骤为 数据准备, 4 ~ 6 步骤为 设置 GPIO 的 GPM 控制寄存器值, 将引脚设置为输出功能, 7 ~ 9 步骤 为 设置 GPIO 的 GPM 数据寄存器值 ;
- 1.定义 GPM 控制寄存器地址常量 : GPM 控制寄存器的地址是 0x7F008820,
#define GPBCON 0x7F008820
, 下图是 S3C6410X.pdf 文档中 10-GPIO Page 338 介绍;
- 2.定义 GPM 数据寄存器地址常量 : GPM 控制寄存器的地址是 0x7F008824,
#define GPBDAT 0x7F008824
, 上图是 S3C6410X.pdf 文档中 10-GPIO Page 338 介绍; - 3.定义 LED 操作标号 :
light_led :
, 可以在其它位置通过 跳转到 该标号处执行 LED 灯打开的操作; - 4.装载控制寄存器地址 : 首先将 GPM 控制寄存器地址装载到 r0 中, 以方便之后访问这个地址,
ldr r0, =GPBCON
, 其中 将 0x7F008820 地址装载到了 r0 寄存器中,GPBCON
是之前定义的 GPM 控制器地址 的常量 ; - 5.计算 GPM 控制寄存器值 : 下图是 GPM 控制寄存器的值, 4个 LED 灯分别由 GPM0, GPM1, GPM2, GPM3 控制, 因此需要**将 GPM0, GPM1, GPM2, GPM3 对应的控制器设置成输出模式**, 每一位设置占 4 位, 即设置成 0x1 即可, 前 0 ~ 15 位 设置成 0x1111, GPM4 和 GPM5 的内容不需要, 因此设置成0 即可, 最后该寄存器的值设置成 0x1111 即可; 代码为
ldr r1, =0x1111
;
- 6.将 值 正式存储到 GPM 控制寄存器中 : 使用 str 指令, 将 r1 中的值 存储到 GPM 控制寄存器中, 代码为
str r1, [r0]
, 解读 : 将 r1 中的值 存储到 r0 指向的地址的内存中 ;
此时还未完成, 如果烧写该程序, 会出现无法点亮 LED 灯的情况, OK6410 开发板还需要进行外设基地址初始化步骤;
###(2) 外设端口基地址初始化
参考手册 : ARM核 手册 Arm1176jzfs.pdf ( 基于 OK6410 开发板 ARM 11 )
- 1.手册对应章节 : ***3 章节 ***;
- 2.S3C6410X.pdf手册下载地址 :
外设端口基地址初始化 步骤 :
- 1.C15 寄存器 ( 外设端口内存映射寄存器 ) 简介 : 控制外设基地址的寄存器的是 C15 寄存器;
- 2.设置汇编模块标号 : 设置一个标号, 方便汇编语句跳转, 代码
set_serial_port :
; - 3.将基地址装载到 r0 寄存器中 : 查找 OK6410 开发板的 外设基地址, 在 S3C6410X.pdf 文档中查询到, 基地址值为
0x70000000
; 使用ldr r0, =0x70000000
语句将基地址值 0x70000000 立即数值 装载到 r0 寄存器中;- ① 语法解析 : 区分
ldr r0, =0x70000000
和ldr r0, 0x70000000
语句, 前者是将 立即数 0x7000000 装载到 r0 寄存器中, 后者是将 数字 0x70000000 的地址 装载到 r0 寄存器中;
- ① 语法解析 : 区分
- 4.设置外设端口内存映射寄存器 值 : 下图的表就是该寄存器设置位说明, 我们要初始化 256M 内存, [4:0] 位 设置成 0b10011, 即 0x13, 整个寄存器的值应该是 0x70000000 与 0x13 进行与操作, 代码为
orr r0, r0, #0x13
;
- 5.将 r0 寄存器中的值传递给 C15 协处理器 : 根据下图 c15 协处理器 的 CRn Op1 CRm Op2 , 使用 mcr 指令, 将 r0 值 传给 c15 寄存器; 语句为
mcr p15, 0, r0, c15, c2, 4
;- ① 语法说明 :
MCR p,o,Rd,CRN,CRM,q
将 rd 寄存器值 传递给 CRN 协处理器,
- ① 语法说明 :
- 6.跳转回原来的位置 :
mov pc, lr
, 该标号处代码执行完毕, 跳转回调用处继续执行下面的内容; - 7.整体代码 :
set_serial_port : ldr r0, =0x70000000 @ 将基地址装载到 r0 寄存器中, 该基地址 在 arm 核 手册中定义 orr r0, r0, #0x13 @ 设置初始化基地址的范围, 将 r0 中的值 与 0x13 立即数 进行或操作, 将结果存放到 r0 中 mcr p15, 0, r0, c15, c2, 4 @ 将 r0 中的值设置给 c15 协处理器 mov pc, lr
###(3) 完整汇编代码
完整汇编代码 : 详细注释版本 ;
@**************************** @File:start.S @ @BootLoader 初始化代码 @**************************** .text @ 宏 指明代码段 .global _start @ 伪指令声明全局开始符号 _start: @ 程序入口标志 b reset @ reset 复位异常 ldr pc, _undefined_instruction @ 未定义异常, 将 _undefined_instruction 值装载到 pc 指针中 ldr pc, _software_interrupt @ 软中断异常 ldr pc, _prefetch_abort @ 预取指令异常 ldr pc, _data_abort @ 数据读取异常 ldr pc, _not_used @ 占用 0x00000014 地址 ldr pc, _irq @ 普通中断异常 ldr pc, _fiq @ 软中断异常 _undefined_instruction: .word undefined_instruction @ _undefined_instruction 标号存放了一个值, 该值是 32 位地址 undefined_instruction, undefined_instruction 是一个地址 _software_interrupt: .word software_interrupt @ 软中断异常 _prefetch_abort: .word prefetch_abort @ 预取指令异常 处理 _data_abort: .word data_abort @ 数据读取异常 _not_used: .word not_used @ 空位处理 _irq: .word irq @ 普通中断处理 _fiq: .word fiq @ 快速中断处理 undefined_instruction: @ undefined_instruction 地址存放要执行的内容 nop software_interrupt: @ software_interrupt 地址存放要执行的内容 nop prefetch_abort: @ prefetch_abort 地址存放要执行的内容 nop data_abort: @ data_abort 地址存放要执行的内容 nop not_used: @ not_used 地址存放要执行的内容 nop irq: @ irq 地址存放要执行的内容 nop fiq: @ fiq 地址存放要执行的内容 nop reset: @ reset 地址存放要执行的内容 bl set_svc @ 跳转到 set_svc 标号处执行 bl set_serial_port @ 设置外设基地址端口初始化 bl disable_watchdog @ 跳转到 disable_watchdog 标号执行, 关闭看门狗 bl disable_interrupt @ 跳转到 disable_interrupt 标号执行, 关闭中断 bl disable_mmu @ 跳转到 disable_mmu 标号执行, 关闭 MMU bl light_led @ 打开开发板上的 LED 发光二极管 set_svc: mrs r0, cpsr @ 将 CPSR 寄存器中的值 导出到 R0 寄存器中 bic r0, r0, #0x1f @ 将 R0 寄存器中的值 与 #0x1f 立即数 进行与操作, 并将结果保存到 R0 寄存器中, 实际是将寄存器的 0 ~ 4 位 置 0 orr r0, r0, #0xd3 @ 将 R0 寄存器中的值 与 #0xd3 立即数 进行或操作, 并将结果保存到 R0 寄存器中, 实际是设置 0 ~ 4 位 寄存器值 的处理器工作模式代码 msr cpsr, r0 @ 将 R0 寄存器中的值 保存到 CPSR 寄存器中 mov pc, lr @ 返回到 返回点处 继续执行后面的代码 #define pWTCON 0x7e004000 @ 定义看门狗控制寄存器 地址 ( 6410开发板 ) disable_watchdog: ldr r0, =pWTCON @ 先将控制寄存器地址保存到通用寄存器中 mov r1, #0x0 @ 准备一个 0 值, 看门狗控制寄存器都设置为0 , 即看门狗也关闭了 str r1, [r0] @ 将 0 值 设置到 看门狗控制寄存器中 mov pc, lr @ 返回到 返回点处 继续执行后面的代码 disable_interrupt: mvn r1,#0x0 @ 将 0x0 按位取反, 获取 全 1 的数据, 设置到 R1 寄存器中 ldr r0,=0x71200014 @ 设置第一个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 str r1,[r0] @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中 ldr r0,=0x71300014 @ 设置第二个中断屏蔽寄存器, 先将 寄存器 地址装载到 通用寄存器 R0 中 str r1,[r0] @ 再将 全 1 的值设置到 寄存器中, 该寄存器的内存地址已经装载到了 R0 通用寄存器中 mov pc, lr @ 返回到 返回点处 继续执行后面的代码 disable_mmu : mcr p15,0,r0,c7,c7,0 @ 设置 I-Cache 和 D-Cache 失效 mrc p15,0,r0,c1,c0,0 @ 将 c1 寄存器中的值 读取到 R0 通用寄存器中 bic r0, r0, #0x00000007 @ 使用 bic 位清除指令, 将 R0 寄存器中的 第 0, 1, 2 三位 设置成0, 代表 关闭 MMU 和 D-Cache mcr p15,0,r0,c1,c0,0 @ 将 R0 寄存器中的值写回到 C1 寄存器中 mov pc, lr @ 返回到 返回点处 继续执行后面的代码 set_serial_port : ldr r0, =0x70000000 @ 将基地址装载到 r0 寄存器中, 该基地址 在 arm 核 手册中定义 orr r0, r0, #0x13 @ 设置初始化基地址的范围, 将 r0 中的值 与 0x13 立即数 进行或操作, 将结果存放到 r0 中 mcr p15, 0, r0, c15, c2, 4 @ 将 r0 中的值设置给 c15 协处理器 mov pc, lr #define GPBCON 0x7F008820 #define GPBDAT 0x7F008824 light_led : ldr r0, =GPBCON @ 将 0x7F008820 GPM 控制寄存器的地址 0x7F008820 装载到 r0 寄存器中 ldr r1, =0x1111 @ 设置 GPM 控制寄存器的行为 为 Output 输出, 即每个对应引脚的设置为 0b0001 值 str r1, [r0] @ 将 r1 中的值 存储到 r0 指向的 GPBCON 0x7F008820 地址的内存中 ldr r0, =GPBDAT @ 将 GPBDAT 0x7F008824 地址值 装载到 r0 寄存器中 ldr r1, =0b110000 @ 计算 GPM 数据寄存器中的值, 设置 0 为 低电平, 设置 1 为高电平, 这里设置 0 ~ 3 位为低电平, 其它为高电平 str r1, [r0] @ 将 r1 中的值 存储到 r0 指向的 GPBDAT 0x7F008824 地址的内存中 mov pc, lr
##2. 链接器脚本
gboot.lds 链接器脚本 代码解析 :
- 1.指明输出格式 ( 处理器架构 ) : 使用
OUTPUT_ARCH(架构名称)
指明***输出格式, 即处理器的架构***, 这里是 arm 架构的,OUTPUT_ARCH(arm)
; - 2.指明输出程序的入口 : 设置编译输出的程序入口位置, 语法为
ENTRY(入口位置)
, 在上面的 Start.S 中设置的程序入口是_start
, 代码为ENTRY(_start)
; - 3.设置代码段 : 使用
.text :
设置代码段; - 4.设置数据段 : 使用
.data :
设置数据段; - 5.设置 BSS 段 : 使用
.bss :
设置 BSS 段;- ( 1 ) 记录 BSS 段的起始地址 :
bss_start = .;
; - ( 2 ) 记录 BSS 段的结束地址 :
bss_end = .;
;
- ( 1 ) 记录 BSS 段的起始地址 :
- 6.对齐 : 每个段都需要设置内存的对齐格式, 使用
. = ALIGN(4);
设置四字节对齐即可; - 7.代码示例 :
OUTPUT_ARCH(arm) /*指明处理器结构*/ ENTRY(_start) /*指明程序入口 在 _start 标号处*/ SECTIONS { . = 0x50008000; /*整个程序链接的起始位置, 根据开发板确定, 不同开发板地址不一致*/ . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ .text : /*代码段*/ { start.o (.text) /*start.S 转化来的代码段*/ *(.text) /*其它代码段*/ } . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ .data : /*数据段*/ { *(.data) } . = ALIGN(4); /*对齐处理, 每段开始之前进行 4 字节对齐*/ bss_start = .; /*记录 bss 段起始位置*/ .bss : /*bss 段*/ { *(.bss) } bss_end = .; /*记录 bss 段结束位置*/ }
##3. Makefile 编译脚本
makefile 文件编写 :
- 1.通用规则 ( 汇编文件编译规则 ) : 汇编文件 编译 成同名的 .o 文件, 文件名称相同, 后缀不同,
%.o : %.S
, 产生过程是arm-linux-gcc -g -c $^
, 其中^
标识是所有的依赖文件, 在该规则下 start.S 会被变异成 start.o ; - 2.通用规则 ( C 文件编译规则 ) : C 代码编译成同名的 .o 文件,
%.o : %.c
, 产生过程是arm-linux-gcc -g -c $^
; - 3.设置最终目标 : 使用
all:
设置最终编译目标;- ( 1 ) 依赖文件 : 产生最终目标需要依赖 start.o 文件, 使用
all: start.o
表示最终目标需要依赖该文件; - ( 2 ) 链接过程 :
arm-linux-ld -Tgboot.lds -o gboot.elf $^
, 需要使用链接器脚本进行连接, ①链接工具是 arm-linux-ld 工具, ②使用-Tgboot.lds
设置链接器脚本 是刚写的 gboot.lds 链接器脚本, ③输出文件是 gboot.elf 这是个中间文件, ④ 依赖文件是$^
代表所有的依赖; - ( 3 ) 转换成可执行二进制文件 :
arm-linux-objcopy -O binary gboot.elf gboot.bin
, 使用-O binary
设置输出二进制文件, 依赖文件是gboot.elf
, 输出的可执行二进制文件 即 结果是gboot.bin
;
- ( 1 ) 依赖文件 : 产生最终目标需要依赖 start.o 文件, 使用
- 4.makefile 文件内容 :
all: start.o #依赖于 start.o arm-linux-ld -Tgboot.lds -o gboot.elf $^ #使用链接器脚本, 将 start.o 转为 gboot.elf arm-linux-objcopy -O binary gboot.elf gboot.bin #将 gboot.elf 转化为可以直接在板子上执行的 gboot.bin 文件 %.o : %.S #通用规则, 如 start.o 是由 start.S 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^ %.o : %.c #通用规则, 如 start.o 是由 start.c 编译来的, -c 是只编译不链接 arm-linux-gcc -g -c $^ .PHONY: clean clean: #清除编译信息 rm *.o *.elf *.bin
##4. 编译输出可执行文件
编译过程 :
- 1.文件准备 : 将 汇编代码 ( start.S ) 链接器脚本 ( gboot.lds ) makefile 文件 拷贝到编译目录 ;
- 2.执行编译命令 :
make
; - 3.编译结果 : 可以看到 生成了 编译目标文件 start.o, 链接文件 gboot.elf, 可执行的二进制文件 gboot.bin ;
##5. 烧写代码到开发板并执行
###( 1 ) OK6410 开发板启动切换方式
OK6410 开发板启动切换方式 : 通过控制 开发板右侧的 8个开关来设置启动来源;
- 1.sd 卡启动 : (1~8) 位置 : 0, 0, 0, 1, 1, 1, 1, 1;
- 2.nand flash 启动 : (1~8) 位置 : x, x, x, 1, 1, 0, 0, 1;
- 3.nor flash 启动 : (1~8) 位置 : x, x, x, 1, 0, 1, 0, x;
###( 2 ) 制作 SD 卡启盘 并 准备程序
制作 SD 卡启动盘 :
- 1.找到开发板的烧写工具 : OK6410-A 开发板的烧写工具 在开发光盘 A 的 OK6410-A-1G用户光盘(A)-20160812\Linux-3.0.1\Linux烧写工具 目录下, 开发板光盘资料下载地址 ;
- 2.设置 SD_Writer.exe 属性 ( win10系统需要进行的设置 ) : 右键点击属性, 在兼容性一栏, 设置 以 Windows 7 兼容模式运行, 并设置 以管理员身份运行此程序 ;
- 3.先格式化 SD 卡 : 注意这里要使用 SD_Writer 中的 format 功能进行格式化 , 按照下面的步骤, 一步一步点击确定执行 ;
- 4.选择要烧写的文件 : 这里选择 OK6410-A-1G用户光盘(A)-20160812\Linux-3.0.1\Linux烧写工具\mmc_ram256.bin 文件;
- 5.烧写文件到 SD 卡中 : 直接点击 Program 按钮, 就将启动程序烧写到了 SD 卡中;
- 6.准备 LED 灯程序 : 将编译出的 gboot.bin 文件名修改成 u-boot.bin, 必须修改成该文件名, 否则无法烧写上去;
- 7.将程序拷贝到 SD 卡中 : 将程序直接拷贝到 SD 卡中即可;
参考资料 : OK6410烧写裸板程序方法
这是之前写过的博客, 仅作为参考;
###( 3 ) SecureCRT 连接开发板并烧写程序
SecureCRT 连接开发板并烧写程序 步骤 :
- 1.硬件连接操作 : 使用 USB 转 串口工具 将电脑 与 开发板链接, USB 插在电脑端, 串口端插在 开发板上, 插上电源适配器, 但是不要打开电源开关;
- 2.开发板设置 : 将开发板右侧的开关设置成 SD 卡启动, 即 (1~8) 位置 : 0, 0, 0, 1, 1, 1, 1, 1; 该步骤很重要;
- 2.查询串口端口号 : 在设备管理器中查看串口端口号, 这里可以看到是 COM9;
- 3.SecureCRT 连接串口 : 打开 SecureCRT 软件, 点击快速连接, 然后在弹出的对话框中按照下面进行配置, ① 首先要选择 Serial 协议, ② 然后选择端口, 这个端口从设备管理器中查看, ③ 波特率选择 115200, ④ 取消 RTS/CTS 选项;
- 4.打开开发板 ( 很重要 ) : 选中 SecureCRT 软件, 然后按住空格键不放, 这个操作很重要, 打开开发板开关, ① 先按住空格键, ②再打开开关;
- 5.首先格式化 Nand Flash : 选择 [1] 选项, 格式化 Nand Flash;
- 6.选择从 SD 卡中烧写 : 选择 [2] Burn image from SD card 选项, 从 SD 卡中向开发板烧写程序;
- 7.选择烧写 u-boot : 选择 [2] Flash u-boot, 烧写 u-boot, 会从 SD 卡中查找 u-boot.bin 文件, 然后烧写到 nand flash 中, 如果 SD 卡中 没有 u-boot.bin 会报错;
- 8.设置从 Nand Flash 启动 : 设置开发板上的启动开关, (1~8) 位置 : x, x, x, 1, 1, 0, 0, 1; 此时 四个 LED 全亮;
- 9.效果展示 : 设置的 GPBDAT 寄存器值为 0b110000, 四个 LED 灯都亮起来;
- 10.修改 LED 灯显示参数后显示结果 : 设置 GPBDAT 寄存器中值为 0b110101 是 第一个 和 第三个 LED 亮起来;
本博客的参考文章及相关资料下载 :
- 1.本博客代码及参考手册下载 : https://download.csdn.net/download/han1202012/10573310
-
光敏二极管与发光二极管有什么区别
2020-07-11 19:58:45今天我们就来了解一下光敏二极管工作原理,看看它是怎么为人们提供便利的。 光敏二极管简介 相信有很多的读者并不知道光敏二极管是什么物件。通常人们又将光敏二极管叫做光电二极管。它与半导体二极管在结构上是... -
LED光源的发光机理简介
2020-07-24 23:54:30发光二极管是一种新型固态冷光源,LED的最显著特点是使用寿命长,光电转换效能高、抗震性能好、使用方便等优点,在照明系统中的应用越来越广泛。在同样照度下,LED灯的电能消耗和寿命比白炽灯和日光灯都有明显的优势... -
电源技术中的简介LED手电筒驱动电路工作原理
2020-10-22 12:59:29LED = Light Emitting Diode,发光二极管,是一种能够将电能转化为可见光的固态的半导体器件,它可以直接把电转化为光;LED = Large Electronic Display,大型电子展示;LED = Lupus erythematosus disseminatus,播... -
红外二极管发射电路图大全
2020-07-14 07:03:52声光报警模块由蜂鸣器、(红,绿)发光二极管和NPN型三极管驱动电路组成,具体电路图如图5所示。 红外二极管发射电路图(二) 如图所示,图是红外线遥控接收装置实例。红外线传感器有多种,这里选用光电二极管... -
基础电子中的光发射器件简介
2020-11-13 23:21:41用半导体材料制作的光发射器件一般分为两类:半导体...有关发光二极管的机构和原理将在第2章中详细描述。一般来说,发光二极管经常被用在光通信中作为光源。由于发光二极管的功耗小,照明用的发光二极管是科学家们目 -
【STM32】OLED简介
2020-09-04 15:14:09OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可...00. 目录
01. OLED概述
OLED,即有机发光二极管(Organic Light-Emitting Diode),又称为有机电激光显示(OrganicElectroluminesence Display, OELD)。OLED 由于同时具备自发光,不需背光源、对比度高、厚度薄、视角广、反应速度快、可用于挠曲性面板、使用温度范围广、构造及制程较简单等优异之特性,被认为是下一代的平面显示器新兴应用技术。
LCD 都需要背光,而 OLED 不需要,因为它是自发光的。这样同样的显示,OLED 效果要来得好一些。以目前的技术,OLED 的尺寸还难以大型化,但是分辨率确可以做到很高。
02. OLED特性参数
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款小尺寸(0.96 寸)、高亮、自带升压电路的高性能 OLED 显示模块,分辨率为 128*64,该模块采用原装维信诺高亮 OLED 屏,采用SSD1306 驱动 IC,该芯片内部集成 DCDC 升压,仅需 3.3V 供电,即可正常工作,无需用户再添加升压 DCDC 电路。
模块支持:8 位 6800 并口、8 位 8080 并口、IIC 以及 4 线 SPI 等 4 种通信接口,通过模块背面的 BS1,BS2 焊盘,可以自行设置模块的接口方式。默认为:8 位 8080 并口。该模块各参数如表 1.1 和表 1.2 所示:
ATK0.96’ OLED 模块支持多种通信接口,通过模块背面的 BS1,BS2,可以自行设置模块的通信接口方式,见表 1.3:
03. OLED模块描述
ATK-0.96’ OLED 模块是 ALIENTEK 推出的一款高性能 OLED 显示模块,尺寸小巧(27mm*26mm),结构紧凑,模块通过 1 个 2*8P 的 2.54mm 间距排针与外部连接,模块外观如图 2.1.1 所示:
该模块具有如下特点:
双色可选,提供纯蓝色或黄蓝双色两种模块
高分辨率,分辨率为:128*64
超小尺寸,OLED 显示屏为 0.96 寸,模块尺寸仅为 27mm*26mm
多种接口方式,提供 8086 并口、6800 并口、4 线 SPI 和 IIC 等五种接口方式
集成 DCDC,无需外部高压,仅需提供 3.3V 电源,即可正常工作
图 2.1.1 中,左侧的图片是模块的背面图,右侧的是正面图。04. OLED模块原理图
05. OLED模块引脚说明
ATK-0.96’ OLED 模块通过 2*8 的 2.54 排针同外部单片机通信,各引脚的详细描述如下表所示
温馨提示
模块在使用 IIC 模式或者 4 线 SPI 模式的时候,是不支持读操作的,所以如果你需要读操作,只能选择 6800 或者 8080 并口模式。模块默认是:8080 并口模式,大家根据自己选择的接口模式,来接线。
06. OLED模块使用
ATK-0.96’ OLED 模块的控制器是 SSD1306,支持多种接口方式,我们模块支持 4 种连接方式,这里我们介绍其中 8080 并口模式。
8080并口模式
ATK-0.96’ OLED 模块支持 8 位 8080 并口模式,总共需要 13 根信号线通信,这些信号线如下:
- CS:OLED 片选信号。
- WR(RW):向 OLED 写入数据。
- RD:从 OLED 读取数据。
- D[7:0]:8 位双向数据线。
- RST(RES):硬复位 OLED。
- DC:命令/数据标志(0,读写命令;1,读写数据)。
模块的 8080 并口读/写的过程为:先根据要写入/读取的数据的类型,设置 DC 为高(数据)/低(命令),然后拉低片选,选中 SSD1306,接着我们根据是读数据,还是要写数据置RD/WR 为低,然后:
在 RD 的上升沿, 使数据锁存到数据线(D[7:0])上;
在 WR 的上升沿,使数据写入到 SSD1306 里面;
SSD1306 的 8080 并口写时序如图所示:
SSD1306 的 8080 并口读时序如图 2.3.1.2 所示:
SSD1306 的 8080 接口方式下,控制脚的信号状态所对应的功能如表所示:
注 1:H 代表高电平(VCC),L 代表低电平(GND),↑代表上升沿。
在 8080 方式下读数据操作的时候,我们有时候(例如读显存的时候)需要一个假读命(Dummy Read),以使得微控制器的操作频率和显存的操作频率相匹配。在读取真正的数据之前,由一个的假读的过程。这里的假读,其实就是第一个读到的字节丢弃不要,从第二个开始,才是我们真正要读的数据。
一个典型的读显存的时序图,如图所示:
可以看到,在发送了列地址之后,开始读数据,第一个是 Dummy Read,也就是假读,我们从第二个开始,才算是真正有效的数据。
显存
SSD1306 的显存总共为 128*64bit 大小,SSD1306 将这些显存分为了 8 页,其对应关系如表所示:
SSD1306 的每页包含了 128 个字节,总共 8 页,这样刚好是 128*64 的点阵大小。因为每次写入都是按字节写入的,这就存在一个问
题,如果我们使用只写方式操作模块,那么,每次要写 8 个点,这样,我们在画点的时候,就必须把要设置的点所在的字节的每个位都搞
清楚当前的状态(0/1?),否则写入的数据就会覆盖掉之前的状态,结果就是有些不需要显示的点,显示出来了,或者该显示的没有显
示了。这个问题在能读的模式下,我们可以先读出来要写入的那个字节,得到当前状况,在修改了要改写的位之后再写进 GRAM,这样就
不会影响到之前的状况了。但是这样需要能读 GRAM,对于 4 线 SPI 模式或者 IIC 模式来说,模块是不支持读的,而且读->改->写的方式
速度也比较慢。
我们推荐采用的办法是在单片机的内部建立一个 OLED 的 GRAM(需要 128*8 个字节),在每次修改的时候,只是修改单片机上的 GRAM(实际上就是 SRAM),在修改完了之后,一次性把单片机内部的 GRAM 写入到 OLED 的 GRAM。当然这个方法也有坏处,就是对于那些 SRAM 很小的单片机(比如 51 系列)就比较麻烦了,如果内存不够,那就推荐还是采用并口模式,这样可以节约内存。
指令
SSD1306 的指令比较多,这里我们仅介绍几个比较常用的命令
第一个命令为 0X81,用于设置对比度的,这个命令包含了两个字节,第一个 0X81 为命令,随后发送的一个字节为要设置的对比度的值。这个值设置得越大屏幕就越亮。
第二个命令为 0XAE/0XAF。0XAE 为关闭显示命令;0XAF 为开启显示命令。
第三个命令为 0X8D,该指令也包含 2 个字节,第一个为命令字,第二个为设置值,第二个字节的 BIT2 表示电荷泵的开关状态,该位为 1,则开启电荷泵,为 0 则关闭。在模块初始化的时候,这个必须要开启,否则是看不到屏幕显示的。
第四个命令为 0XB0~B7,该命令用于设置页地址,其低三位的值对应着 GRAM 的页地址。
第五个指令为 0X00~0X0F,该指令用于设置显示时的起始列地址低四位。
第六个指令为 0X10~0X1F,该指令用于设置显示时的起始列地址高四位。
其他命令,我们就不在这里一一介绍了,大家可以参考 SSD1306 datasheet 的第 28 页。从这页开始,对 SSD1306 的指令有详细的介绍。
07. 附录
7.1 【STM32】STM32系列教程汇总
08. 声明
该教程参考了正点原子的《STM32 F4 开发指南》
-
日嘉新光光耦的工作原理
2021-01-20 07:10:57图三 光电耦合器之内部结构图 双发光二极管输入 三极管接收型 4脚封装 图四 光电耦合器之内部结构图 可控硅接收型 6脚封装 图五 光电耦合器之内部结构图 双二极管接收型 6脚封装 -
共阴数码管与共阳数码管工作原理有什么不同
2020-06-05 11:24:03数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4...数码管简介
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。
数码管分类
数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
数码管应用范围
数码管是显示屏其中一类, 通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数。
由于它的价格便宜 使用简单 在电器特别是家电领域应用极为广泛,空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
数码管的工作原理
共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
什么是共阴/阳数码管
一只数码管的每一个段划都由一个发光二极管点亮,所以,一位数码管有7个发光二极管构成(如果加上小数点,就有8个)。如果这8个发光二极管的阴极(负极)都连在一起,就叫“共阴数码管”;如果这8个发光二极管的阳极(正极)都连在一起,就叫“共阳数码管”。
共阴数码管与共阳数码管工作原理不同之处
1、共阴数码管与共阳数码管工作原理的不同表现在:数码管由七个条状和一个点状发光二极管管芯制成,称为七段数码管。根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。 共阳共阴,是针对数码管的公共脚而说的。典型的一位数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极。共阳,也就是说公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合成数字或字母。共阴是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮。
2、共阳极数码管是指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制。共阴极数码管是指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制。
-
个人简介系统
2014-04-06 23:24:52利用微机原理试验箱的8255单元和16X16发光二极管矩阵,动态显示汉字及字符。 -
亿光发射管简介
2021-01-20 06:02:17亿光发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。亿光红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装 亿光发射管参数介绍 ... -
basys2数码管共阳还是共阴_共阴数码管与共阳数码管工作原理有什么不同
2020-12-23 20:28:49数码管简介数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示...数码管简介
数码管是一种半导体发光器件,其基本单元是发光二极管。数码管按段数可分为七段数码管和八段数码管,八段数码管比七段数码管多一个发光二极管单元,也就是多一个小数点(DP)这个小数点可以更精确的表示数码管想要显示的内容;按能显示多少个(8)可分为1位、2位、3位、4位、5位、6位、7位等数码管。
数码管分类
数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。
按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。
数码管应用范围
数码管是显示屏其中一类, 通过对其不同的管脚输入相对的电流,会使其发亮,从而显示出数字能够显示 时间、日期、温度等所有可用数字表示的参数。
由于它的价格便宜 使用简单 在电器特别是家电领域应用极为广泛,空调、热水器、冰箱等等。绝大多数热水器用的都是数码管,其他家电也用液晶屏与荧光屏。
数码管的工作原理
共阳极数码管的8个发光二极管的阳极(二极管正端)连接在一起。通常,公共阳极接高电平(一般接电源),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为低电平时,则该端所连接的字段导通并点亮。根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能吸收额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
共阴极数码管的8个发光二极管的阴极(二极管负端)连接在一起。通常,公共阴极接低电平(一般接地),其它管脚接段驱动电路输出端。当某段驱动电路的输出端为高电平时,则该端所连接的字段导通并点亮,根据发光字段的不同组合可显示出各种数字或字符。此时,要求段驱动电路能提供额定的段导通电流,还需根据外接电源及额定段导通电流来确定相应的限流电阻。
什么是共阴/阳数码管
一只数码管的每一个段划都由一个发光二极管点亮,所以,一位数码管有7个发光二极管构成(如果加上小数点,就有8个)。如果这8个发光二极管的阴极(负极)都连在一起,就叫“共阴数码管”;如果这8个发光二极管的阳极(正极)都连在一起,就叫“共阳数码管”。
共阴数码管与共阳数码管工作原理不同之处
1、共阴数码管与共阳数码管工作原理的不同表现在:数码管由七个条状和一个点状发光二极管管芯制成,称为七段数码管。根据其结构的不同,可分为共阳极数码管和共阴极数码管两种。 共阳共阴,是针对数码管的公共脚而说的。典型的一位数码管,一般有10个脚,8个段码(7段加1个小数点),剩下两个脚接在一起。各个段码实际上是一个发光二极管,既然是发光二极管,就有正负极。共阳,也就是说公共脚是正极(阳极),所有的段码实际上是负极,当某一个或某几个段码位接低电平,公共脚接高电平时,对应的段码位就能点亮,进而组合成数字或字母。共阴是公共脚是负极(阴极),段码位是阳极,当公共脚接地,段码位接高电平时,对应段码位点亮。
2、共阳极数码管是指八段数码管的八段发光二极管的阳极(正极)都连在一起,而阴极对应的各段可分别控制。共阴极数码管是指八段数码管的八段发光二极管的阴极(负极)都连在一起,而阳极对应的各段分别控制。
打开APP阅读更多精彩内容
点击阅读全文
-
51摇摇棒的简介与改字详解
2018-10-16 22:07:3651摇摇棒:“摇摇棒”是基于人的视觉暂留原理的,通过分时刷新16个发光二极管来显示输出文字或图案等信息的显示装置。输出信号频率的控制通过单片机来实现,用摇动传感器检测当前摇动状态。当进行摇动时,由于人的... -
基础电子中的亿光发射管简介
2020-10-21 00:51:01亿光发射管的结构、原理与普通发光二极管相近,只是使用的半导体材料不同。亿光红外发光二极管通常使用砷化镓(GaAs)、砷铝化镓(GaAlAs)等材料,采用全透明或浅蓝色、黑色的树脂封装 亿光发射管参数介绍 ... -
ROHM四方向传感器RPI-1031简介
2013-01-10 09:29:391.通过光学原理实现:内部有发光二极管一个,光敏接收三极管两个;另外有一颗圆柱型的遮光物;如图所示: 对应的电路图如下: 2.通过圆柱型遮光物实现遮挡发光二极管和光敏接收管来检测RPI-1031 -
OLED原理,时序和操作
2016-11-03 16:11:59一,OLED简介OLED,即有机发光二极管,采用非常薄的有机材料图层和玻璃基板制成 当有电流通过时,有机材料会发光,OLED屏幕可视角度大,节省电能优点:分辨率高,自发光,不需背光源,对比度高,厚度薄,视角广,反应速度快,温度... -
光纤通信原理与系统 高清带书签
2018-10-04 17:26:563.2.2 发光二极管的主要特性 80 3.3 半导体激光器的工作原理与结构 83 3.3.1 半导体激光器的工作原理 83 3.3.2 半导体激光器的结构 87 3.4 半导体激光器的工作特性 93 3.4.1 P-1 特性 93 3.4.2 模式特性与线宽 96 ... -
OLED原理、时序和操作+自己源码程序
2018-03-11 18:15:27转载博客:http://blog.csdn.net/abap_brave/article/details/53022540一,OLED简介OLED,即有机发光二极管,采用非常薄的有机材料图层和玻璃基板制成 当有电流通过时,有机材料会发光,OLED屏幕可视角度大,节省电能优点... -
10天学会AVR——DS1302的工作原理,程序,课件
2009-03-29 19:03:563、首先点亮一个发光二极管,然后让一个二极管亮灭变化。 4、编写函数证明573的工作原理:锁住后不导通就不能再更新数据。 5、编写延时函数,软件仿真查看延时的精确时间 6、子函数的编写(分带形参和不带形参)。 7... -
微机原理课程设计交通灯
2009-06-15 12:03:502) 发光二极管闪烁程序..................... 14 3) 源程序................................ 15 (四) 测试.................................... 21 1. 在测试中遇到的问题记录..................... 21 2. ... -
高亮LED应急灯简介及改进方法
2021-01-19 20:03:27在与人们工作生活密切相关的照明光源产业,业界也一直在积极探索研发,技术不断改进革新,特别是近年来出现的高亮发光二极管(LED),由于具有体积小、寿命长、耗电量少、发热量低、无交流闪烁、启动速度快、电磁干扰... -
液晶显示器的设计与工作原理
2009-07-03 11:17:46对液晶显示器的介绍,简介,特点,工作原理等。LCD就是常见的液晶显示器。LED是指二极管,特指会发光的发光二级管。液晶显示由于液晶本身不会发光,所以必须使用背光源照亮画面。目前使用的最新光源就是LCD光源,... -
显示/光电技术中的高亮LED应急灯简介及改进方法
2020-11-07 00:09:47在与人们工作生活密切相关的照明光源产业,业界也一直在积极探索研发,技术不断改进革新,特别是近年来出现的高亮发光二极管(LED),由于具有体积小、寿命长、耗电量少、发热量低、无交流闪烁、启动速度快、电磁干扰... -
反应测试_反应能力测试器电路
2020-12-23 10:19:51反应能力测试器可用来...反应能力测试器原理简介从原理图中可以看出,这个电路利用十进制计数器4017的输出端驱动一组发光二极管,采用时钟脉冲发生器驱动计数器,使它的输出端不断循环地变换输出,发光二极管轮流... -
跟我学51单片机(五):单片机动态扫描驱动数码管
2021-01-19 18:58:53二、原理简介 常用的段式数码管有七段式和八段式,八段比七段多了一个小数点,其他的基本相同。所谓的几段就是指数码管里有相应的几个小LED 发光二极管,通过控制不同的LED 的亮灭来显示出不同的字形(见图1(a... -
单片机与DSP中的跟我学51单片机(五):单片机动态扫描驱动数码管
2020-10-23 04:01:28二、原理简介 常用的段式数码管有七段式和八段式,八段比七段多了一个小数点,其他的基本相同。所谓的几段就是指数码管里有相应的几个小LED 发光二极管,通过控制不同的LED 的亮灭来显示出不同的字形(见图1(a... -
方向传感器
2009-12-19 17:27:00通过光学原理实现:内部有发光二极管一个,光敏接收三极管两个;另外有一颗圆柱型的遮光物;如图所示:对应的电路图如下:2.通过圆柱型遮光物实现遮挡发光二极管和光敏接收管来检测RPI-1031当前所处的状态;3.当RPI-... -
lled灯怎么接线
2021-01-19 19:21:23二、LED灯具的特性 LED灯珠是属于发光二极管的一种,能够将电能转化为光能的半导体,它改变了白炽灯钨丝发光与节能灯三基色粉发光的原理,而采用电场发光。LED灯具可采用直流DC220V电压,不需要启辉器和镇流器。... -
疯壳AI开源无人机GPIO(LED航情灯、信号灯控制)
2020-05-15 17:02:18LED(Light Emitting Diode)即为发光二极管的缩写。LED是一种在生活中非常常见的照明发光器件。LED的在我们生活中形态种类非常的多,如下图所示。 尽管LED在我们生活...