A7核LED灯实验

该代码示例展示了在STM32微控制器上使用汇编和C语言分别实现LED灯的初始化和控制。通过设置GPIO端口的模式、输出类型、速度和上下拉电阻来配置LED,然后通过切换GPIO引脚的电平实现点灯和熄灭的循环。C语言版本则使用结构体和枚举简化了代码,提高了可读性。
摘要由CSDN通过智能技术生成

汇编实现点灯:


.text 
.global _start
_start: 

    bl LED_INIT
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
LED_INIT:
    /**********LED1点灯**************/
    /*******RCC章节*******/
    @ 1.设置GPIOE组时钟使能,通过RCC_AHB4ENSETR寄存器设置 0x50000A28[4]=1
    ldr r0,=0x50000A28 @准备一块地址空间r0 =0x50000a28
    ldr r1,[r0]
    orr r1,r1,#(0x1<<4)
    str r1,[r0]
    @ 2.设置GPIOF组时钟使能,通过RCC_AHB4ENSETR寄存器设置 0x50000A28[5]=1
    ldr r0,=0x50000A28 @准备一块地址空间r0 =0x50000a28
    ldr r1,[r0]
    orr r1,r1,#(0x1<<5)
    str r1,[r0]

    /*****LED1->PE10  LED2->PF10  LED3->PE8*********/
    /********GPIO章节**********/
    @设置led1_IO口MODER模式    PE10
    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    orr r1,r1,#(0x1<<20)
    str r1,[r0]
    @设置led1_IO口输出类型OTYPER PE10
    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,r1,#(~(0x1<<10))
    str r1,[r0]
    @设置led1_GPIO引脚输出速率 PE10
    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    str r1,[r0]
    @设置led1_GPIO引脚禁止上下拉电阻 PE10
    ldr r0,=0x5000600C
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    str r1,[r0]

    @设置led2_IO口MODER模式    PF10
    ldr r0,=0x50007000
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    orr r1,r1,#(0x1<<20)
    str r1,[r0]
    @设置led2_IO口输出类型OTYPER PF10
    ldr r0,=0x50007004
    ldr r1,[r0]
    and r1,r1,#(~(0x1<<10))
    str r1,[r0]
    @设置led2_GPIO引脚输出速率 PF10
    ldr r0,=0x50007008
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    str r1,[r0]
    @设置led2_GPIO引脚禁止上下拉电阻 PF10
    ldr r0,=0x5000700C
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<20))
    str r1,[r0]

    @设置led3_IO口MODER模式    PE8
    ldr r0,=0x50006000
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<16))
    orr r1,r1,#(0x1<<16)
    str r1,[r0]
    @设置led3_IO口输出类型OTYPER PE8
    ldr r0,=0x50006004
    ldr r1,[r0]
    and r1,r1,#(~(0x1<<8))
    str r1,[r0]
    @设置led3_GPIO引脚输出速率 PE8
    ldr r0,=0x50006008
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<16))
    str r1,[r0]
    @设置led1_GPIO引脚禁止上下拉电阻 PE8
    ldr r0,=0x5000600C
    ldr r1,[r0]
    and r1,r1,#(~(0x3<<16))
    str r1,[r0]
    mov pc,lr
    
led1_on:
    @设置GPIO引脚输出高电平
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,r1,#(0x1<<10)
    str r1,[r0]
    mov pc,lr

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

led2_on:
    @设置GPIO引脚输出高电平
    ldr r0,=0x50007014
    ldr r1,[r0]
    orr r1,r1,#(0x1<<10)
    str r1,[r0]
    mov pc,lr

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

led3_on:
    @设置GPIO引脚输出高电平
    ldr r0,=0x50006014
    ldr r1,[r0]
    orr r1,r1,#(0x1<<8)
    str r1,[r0]
    mov pc,lr

led3_off:
    @设置GPIO引脚输出低电平
    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语言实现点灯:

gpio.h:

#ifndef __GPIO_H__
#define __GPIO_H__

typedef struct
{
    volatile unsigned int MODER;
    volatile unsigned int OTYPER;
    volatile unsigned int OSPEEDR;
    volatile unsigned int PUPDR;
    volatile unsigned int IDR;
    volatile unsigned int ODR;
}gpio_t;

#define GPIOE ((gpio_t*)0x50006000)
#define GPIOF ((gpio_t*)0x50007000)
#define RCC_AHB4_ENSETR (*(volatile unsigned int*)0x50000A28)

enum{
    LED1=1,
    LED2,
    LED3
};
void hal_gpio_init(gpio_t *gpiox,unsigned int pin);//GPIO章节初始化
void hal_gpio_output_high(unsigned int ledx);//点亮
void hal_gpio_output_low(unsigned int ledx);//熄灭

#endif

gpio.c:

#include "../include/gpio.h"

void hal_gpio_init(gpio_t* gpiox,unsigned int pin)
{
    gpiox->MODER&=(~(0x3<<pin*2));
    gpiox->MODER|=(0x1<<pin*2);
    gpiox->OTYPER&=(~(0x1<<pin));
    gpiox->OSPEEDR&=(~(0x3<<pin*2));
    gpiox->PUPDR&=(~(0x3<<pin*2));
}
void hal_gpio_output_high(unsigned int ledx)
{
    switch (ledx)
    {
    case LED1:
        GPIOE->ODR|=(0x1<<10);
        break;
    case LED2:
        GPIOF->ODR|=(0x1<<10);
        break;
    case LED3:
        GPIOE->ODR|=(0x1<<8);
        break;
    default:
        break;
    }
}
void hal_gpio_output_low(unsigned int ledx)
{
    switch (ledx)
    {
    case LED1:
        GPIOE->ODR&=(~(0x1<<10));
        break;
    case LED2:
        GPIOF->ODR&=(~(0x1<<10));
        break;
    case LED3:
        GPIOE->ODR&=(~(0x1<<8));
        break;
    
    default:
        break;
    }
}

main.c:

#include "../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()
{
    RCC_AHB4_ENSETR|=(0x1<<4);//初始化GPIOE组RCC寄存器
    RCC_AHB4_ENSETR|=(0x1<<5);//初始化GPIOF组RCC寄存器
    hal_gpio_init(GPIOE,10); // LED1灯初始化
    hal_gpio_init(GPIOF,10); // LED2灯初始化
    hal_gpio_init(GPIOE,8); // LED3灯初始化
    while(1)
    {
        hal_gpio_output_high(LED1);//LED1亮
        delay_ms(500);
        hal_gpio_output_low(LED1);//LED1灭
        delay_ms(500);

        hal_gpio_output_high(LED2);
        delay_ms(500);
        hal_gpio_output_low(LED2);
        delay_ms(500);

        hal_gpio_output_high(LED3);
        delay_ms(500);
        hal_gpio_output_low(LED3);
        delay_ms(500);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
SQLAlchemy 是一个 SQL 工具包和对象关系映射(ORM)库,用于 Python 编程语言。它提供了一个高级的 SQL 工具和对象关系映射工具,允许开发者以 Python 类和对象的形式操作数据库,而无需编写大量的 SQL 语句。SQLAlchemy 建立在 DBAPI 之上,支持多种数据库后端,如 SQLite, MySQL, PostgreSQL 等。 SQLAlchemy 的心功能: 对象关系映射(ORM): SQLAlchemy 允许开发者使用 Python 类来表示数据库表,使用类的实例表示表中的行。 开发者可以定义类之间的关系(如一对多、多对多),SQLAlchemy 会自动处理这些关系在数据库中的映射。 通过 ORM,开发者可以像操作 Python 对象一样操作数据库,这大大简化了数据库操作的复杂性。 表达式语言: SQLAlchemy 提供了一个丰富的 SQL 表达式语言,允许开发者以 Python 表达式的方式编写复杂的 SQL 查询。 表达式语言提供了对 SQL 语句的灵活控制,同时保持了代码的可读性和可维护性。 数据库引擎和连接池: SQLAlchemy 支持多种数据库后端,并且为每种后端提供了对应的数据库引擎。 它还提供了连接池管理功能,以优化数据库连接的创建、使用和释放。 会话管理: SQLAlchemy 使用会话(Session)来管理对象的持久化状态。 会话提供了一个工作单元(unit of work)和身份映射(identity map)的概念,使得对象的状态管理和查询更加高效。 事件系统: SQLAlchemy 提供了一个事件系统,允许开发者在 ORM 的各个生命周期阶段插入自定义的钩子函数。 这使得开发者可以在对象加载、修改、删除等操作时执行额外的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值