从点亮一个LED开始,Cortex-A9裸机程序设计

电路原理图:

如何点亮一个LED?

通过对原理图进行分析,我们能够发现给三极管的基极加上一个高点平时,三级管be结导通构成通路,此时二极管就点亮了。若要将LED熄灭只需取消高电平输出。

如何使三级管基极获得一个高电平?

控制三极管基极的其实是exynos4412的一个引脚(忽略具体是怎么连接的),因此我们要做的就是:

  1. 配置相关寄存器使引脚变为输出功能(这里配置为输出功能 0x1)
  2. 配置上下拉(若需要)
  3. 操作寄存器改变引脚电平变化
  4. 配置带负载能力(若需要)

相关寄存器

配置引脚功能  

获取或设置引脚状态

 配置引脚内部上下拉

配置带负载能力

一个简单流水灯的实现:

#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  
时间: 2024-12-04 10:32:47

从点亮一个LED开始,Cortex-A9裸机程序设计的相关文章

ESP8266-12F学习之点亮一个LED灯

点亮一个LED灯     上一篇文章,我们介绍了怎么在Windows系统下搭建一个SEP8266的开发环境,那在这一篇文章中我们要开始来编写一个硬件入门经典小程序,如何点亮一个LED小灯,同时在这一章中我们还会介绍怎么样将编译好的程序下载到ESP8266-12f中.  第一步:下载官方demo框架,从http://wiki.ai-thinker.com/esp8266/examples 下载,当然,也可以在文章最后下载我的附件,下载完后,我们将文件添加到SDK中进行编译,步骤如图: 点开C/C+

STM32学习笔记(一)——点亮一个LED

引言 最近报名了2017全国大学生电子设计竞赛,我们学校是第一次参加这个比赛,由于8/9月份就要比赛了,所以现在准备是比较晚的了,指导老师说只能做控制类的题目了,让我们学习一下STM32单片机,51到时候肯定不够用了,正好前几天买了一块STM32F103ZET6的最小系统,那就赶紧学习吧!从哪里学习呢?同样是从点亮一个小灯开始,就建个工程模板就让我没有耐心了,折腾了一上午终于把工程建立好了, 关于STM32 简介 STM32系列基于专为要求高性能.低成本.低功耗的嵌入式应用专门设计的ARM Co

点亮一个LED灯

设计定义: 二选一多路器 两个输入IO,a.b.可以是高电平, 输入按键按下时,LED灯与a端口状态保持一致, 按键释放时,LED灯与b端口状态保持一致 设计输入:创建一个project 编写功能代码 module LED(a,b,key_in,led_out); input a;//输入端口a,b: input b; input key_in;//按键输入,实现输入通道的选择 output led_out;//led控制端口 assign led_out=(key_in==0)?a:b;//当

在 S5PV210 的 开发板上 点亮 一个 LED 灯

参考学习教程:周立功嵌入式Linux开发教程-(上册) 材料:首先 准备一个 安装好 Linux 的 开发板 使用  xshell 工具 连接 开发板  ,winscp 工具 连接 开发板  ,  准备 一个 Ubuntu  32位 ,装上 交叉编译链.. 使用下面 代码 和 Makefile 文件 进行编译  ,生成的  执行 文件  利用 winscp 软件复制到 Linux开发板上 ,利用 xshell 运行 这个可执行文件. 下面    代码的  功能  是   新建 一个 TCP 客户

6种中断点亮一个LED

一.外部中断0.1(分别點亮一個LED) /******************************************************************************* * 标题: 计数器中断实验 * #include <reg52.h> #include<intrins.h> sbit led1 = P0^0; sbit led2 = P0^1; void main(void) { // IT0=0; //低电平触发 IT0=1; //下降沿触发

STC51六中中断配置点亮一个LED

一.外部中断0.1(分别點亮一個LED) /******************************************************************************* * 标题: 计数器中断实验 * #include <reg52.h> #include<intrins.h> sbit led1 = P0^0; sbit led2 = P0^1; void main(void) { // IT0=0; //低电平触发 IT0=1; //下降沿触发

JZ2440点亮一个LED

点亮标号为D10的LED,其对应的GPIO为GPF4,即设置GPF4为输出口,并拉低为低电平[具体原理查看JZ2440原理图] 1 #define GPFCON (*(volatile unsigned long *)0X56000050) 2 #define GPFDAT (*(volatile unsigned long *)0X56000054) 3 4 #define GPF4_O (1<<(4*2)) 5 6 int main() 7 { 8 //设置GPF4为输出IO 9 GPFC

STC15F104W 点亮一个LED 上手初测

/* 工程创建MCU选取,Atmel 89C55 单片机:STC15f104W 功能:500M秒闪一次LED 连接说明:LED正极串接1K 电阻接VCC,负极接到 MCU的8脚 P3.3 */ #include <REG51.h> sbit LED = P3^3; void DELAY_MS (unsigned int a){     unsigned int i;     while ( --a != 0 )    {         for (i=0;i<=600;i++);    

树莓派点亮一个led灯

1. 访问网站:http://www.airspayce.com/mikem/bcm2835/, 该网站提供了一份针对树莓派的库文件,下载地址为:点击下载 点击下载.按照提示安装即可. 2. 在bcm2835-1.4.2 中的example文件夹中即为历程文件,打开其中的bink文件夹,使用gcc -o blink blink -l bcm2835 即可生成blink执行文件. 3. 在blink.c文件中,提示控制pin17引脚,即图中的绿色GPIO0,连接LED灯的正极:LED灯负极接树莓派