用汇编语言实现LED1/LED2/LED3三盏灯点亮2.用C语言实现LED1/LED2/LED3三盏灯点亮

该代码段展示了在ARM处理器上使用C语言和汇编语言配置GPIO端口,特别是GPIOE,用于控制LED的开关。程序包括设置GPIO模式、输出类型、速度和上拉下拉电阻,以及实现LED的闪烁功能,通过延时函数实现周期性的开关。
摘要由CSDN通过智能技术生成

do_irq.c

extern void printf(const char *fmt, ...);
unsigned int i = 0;

#include"gpio.h"


void gpioe()
{
    GPIO_X=GPIO_X|(0x1<<4);
}

void moder()
{
    GPIOE.MODER=0x50006000;
    
    GPIOE.MODER=GPIOE.MODER&(~(0x3<<20));
    GPIOE.MODER=GPIOE.MODER|(0x3<<20);

    GPIOE.MODER=GPIOE.MODER&(~(0x3<<16));
    GPIOE.MODER=GPIOE.MODER|(0x3<<16);
    
    GPIOE.MODER=0x50007000;
    GPIOE.MODER=GPIOE.MODER&(~(0x3<<20));
    GPIOE.MODER=GPIOE.MODER|(0x3<<20);

}
void otyper()
{
    GPIOE.OTYPER=0x50006004;
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
    
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<8));

    GPIOE.OTYPER=0x50007004;
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
}

void ospeedr()
{
    GPIOE.OSPEEDR=0x50006008;
    GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<20));
    
    GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<16));

    GPIOE.OSPEEDR=0x50007008;
    GPIOE.OSPEEDR=GPIOE.OSPEEDR&(~(0x3<<20));
}

void pupdr()
{
    GPIOE.PUPDR=0x5000600c;
    GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<20));
    
    GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<16));

    GPIOE.PUPDR=0x5000700c;
    GPIOE.PUPDR=GPIOE.PUPDR&(~(0x3<<20));
}

void led_off()
{
    GPIOE.OTYPER=0x50006014;
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));
    
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<8));

    GPIOE.OTYPER=0x50007014;
    GPIOE.OTYPER=GPIOE.OTYPER&(~(0x1<<10));

}

void led_on()
{
    GPIOE.OTYPER=0x50006014;
    GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<10);
    
    GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<8);

    GPIOE.OTYPER=0x50007014;
    GPIOE.OTYPER=GPIOE.OTYPER&(0x1<<10);

}


main.c

ubuntu@ubuntu:02-led-c$ vi main.c
ubuntu@ubuntu:02-led-c$ cat main.c
#include "gpio.h"
extern void printf(const char *fmt, ...);
void delay_ms(int ms)
{
    int i,j;
    for(i = 0; i < ms;i++)
        for (j = 0; j < 1800; j++);
}


int main()
{
    void gpioe();//设置GPIOE组时钟使能 通过RCC_AHB4ENSETR寄存器设置
    void moder();  //通过GPIOE_MODER寄存器设置PE10引脚为输出模式
    void otyper();  //通过GPIOE_OTYPER设置PE10引脚为推挽输出模式
    void ospeedr(); //通过GPIOE_OSPEEDR设置PE10引脚为低速输出
    void pupdr(); // 通过GPIOE_PUPDR设置PE10引脚禁止上下拉电阻
    while(1)
    {
        led_off();   //通过GPIOE_ODR设置PE10引脚输出高电平
        delay_ms(500);
        led_on();//通过GPIOE_ODR设置PE10引脚输出低电平
        delay_ms(500);
    }
    return 0;
}

arm.s

.text 
.global _start
_start: 
    /**********LED1点灯**************/
    /*********RCC章节****************/
    @1.设置GPIOE组时钟使能 通过RCC_AHB4ENSETR寄存器设置0x50000A28[4]=1
    ldr r0,=0x50000A28
    ldr r1,[r0]
    orr r1,#(0x1<<4)
    str r1,[r0]
    /**********GPIO章节***************/
    

    @设置LED1 LED2 LED3 对于的寄存器为输出模式

    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    orr r1,#(0x1<<20)
    str r1,[r0]

    ldr r0,=0x50007000
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    orr r1,#(0x1<<20)
    str r1,[r0]

    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,#(~(0x3<<16))
    orr r1,#(0x1<<16)
    str r1,[r0]



    @设置LED1 LED2 LED3 对于的寄存器为推挽输出模式

    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,#(~(0x1<<10))
    str r1,[r0]

    ldr r0,=0x50007004
    ldr r1,[r0]
    and r1,#(~(0x1<<10))
    str r1,[r0]

    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,#(~(0x1<<8))
    str r1,[r0]



    @设置LED1 LED2 LED3 对于的寄存器为低速输出模式
    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    str r1,[r0]
    
    ldr r0,=0x50007008
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    str r1,[r0]

    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,#(~(0x3<<16))
    str r1,[r0]

    @设置LED1 LED2 LED3 对于的寄存器为低速输出模式
    ldr r0,=0x5000600c
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    str r1,[r0]

    ldr r0,=0x5000700c
    ldr r1,[r0]
    and r1,#(~(0x3<<20))
    str r1,[r0]

    ldr r0,=0x5000600c
    ldr r1,[r0]
    and r1,#(~(0x3<<16))
    str r1,[r0]



loop:
    bl LED1_OFF
    bl delay_1s
    bl LED1_ON
    bl delay_1s
    b loop


LED1_ON:
    
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,#(0x1<<10)
    str r1,[r0]

    ldr r0,=0x50007014
    ldr r1,[r0]
    orr r1,#(0x1<<10)
    str r1,[r0]

    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,#(0x1<<8)
    str r1,[r0]
    mov pc,lr


LED1_OFF:
    
    ldr r0,=0x50006014
    ldr r1,[r0]
    and r1,#(~(0x1<<10))
    str r1,[r0]

    ldr r0,=0x50007014
    ldr r1,[r0]
    and r1,#(~(0x1<<10))
    str r1,[r0]
    
    
    ldr r0,=0x50006014
    ldr r1,[r0]
    and r1,#(~(0x1<<8))
    str r1,[r0]
    mov pc,lr



@ 大概1s的延时函数
delay_1s:
    mov r3, #0x10000000
    mm:
    cmp r3, #0
    subne r3, r3, #1
    bne mm
    mov pc, lr






.end


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值