从点亮一个LED开始,Cortex-A9裸机程序设计
2016-11-22 21:00
232 查看
电路原理图:
如何点亮一个LED?
通过对原理图进行分析,我们能够发现给三极管的基极加上一个高点平时,三级管be结导通构成通路,此时二极管就点亮了。若要将LED熄灭只需取消高电平输出。
如何使三级管基极获得一个高电平?
控制三极管基极的其实是exynos4412的一个引脚(忽略具体是怎么连接的),因此我们要做的就是:
配置相关寄存器使引脚变为输出功能(这里配置为输出功能 0x1)
配置上下拉(若需要)
操作寄存器改变引脚电平变化
配置带负载能力(若需要)
相关寄存器
配置引脚功能
获取或设置引脚状态
配置引脚内部上下拉
配置带负载能力
一个简单流水灯的实现:
ARM汇编代码实现LED闪烁
如何点亮一个LED?
通过对原理图进行分析,我们能够发现给三极管的基极加上一个高点平时,三级管be结导通构成通路,此时二极管就点亮了。若要将LED熄灭只需取消高电平输出。
如何使三级管基极获得一个高电平?
控制三极管基极的其实是exynos4412的一个引脚(忽略具体是怎么连接的),因此我们要做的就是:
配置相关寄存器使引脚变为输出功能(这里配置为输出功能 0x1)
配置上下拉(若需要)
操作寄存器改变引脚电平变化
配置带负载能力(若需要)
相关寄存器
配置引脚功能
获取或设置引脚状态
配置引脚内部上下拉
配置带负载能力
一个简单流水灯的实现:
#include "exynos_4412.h" /* LED点亮、熄灭以及状态反转操作 */ #define LED_ON(LED_x) ( *(LED_x.port) |= (1 << LED_x.pin) ) #define LED_OFF(LED_x) ( *(LED_x.port) &= (~(1 << LED_x.pin)) ) #define LED_REV(LED_x) ( *(LED_x.port) ^= (1 << LED_x.pin) ) /* 存放一个LED的端口信息以及引脚信息 */ typedef struct { unsigned int *port; /* LED端口状态寄存器地址 */ int pin; /* 端口中的第几pin */ }led_t; /* 定义并初始化4个LED,方便接下来操作 */ led_t LED_2 = {(unsigned int *)0x11000C44, 7}; /*GPX2DAT, bit[7]*/ led_t LED_3 = {(unsigned int *)0x11000C24, 0}; /*GPX0DAT, bit[0]*/ led_t LED_4 = {(unsigned int *)0x114001E4, 4}; /*GPF3DAT, bit[4]*/ led_t LED_5 = {(unsigned int *)0x114001E4, 5}; /*GPF3DAT, bit[5]*/ /* 简单延时函数 */ void delay_ms(unsigned int time); int main() { /*配置引脚作为输出*/ GPX2.CON = GPX2.CON & ~(0xf << 28) | (0x1 << 28); GPX1.CON = GPX1.CON & ~0xf | 0x1; GPF3.CON = GPF3.CON & ~(0xff << 16) | (0x11 << 16); /*实现简单流水灯*/ while(1) { LED_ON(LED_2); LED_OFF(LED_3); LED_OFF(LED_4); LED_OFF(LED_5); delay_ms(500); LED_OFF(LED_2); LED_ON(LED_3); LED_OFF(LED_4); LED_OFF(LED_5); delay_ms(500); LED_OFF(LED_2); LED_OFF(LED_3); LED_ON(LED_4); LED_OFF(LED_5); delay_ms(500); LED_OFF(LED_2); LED_OFF(LED_3); LED_OFF(LED_4); LED_ON(LED_5); delay_ms(500); } return 0; } void delay_ms(unsigned int time) { int i, j; while(time--) { for(i = 0; i < 5; i++) for(j = 0; j < 610; j++); //do nothing } }
ARM汇编代码实现LED闪烁
.globl _start .arm _start: LDR R0,=0x11000C20 LDR R1,[R0] BIC R1,R1,#0x0000000f ORR R1,R1,#0x00000001 STR R1,[R0] loop: LDR R0,=0x11000C24 LDR R1,[R0] ORR R1,R1,#0x01 STR R1,[R0] BL delay LDR R1,[R0] BIC R1,R1,#0x01 STR R1,[R0] BL delay B loop delay: LDR R2,=0xfffffff loop1: SUB R2,R2,#0x1 CMP R2,#0x0 BNE loop1 MOV PC,LR .end
相关文章推荐
- 【芝山物联】LM3S811自学笔记-2(从点亮LED灯开始之创建一个空白工程)
- 点亮一个LED
- ARM嵌入式编程(无操作系统、基于MDK)之最简单的程序:点亮一个LED灯
- 51单片机基础学习(1)点亮一个LED灯
- 如何在qualcomm平台Android点亮一个LED工作流程分析
- 妈蛋,终于在TQ2440上点亮一个led了。。。
- 使用汇编代码点亮一个LED灯
- GPIO-点亮一个LED(JZ2440-S3C2440)
- 6种中断点亮一个LED
- 使用QT在S3C6410上点亮一个LED灯
- STM32F103/ <4>点亮一个LED灯
- 点亮一个LED
- 点亮一个led
- 点亮一个led
- STC51六中中断配置点亮一个LED
- 单片机小白学步系列(十三) 点亮第一个LED——好的开始,成功的一半
- (第一天)S3C6410点亮一个LED
- cortex-A8的第一个裸跑程序——点亮LED灯
- 基于Cortex-A8裸机,点亮LED灯程序分析
- 4-《电子入门趣谈》第一章_一切从单片机开始-1.3.1-点亮一个灯