本文使用的开发板是九鼎创展的X210 iNand版本。
一、查阅原理图,了解板载LED的硬件接法
从以上LED的原理图上,我们发现开发板上一共有5颗LED,其中一颗D26的接法是:正极接5V,负极接地。因此D26这颗LED只要上电就会常亮,所以这颗LED是电源指示灯。
剩下4颗LED的接法是:正极接3.3V,负极接了SoC上的一个引脚(GPIO)。
具体的详细接法如下:
D22:GPJ0_3
D23:GPJ0_4
D24:GPJ0_5
D25:PWMTOUT1(GPD0_1)
二、查阅数据手册中GPJ0的相关部分
由上图可知,GPJ0相关的寄存器包括六个:GPJ0CON、GPJ0DAT、GPJ0PUD、GPJ0DRV、GPJ0CONPDN、GPJ0PUDPDN。实际上真正控制LED的主要是GPJ0CON、GPJ0DAT这两个。
点亮LED,主要的步骤是:
1、GPJ0CON寄存器中,选中Output模式
2、GPJ0DAT寄存器中,相应的位设置为0
由上图可以得出以下几点信息:
(1)GPJ0一共有8个引脚,分别记作GPJ0_0 ~ GPJ0_7。
(2)GPJ0CON寄存器每个引脚占4位,例如GPJ0_0对应的bit位为bit0 ~ bit3,GPJ0_3对应的bit位为bit12 ~ bit15。给相应的寄存器位写入相应的值,该引脚硬件就会按照相应的模式去工作,例如给bit12 ~ bit15写入0001,GPJ0_3引脚就成为输出模式了。
(3)GPJ0CON寄存器的地址是0xE0200240,GPJ0DAT寄存器的地址是0xE0200244。
(4)低电平亮、高电平灭。
三、代码结构
(1)Makefile:编译时使用make得到led.bin(USB启动下载的镜像)和210.bin(SD卡启动下载的镜像)。
led.bin: start.o arm-linux-ld -Ttext 0x0 -o led.elf $^ arm-linux-objcopy -O binary led.elf led.bin arm-linux-objdump -D led.elf > led_elf.dis gcc mkv210_image.c -o mkx210 ./mkx210 led.bin 210.bin %.o : %.S arm-linux-gcc -o $@ $< -c %.o : %.c arm-linux-gcc -o $@ $< -c clean: rm *.o *.elf *.bin *.dis mkx210 -f
(2)mkv210_image.c:为BL1添加校验头,由led.bin加工得到210.bin。
#include <stdio.h> #include <string.h> #include <stdlib.h> #define BUFSIZE (16*1024) #define IMG_SIZE (16*1024) #define SPL_HEADER_SIZE 16 #define SPL_HEADER " S5PV210 HEADER " int main (int argc, char *argv[]) { FILE *fp; char *Buf, *a; int BufLen; int i; int nbytes, fileLen; unsigned int checksum, count; // 1. 3个参数 if (argc != 3) { printf("Usage: %s <source file> <destination file>\n", argv[0]); return -1; } // 2. 分配16K的buffer BufLen = BUFSIZE; Buf = (char *)malloc(BufLen); if (!Buf) { printf("Alloc buffer failed!\n"); return -1; } memset(Buf, 0x00, BufLen); // 3. 读源bin到buffer // 3.1 打开源bin fp = fopen(argv[1], "rb"); if(fp == NULL) { printf("source file open error\n"); free(Buf); return -1; } // 3.2 获取源bin长度 fseek(fp, 0L, SEEK_END); // 定位到文件尾 fileLen = ftell(fp); // 得到文件长度 fseek(fp, 0L, SEEK_SET); // 再次定位到文件头 // 3.3 源bin长度不得超过16K-16byte count = (fileLen < (IMG_SIZE - SPL_HEADER_SIZE)) ? fileLen : (IMG_SIZE - SPL_HEADER_SIZE); // 3.4 buffer[0~15]存放" S5PV210 HEADER " memcpy(&Buf[0], SPL_HEADER, SPL_HEADER_SIZE); // 3.5 读源bin到buffer[16] nbytes = fread(Buf + SPL_HEADER_SIZE, 1, count, fp); if (nbytes != count) { printf("source file read error\n"); free(Buf); fclose(fp); return -1; } fclose(fp); // 4. 计算校验和 // 4.1 从第16byte开始统计buffer中共有几个1,把buffer中所有的字节数据加和起来得到的结果 a = Buf + SPL_HEADER_SIZE; for(i = 0, checksum = 0; i < IMG_SIZE - SPL_HEADER_SIZE; i++) checksum += (0x000000FF) & *a++; // 4.2 将校验和保存在buffer[8~15] a = Buf + 8; // Buf是210.bin的起始地址,+8表示向后位移2个字,也就是说写入到第3个字 *( (unsigned int *)a ) = checksum; // 5. 拷贝buffer中的内容到目的bin // 5.1 打开目的bin fp = fopen(argv[2], "wb"); if (fp == NULL) { printf("destination file open error\n"); free(Buf); return -1; } // 5.2 将16k的buffer拷贝到目的bin中 a = Buf; nbytes = fwrite( a, 1, BufLen, fp); if (nbytes != BufLen) { printf("destination file write error\n"); free(Buf); fclose(fp); return -1; } free(Buf); fclose(fp); return 0; }
(3)start.S:控制LED的汇编源代码。
四、编码控制LED
1、点亮中间一颗LED(GPJ0_4)
#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start _start: // 把所有引脚都设置为输出模式 ldr r0, =0x11111111 ldr r1, =GPJ0CON str r0, [r1] // 把中间一颗LED(GPJ0_4)的输出设置为0,其余两颗设置为1,剩下的其它位不管 ldr r0, =((1<<3) | (1<<5)) ldr r1, =GPJ0DAT str r0, [r1] b .
2、LED闪烁效果
#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start _start: // 把所有引脚都设置为输出模式 ldr r0, =0x11111111 ldr r1, =GPJ0CON str r0, [r1] flash: // 全部点亮 ldr r0, =((0<<3) | (0<<4) | (0<<5)) ldr r1, =GPJ0DAT str r0, [r1] // 延时 bl delay // 使用bl进行函数调用 // 全部熄灭 ldr r0, =((1<<3) | (1<<4) | (1<<5)) ldr r1, =GPJ0DAT str r0, [r1] // 延时 bl delay b flash // 延时函数 delay: ldr r2, =9000000 ldr r3, =0x0 delay_loop: sub r2, r2, #1 // r2 = r2 -1 cmp r2, r3 // cmp会影响Z标志位,如果r2等于r3则Z=1,下一句中eq就会成立 bne delay_loop mov pc, lr // 函数调用返回
3、流水灯效果
#define GPJ0CON 0xE0200240 #define GPJ0DAT 0xE0200244 .global _start _start: // 把所有引脚都设置为输出模式 ldr r0, =0x11111111 ldr r1, =GPJ0CON str r0, [r1] flash: // 点亮LED1(GPJ0_3),其它熄灭 ldr r0, =~(1<<3) ldr r1, =GPJ0DAT str r0, [r1] bl delay // 点亮LED2(GPJ0_4),其它熄灭 ldr r0, =~(1<<4) ldr r1, =GPJ0DAT str r0, [r1] bl delay // 点亮LED3(GPJ0_5),其它熄灭 ldr r0, =~(1<<5) ldr r1, =GPJ0DAT str r0, [r1] bl delay b flash // 延时函数 delay: ldr r2, =9000000 ldr r3, =0x0 delay_loop: sub r2, r2, #1 cmp r2, r3 bne delay_loop mov pc, lr
相关推荐
将由浅入深,带领大家学习 STM32F103 的基础,为您开启全新的 STM32 之旅。 常用开发软件的使用以及一些下载调试的技巧,并详细列出... 主要通过实例(绝大部分是直接操作库函数完成的)带领大家一步步深入了解STM32F1
以下是一步步的详细步骤和涉及的知识点: 1. **硬件分析**: - **查看原理图**:首先,我们需要查看TQ2440底板和核心板的原理图,找出按键和LED的连接线路。在图-2中,我们能看到LED_1至LED_4以及按键的电路设计。...
* 点亮一个LED * 串口通信 知识点六:Python基础 * Python的Hello World程序的编写和执行 * Python的代码风格 * Python的算法 * Python的实用主义哲学 知识点七:Raspberry Pi基础 * Raspberry Pi的初始化 * ...
旋转LED是一种通过单片机控制LED灯以产生旋转效果的装置,这通常通过快速切换点亮LED灯来实现。这种技术可以用来创造视觉上的连续旋转效果,例如在显示灯带、广告屏或信号灯等应用场景中。原理上,旋转LED需要以下...
2. 设计工程:在新建工程向导中,一步步指定工作库文件夹、工程名以及顶层文件实体名,如led_test。 3. 添加设计文件:目前可能还没有输入文件,但随着设计的进行,需要将VHDL源代码文件添加到工程中。 4. 选择...
这些文件可以帮助我们一步步地了解如何设计和实现一个流水灯程序,包括理解端口操作、定时器设置、中断处理等相关知识,并通过Proteus仿真来直观地看到结果。 总结来说,这个资源包提供了从理论到实践的完整学习...
实验:点亮LED/交通灯/激光头传感器/按键传感器检测/电容触摸检测/避障传感器检测/巡线传感器/光折断计数/倾斜模块的原理/碰撞传感器的原理/霍尔传感器/干簧管检测/人体红外检测/有源蜂鸣器播放声音/8002b功放传感器...
标题“TIMER0控制四只LED滚动闪烁.rar”指的是一个与51单片机相关的项目,其中涉及使用...为了更深入地理解这个项目,建议打开压缩包中的源代码和仿真文件,一步步跟踪程序的执行流程,分析和理解每一段代码的功能。
- 循环执行阶段(`loop()`):逐个点亮管脚2至7上的LED,并在点亮后延时100毫秒。 **扩展应用**: - 通过调整代码中的`BASE`值,可以测试剩余的数字I/O管脚(8至13)。 --- #### Arduino数字I/O输入详解 **数字I/O...
单片机控制的发光二极管流水灯是一...从`01-发光二极管(流水灯)`的文件来看,这可能是一个逐步引导的教程,从最基础的LED控制开始,一步步教你实现流水灯效果。建议按照教程步骤操作,理论结合实践,以加深理解和掌握。
Keil则主要用于编写和编译源代码,其集成的调试器可以在代码中设置断点,观察变量状态,一步步跟踪程序执行过程。 在设计过程中,还需要考虑以下几点: 1. 安全性:确保电路设计中没有短路或过载的风险。 2. 稳定性...
通过新建项目向导,学习者可以一步步创建工程,指定工程路径、名称、顶层实体,并选择目标器件(如EP2C5T144C8),最后配置EDA工具设置。 在编程阶段,使用的是VHDL语言,这是一种硬件描述语言,用于定义电路的行为...
在实验步骤的指引下,学生可以一步步实现从电路搭建到程序开发的全过程。通过仿真软件的运行,可以看到8个LED灯按照预设的循环顺序依次亮起,从而验证了程序的正确性和电路的稳定性。实验过程中,学生需要运用细致的...
- 设置GPFDAT寄存器,输出低电平点亮LED灯。 - **C语言实现**: - 同样地,也需要初始化GPFCON寄存器。 - 修改GPFDAT寄存器的值,控制LED灯的状态。 #### 5. Makefile文件 为了方便编译和管理代码,通常会编写一...
课程带原理图和代码详解,一步步带你玩转Arduino;实验内容:点亮LED/交通灯/激光头传感器/按键传感器检测/电容触摸检测/避障传感器检测/巡线传感器/光折断计数/倾斜模块的原理/碰撞传感器的原理/霍尔传感器/干簧管...
8x8矩阵灯驱动程序是电子工程领域中常见的一个项目,尤其在Arduino爱好者和初学者中颇受欢迎。...在Arduino菜鸟教程(四)中,你可以找到详细的步骤和示例代码,帮助你一步步实现自己的8x8矩阵灯驱动程序。
程序中的详细注释是理解和学习的关键,它能帮助初学者一步步解析代码逻辑,了解每个函数和变量的作用。 在硬件层面,五向摇杆通常由一个中心按钮和四个方向开关组成,连接到51单片机的输入引脚上。当摇杆移动时,...
程序中的详细注释是理解和学习的关键,它能帮助初学者一步步解析代码逻辑,了解每个函数和变量的作用。 在硬件层面,五向摇杆通常由一个中心按钮和四个方向开关组成,连接到51单片机的输入引脚上。当摇杆移动时,...
在学习过程中,通过01_LED等文件,你可以找到相关的示例代码、电路图以及指导文档,一步步实践这些基本的LED控制操作。这将为更复杂、更高级的单片机应用打下坚实的基础,例如传感器数据处理、电机控制、通信协议...
### 光立方制作手册知识点详解 #### 一、光立方简介 ...光立方的制作虽然看似复杂,但只要按照手册中的指导一步步操作,即使是初学者也能顺利完成。通过亲手制作,不仅能学习到电子知识,还能享受到创造的乐趣。