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

2023-05-16

汇编语言代码段

.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;
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用汇编语言与C语言实现LED1/LED2/LED3三盏灯点亮 的相关文章

  • 【C、C++系列-1】C语言实现:寻找[1,100]之间的素数

    C C 43 43 系列 1 C语言实现 xff1a 寻找 1 100 之间的素数 1 问题 C语言实现 xff1a 寻找 1 100 之间的素数 2 实现代码 span class token comment 寻找 1 100 之间的素数
  • Linux下生产者消费者问题的C语言实现

    注 xff1a 查看全文请关注作者 xff0c 或点击前往 xff1a 生产者 消费者问题的C语言实现 实验六 生产者 消费者问题实现 实验题目 要求 在Linux操作系统下用C实现经典同步问题 xff1a 生产者 消费者 xff0c 具体
  • MergeSort(迭代归并排序)——C语言实现

    前言 xff1a 归并排序跟快速排序有异曲同工之妙 xff0c 都是分治法的典型代表 但是这种分治法都有不小的弊端 xff0c 就是需要占用大量的系统栈 xff0c 很容易造成空间的大量浪费 xff0c 所以就有用迭代来优化递归的操作 这次
  • 辗转相除法详解(C语言实现)

    辗转相除法 定义基本原理原理证明 算法实现思想C语言实现 定义 辗转相除法 xff0c 被称为欧几里得 xff08 Euclidean xff09 算法 xff0c 是求最大公约数的算法 基本原理 原理 两个正整数a和b a gt b xf
  • 使用汇编语言与C语言实现LED1/LED2/LED3三盏灯点亮

    汇编语言代码段 text global start start LED13 INIT LED1 3点灯 RCC章节 64 1 设置GPIO始终使能 通过RCC AHB4ENSRTR寄存器设置0x50000A28 4 61 1 ldr r0
  • (c语言实现)数据结构链表oj题(2)

    前言 x1f388 个人主页 x1f388 初阶牛 x1f43b 推荐专栏 x1f354 x1f35f x1f32f C语言进阶 x1f511 个人信条 x1f335 知行合一 x1f349 本篇简介 gt 分析力扣中有关链表的部分题目 目
  • 数组排序(C 语言实现)

    本文主要包含常见的数组排序方法 选择排序 原理 在原始数组中取未排序的首元素 xff0c 与其后方所有元素比较 xff0c 不满足顺序 xff0c 则交换首元素此时满足条件 xff0c 未排序部分后移重复上述操作 代码实现 include
  • 用C语言实现websocket服务器

    Websocket Echo Server Demo 背景 嵌入式设备的应用开发大都依靠C语言来完成 xff0c 我去研究如何用C语言实现websocket服务器也是为了在嵌入式设备中实现一个ip camera的功能 xff0c 用户通过网
  • TCP通信模型(C语言实现)

    大家好 xff0c 我是练习编程时长两年半的个人练习生昆工第一ikun xff0c 今天我们来分享TCP通信模型 xff0c 并且用C语言实现它 目录 一 我们将实现三个示例功能 xff1a 二 TCP服务器搭建流程 xff08 1 xff
  • PID连续控制算法的表达式以及C语言实现

    1 数字 xff08 离散 xff09 PID控制算法的表达式 xff1a 将PID调节器离散化 xff0c 用差分方程来代替连续系统的微分方程 xff0c 分为位置式和增量式两类 重点理解概念如下 xff1a a xff09 基本偏差e
  • 使用Verilog HDL语言实现4位超前进位加法器

    一 1位半加器的实现 1 1 原理 半加器由两个一位输入相加 xff0c 输出一个结果位和进位 xff0c 没有进位输入的加法器电路 1 2 真值表 1 3 逻辑表达式 S 61 A B C 61 A amp B 1 4 Verilog 实
  • C语言实现FTP文件传输

    一 要求 FTP实则为两个程序的互相交流 xff0c 把信息指令相互发送并处理 1 客户端请求下载文件 把文件名发送给服务器 2 服务器接收客户端发送的文件名 根据文件名找到文件 xff0c 把文件大小发送给客户端 3 客户端接收到文件大小
  • C语言实现mavlink库与px4通信仿真

    参照网址 http mavlink io en mavgen c 首先从github上下载对应的C uart interface example 对应的github仓库网址为https github com mavlink c uart i
  • ubuntu下串口发送或者接收(c语言实现)minicom调试

    关于串口的知识这里就不累赘了 xff0c 看着多又烦 xff0c 搞这个的都懂串口 xff0c 不多废话了 xff01 xff01 进入正题 xff01 xff01 1 选择合适的usb串口模块 某宝很多这种模块 xff0c 有各种型号的
  • C语言实现http请求器

    C语言实现http请求器 项目介绍 本项目完成一个http客户端请求器 xff0c 该请求器往服务器发送请求 xff0c 并接受服务器发来的响应数据 程序执行流程 建立TCP连接在TCP连接获得的socket的基础上 xff0c 发送htt
  • 用c语言实现https通信,C/C++实现HTTPS通信

    include 34 afxinet h 34 CInternetSession mysession CHttpConnection myconn CString VoidText CString strSentence strGetSen
  • SHA1校验算法C语言实现

    SHA1 安全哈希算法 xff1a 对于长度小于2 64位的消息 1M 61 1024k 1K 61 1024字节 xff0c 1BYTE 61 8bit 可以想象一下2的63次方位可以表示一个多大的数据文件 xff0c SHA1会产生一个
  • UDP通信 (C语言实现)

    直接看代码吧 v乛 乛 udp server c 文件信息 文 件 名 udp server c 创 建 人 文件创建日期 年 月 日 描 述 UDP 回射服务器程序
  • 使用c语言实现的http get post请求

    这里写目录标题 背景参考案例 具体实现请求代码模板flask接收示例 背景 我目前需要解决一个需求 xff0c 将一个c工程中的特定数据转发到VUE前端框架上做界面展示 xff0c 且该框架已经有后端为flask框架 所以得考虑如何将c工程
  • 汉诺塔问题—C语言实现

    一 题目描述 相传在古印度圣庙中 xff0c 有一种被称为汉诺塔 Hanoi 的游戏 该游戏是在一块铜板装置上 xff0c 有三根杆 编号A B C xff0c 在A杆自下而上 由大到小按顺序放置64个金盘 如下图 游戏的目标 把A杆上的金

随机推荐

  • Android基础二:常见的几种组件

    关注我 xff0c 会持续发布关于Android学习的内容 xff01 大学生交流群 xff1a 728910358 文章目录 前言 一 MaterialButton 二 MaterialButtonToggleGroup 三 TextVi
  • Android基础三:RecyclerView组件的使用

    目录 系列文章目录 前言 二 GridLayoutManager 网格布局 三 StaggeredGridLayoutManager 瀑布流布局 总结 系列文章目录 Android基础一 xff1a Android UI基础容器 https
  • 《Linux创建新用户》

    本文主要讲解linux下如何进行新用户创建 登录以及删除操作 文章目录 1 创建新普通用户2 登录普通用户 xff08 一 xff09 已经创建过普通用户 xff08 二 xff09 第一次创建普通用户 3 普通用户切换至超级用户 xff0
  • 通用文字识别API推荐

    今天给大家分享推荐一款很不错的API 通用文字识别OCR xff0c 多场景 多语种 高精度的整图文字检测和识别服务 xff0c 多项指标行业领先 xff0c 可识别中 英 日 韩 法 德多种语言 APISpace 上面有各种各样的API
  • 一文带你看透手机号码归属地

    什么是手机号码归属地 xff1f 我国的手机号码为11位 xff0c 前3位是区分运营商的移动接入码 xff0c 中国的移动接入码都是以1开头的 xff0c 比如131 139 138等等 xff0c 这个移动接入码是由运营商向工信部申请
  • 一文带你看透IP归属地

    什么是IP xff1f IP是指网络之间互连的协议 xff0c 英文全称是 Internet Protocol xff0c 是TCP IP体系中的网络层协议 设计IP的目的是提高网络的可扩展性 xff1a 一是解决互联网问题 xff0c 实
  • Linux arm64架构修改软件源 (统信UOS,麒麟系统修改阿里源、华为源) 国产系统UOS修改apt源

    步骤 xff1a 备份原来自带的软件源 gt 修改软件源配置文件 gt 处理报错 xff08 公钥问题 xff09 gt 清理缓存 gt 更新缓存 gt 安装软件 1 备份系统之前的源 cp etc apt sources list etc
  • 各类免费API接口推荐,再也不怕找不到免费API了

    我收集了一些各类免费的API xff0c 在这里分享给大家 xff0c 希望可以帮助到大家 一 高德开放平台 与真实世界联通 高德开放平台为开发者赋能 xff0c 将地图精致地呈现在您的应用中无论基于哪种平台 xff0c 都可以通过高德开放
  • APISpace 的 ChatGPT 它来了 一分钟快速接入没烦恼

    如此火爆的 ChatGPT 大家肯定都已经知道了 xff0c 我就不多说了 但是呢 xff0c OpenAI 的 ChatGPT 官网注册麻烦 xff0c 接入繁琐 xff0c 且需要海外信用卡才能支付 xff0c 这就让广大的国内开发者头
  • ChatGPT 到底强大在哪里?(文末有彩蛋)

    ChatGPT 是由 OpenAI 开发的一个人工智能聊天机器人程序 xff0c 于2022年11月推出 该程序使用基于 GPT 3 5 架构的大型语言模型并通过强化学习进行训练 ChatGPT 以文字方式交互 xff0c 而除了可以通过人
  • 免费常用API接口

    短信API 短信验证码 xff1a 可用于登录 注册 找回密码 支付认证等等应用场景 支持三大运营商 xff0c 3秒可达 xff0c 99 99 xff05 到达率 xff0c 支持大容量高并发 通知短信 xff1a 当您需要快速通知用户
  • 安全可靠的短信验证码API,毫秒级反应

    短信验证码是一种功能强大的网络安全技术 xff0c 可以确保网站的真实性和安全性 它的使用非常简单 xff1a 用户只需要通过他 她的手机发送位编码短信给网站 xff0c 然后在网站上输入这个验证码 xff0c 就可以实现一种双重认证的功能
  • 如何利用 IP 归属地查询 API 精准锁定用户位置

    引言 在互联网时代 xff0c IP 地址扮演着非常重要的角色 xff0c 它可以帮助我们追踪网站访问者 优化网络服务等等 而 IP 归属地则更进一步 xff0c 它可以帮助我们精确地定位 IP 地址所在的地理位置 xff0c 为数据分析
  • 涨知识!细数银行卡三要素 API 的 N 种验证方法

    引言 银行卡三要素验证 API 是一种基于姓名 身份证号码和银行卡号等三种信息的验证服务 xff0c 主要用于绑定银行卡时校验银行卡是否为该身份信息所有 手机号是否为银行卡绑定手机号 银行卡三要素 API 的验证方法 银行卡三要素 API
  • 常用的热门 API 分享

    手机号码归属地 xff1a 提供三大运营商的手机号码归属地查询 空号检测 xff1a 通过手机号码查询其在网活跃度 xff0c 返回包括空号 停机等状态 手机在网状态 xff1a 支持传入三大运营商的号码 xff0c 查询手机号在网状态 x
  • 通知短信 API 技术细节以及发送流程机制原理解析

    引言 短信是一种简单 直接 高效的通信方式 xff0c 被广泛应用于各个领域 在移动互联网时代 xff0c 短信成为了客户服务 政府通知 公共服务等方面的重要工具 为了更好地利用短信这种通信方式 xff0c 通知短信 API应运而生 短信A
  • vSphere ESXI主机网络分析工具

    1 net stats 该命令可以收集端口统计信息 可以通过net stats h 命令显示所有标志 最常见的是使用 net stats l 来确定所有 VMkernel 接口 vmnic 上行链路和 vNIC 端口的交换机端口号和 MAC
  • 算法中的一些数学问题

    1 欧几里得算法 xff08 辗转相除法 xff09 该算法用来快速计算两个整数的最大公约数 递归算法 xff1a int gcd int a int b if b 61 61 0 return a return gcd b a b 非递归
  • 安装pillow已完成,但仍报错No module named ‘PIL‘

    python 3 6 2 xff0c 安装pillow已完成 xff0c 但仍报错No module named 39 PIL 39 no module named 39 pillow 39 python3 6 我加班还不行吗 的博客 CS
  • 使用汇编语言与C语言实现LED1/LED2/LED3三盏灯点亮

    汇编语言代码段 text global start start LED1点灯LED1 gt PE10 64 1 对LED1进行初始化 RCC AHB4 ENSETR MODER OTYPER OSPEEDR PUPDR 64 2 实现LED