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

汇编语言代码段

.text 
.global _start
_start: 
    /**********LED1点灯LED1---->PE10**************/
    @1.对LED1进行初始化 RCC_AHB4_ENSETR MODER OTYPER OSPEEDR PUPDR
    @2.实现LED1点亮/熄灭 ODR
LED1_init:
    @1.通过RCC_AHB4_ENSETR设置GPIOE组时钟控制器使能 0x50000A28[4] = 1
    ldr r0,=0x50000A28
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 4)
    str r1,[r0]

    @2.通过GPIOE_MODER设置PE10引脚为输出模式 0x50006000[21:20] = 01    
    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    orr r1,r1,#(0x1 << 20)
    str r1,[r0]
   
    @3.通过GPIOE_OTYPER设置PE10引脚为推挽输出类型 0x50006004[10] = 0
    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,r1,#(~(0x1 << 10))
    str r1,[r0]
    
    @4.通过GPIOE_OSPEEDR设置PE10引脚为低速输出模式 0x50006008[21:20] = 00 
    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    str r1,[r0]
   
    @5.通过GPIOE_PUPDR设置PE10引脚禁止上下拉 0x5000600C[21:20] = 00
    ldr r0,=0x5000600c
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    str r1,[r0]

    /**********LED2点灯LED2---->PF10**************/
LED2_init:
    @1.通过RCC_AHB4_ENSETR设置GPIOE组时钟控制器使能 0x50000A28[5] = 1
    ldr r0,=0x50000A28
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 5)
    str r1,[r0]

    @2.通过GPIOE_MODER设置PF10引脚为输出模式 0x50007000[21:20] = 01    
    ldr r0,=0x50007000
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    orr r1,r1,#(0x1 << 20)
    str r1,[r0]
    
    @3.通过GPIOE_OTYPER设置PF10引脚为推挽输出类型 0x50007004[10] = 0
    ldr r0,=0x50007004
    ldr r1,[r0]
    and r1,r1,#(~(0x1 << 10))
    str r1,[r0]
    
    @4.通过GPIOE_OSPEEDR设置PF10引脚为低速输出模式 0x50007008[21:20] = 00 
    ldr r0,=0x50007008
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    str r1,[r0]
    
    @5.通过GPIOE_PUPDR设置PF10引脚禁止上下拉 0x5000700C[21:20] = 00
    ldr r0,=0x5000700c
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 20))
    str r1,[r0]

    /**********LED3点灯LED3---->PE8**************/
LED3_init:
    @1.通过RCC_AHB4_ENSETR设置GPIOE组时钟控制器使能 0x50000A28[4] = 1
    ldr r0,=0x50000A28
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 4)
    str r1,[r0]

    @2.通过GPIOE_MODER设置PE8引脚为输出模式 0x50006000[17:16] = 01    
    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 16))
    orr r1,r1,#(0x1 << 16)
    str r1,[r0]
  
    @3.通过GPIOE_OTYPER设置PE8引脚为推挽输出类型 0x50006004[8] = 0
    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,r1,#(~(0x1 << 8))
    str r1,[r0]
    
    @4.通过GPIOE_OSPEEDR设置PE8引脚为低速输出模式 0x50006008[17:16] = 00 
    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 16))
    str r1,[r0]
    
    @5.通过GPIOE_PUPDR设置PE8引脚禁止上下拉 0x5000600C[17:16] = 00
    ldr r0,=0x5000600c
    ldr r1,[r0]
    and r1,r1,#(~(0x3 << 16))
    str r1,[r0]    

loop:
    bl LED1_ON
    bl delay_1s 
    bl LED1_OFF
    bl delay_1s

    bl LED2_ON
    bl delay_1s 
    bl LED2_OFF
    bl delay_1s

    bl LED3_ON
    bl delay_1s 
    bl LED3_OFF
    bl delay_1s
    b loop

LED1_ON:
    @通过GPIOE_ODR设置PE10引脚输出高电平 0x50006014[10] = 1
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 10)
    str r1,[r0]
    mov pc,lr

LED1_OFF:
    @通过GPIOE_ODR设置PE10引脚输出低电平 0x50006014[10] = 0
    ldr r0,=0x50006014
    ldr r1,[r0]
    and r1,r1,#(~(0x1 << 10))
    str r1,[r0]
    mov pc,lr

LED2_ON:
    @通过GPIOE_ODR设置PF10引脚输出高电平 0x50007014[10] = 1
    ldr r0,=0x50007014
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 10)
    str r1,[r0]
    mov pc,lr

LED2_OFF:
    @通过GPIOE_ODR设置PF10引脚输出低电平 0x50007014[10] = 0
    ldr r0,=0x50007014
    ldr r1,[r0]
    and r1,r1,#(~(0x1 << 10))
    str r1,[r0]
    mov pc,lr

LED3_ON:
    @通过GPIOE_ODR设置PE8引脚输出高电平 0x50006014[8] = 1
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,r1,#(0x1 << 8)
    str r1,[r0]
    mov pc,lr

LED3_OFF:
    @通过GPIOE_ODR设置PE8引脚输出低电平 0x50006014[8] = 0
    ldr r0,=0x50006014
    ldr r1,[r0]
    and r1,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

C语言编写

头文件

#ifndef __LED_H__
#define __LED_H__

//封装寄存器
typedef struct
{
    volatile unsigned int MODER;     //设置为输出模式

    volatile unsigned int OTYPER;     //设置为推挽模式

    volatile unsigned int OSPEEDR;     //设置为低速输出

    volatile unsigned int PUPDR;     //设置为引脚禁止上下拉电阻

    volatile unsigned int IDR;         //IO

    volatile unsigned int ODR;         //设置使能

}gpio_t;
    
#define GPIOE (*(gpio_t*)0x50006000)     
#define GPIOF (*(gpio_t*)0x50007000)     

void Led_init();
void Led_on();
void Led_off();
#endif

功能文件

#include "led.h"
#define RCC_AHB4_ENSETR  (*(volatile unsigned int*)0x50000A28)

void Led_init()
{
    // 1.使能GPIOE,GPIOF外设的时钟
    RCC_AHB4_ENSETR |= (0x3 << 4);
    
    // 2.设置gpio引脚为输出模式
    /*********LED1---->PE10*********/
    GPIOE.MODER &= (~(0x3 << 20));
    GPIOE.MODER |= (0x1 << 20);

    /*********LED2---->PF10*********/
    GPIOF.MODER &= (~(0x3 << 20));
    GPIOF.MODER |= (0x1 << 20);

    /*********LED3---->PE8*********/
    GPIOE.MODER &= (~(0x3 << 16));
    GPIOE.MODER |= (0x1 << 16);

    // 3.设置gpio引脚为推挽输出    
    /*********LED1---->PE10*********/
    GPIOE.OTYPER &= (~(0x1 << 10));

    /*********LED2---->PF10*********/
    GPIOF.OTYPER &= (~(0x1 << 10));

    /*********LED3---->PE8*********/
    GPIOE.OTYPER &= (~(0x1 << 8));

    // 4.设置gpio引脚为低速模式    
    /*********LED1---->PE10*********/
    GPIOE.OSPEEDR &= (~(0x3 << 20));

    /*********LED2---->PF10*********/
    GPIOF.OSPEEDR &= (~(0x3 << 20));

    /*********LED3---->PE8*********/
    GPIOE.OSPEEDR &= (~(0x3 << 16));

    // 5.禁止gpio引脚的上拉和下拉
    /*********LED1---->PE10*********/
    GPIOE.PUPDR &= (~(0x3 << 20));
    
    /*********LED2---->PF10*********/
    GPIOF.PUPDR &= (~(0x3 << 20));

    /*********LED3---->PE8*********/
    GPIOE.PUPDR &= (~(0x3 << 16));

    return;
}

void Led_on()
{
    /*********LED1---->PE10*********/
    GPIOE.ODR |= (0x1 << 10);
    
    /*********LED2---->PF10*********/
    GPIOF.ODR |= (0x1 << 10);
    
    /*********LED3---->PE8*********/
    GPIOE.ODR |= (0x1 << 8);

    return;
}

void Led_off()
{
    /*********LED1---->PE10*********/
    GPIOE.ODR &= (~(0x1 << 10));

    /*********LED2---->PF10*********/
    GPIOF.ODR &= (~(0x1 << 10));

    /*********LED3---->PE8*********/
    GPIOE.ODR &= (~(0x1 << 8));

    return ;
}

主函数

#include "led.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()
{
    //LED灯初始化
    Led_init(); 

    while(1)
    {
        Led_on();
        delay_ms(500);
        Led_off();
        delay_ms(500);
    }
    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值