ARM体系结构和接口技术(四)LED灯实验---②

文章目录

  • 一、特殊功能控制寄存器
    • (一)GPIOx_MODER寄存器
    • (二)GPIOx_OTYPER寄存器
    • (三)GPIOx_OSPEEDR寄存器
    • (四)GPIOx_PUPDR寄存器
    • (五)GPIOx_IDR寄存器
    • (六)GPIOx_ODR寄存器
    • (七)GPIOx_BSRR寄存器
  • 二、 查看外设控制器对应的特殊功能寄存器的基地址
  • 三、RCC
  • 四、代码实现
    • (一)汇编版本
    • (二)C语言版本

一、特殊功能控制寄存器

控制寄存器
在这里插入图片描述
数据寄存器
在这里插入图片描述

因此,控制LED1,需要配置GPIOE控制器模式:
1> 配置GPIOE_MODER寄存器,配置PE10引脚为输出的模式
2> 配置GPIOE_OTYPER寄存器,配置PE10引脚为推挽输出
3> 配置GPIOE_OSPEEDR寄存器,配置PE10引脚为低速模式
4> 配置GPIOE_PUPDR寄存器,配置PE10引脚禁止上下拉电阻
5> 配置GPIOE_ODR寄存器,配置PE10引脚输出高低电平

(一)GPIOx_MODER寄存器

在这里插入图片描述
配置PE10引脚为输出模式,即配置GPIOE_MODER寄存器的第[20:21]位为01

(二)GPIOx_OTYPER寄存器

GPIO端口输出类型寄存器
在这里插入图片描述
配置PE10引脚为推挽输出模式,即配置GPIOE_OTYPER寄存器的第[10]位为0

(三)GPIOx_OSPEEDR寄存器

GPIO端口输出速度寄存器
在这里插入图片描述
配置PE10引脚为低速模式,即配置GPIOE_OSPEEDR寄存器的第[21:20]位为00

(四)GPIOx_PUPDR寄存器

GPIO上下拉电阻寄存器
在这里插入图片描述
配置PE10引脚为禁用上下拉模式,即配置GPIOE_PUPDR寄存器的第[21:20]位为00
注:11: Reserved保留

(五)GPIOx_IDR寄存器

在这里插入图片描述
在这里插入图片描述

  • 注:IDR寄存器是只读寄存器

(六)GPIOx_ODR寄存器

在这里插入图片描述
点亮LED1,就需要PE10输出高电平,即第[10]位输出1;
熄灭LED1,就需要PE10输出低电平,即第[10]位输出0;

(七)GPIOx_BSRR寄存器

在这里插入图片描述
在这里插入图片描述

二、 查看外设控制器对应的特殊功能寄存器的基地址

在这里插入图片描述
在这里插入图片描述

三、RCC

在这里插入图片描述
在这里插入图片描述

四、代码实现

实现LED1~3交替闪烁

(一)汇编版本

/*LED1灯---PE10引脚,对应的总线为AHB4LED2---PF10,总线AHB4LED3---PE8
*/
.text 
.global _start_start:/* 1. LED灯的初始化 *//* 1.1 使能GPIOE和GPIOF外设控制器的时钟源  RCC_MP_AHB4ENSETR[5:4] = 0b3  0x50000A28*/@ 使能GPIOE和GPIOF的时钟源ldr r0, =0x50000A28			@ 准备地址ldr r1, [r0]				@ 读取地址中的数据orr r1, r1, #(0x3 << 4);	@ 修改数据str r1, [r0]				@ 写数据到地址中/* 1.2 配置PE8,PE10,PF10引脚为输出模式  GPIOE_MODER[21:20][17:16] = 0b01     0x50006000GPIOF_MODER[21:20] = 0b01     0x50007000*/@PE8和PE10ldr r0, =0x50006000ldr r1, [r0]bic r1, r1, #(0x3 << 20)orr r1, r1, #(0x1 << 20)bic r1, r1, #(0x3 << 16)orr r1, r1, #(0x1 << 16)str r1, [r0]@PF10ldr r0, =0x50007000ldr r1, [r0]bic r1, r1, #(0x3 << 20)orr r1, r1, #(0x1 << 20)str r1, [r0]/* 1.3 配置PE8,PE10,PF10引脚为推挽输出 GPIOE_OTYPER[10] = 0b0       0x50006004*/@PE10,PE8ldr r0, =0x50006004ldr r1, [r0]bic r1, r1, #(0x1 << 8)bic r1, r1, #(0x1 << 10)str r1, [r0]@PF10ldr r0, =0x50007004ldr r1, [r0]bic r1, r1, #(0x1 << 10)/* 1.4 配置PE10,PE8,PF10引脚为低速模式 GPIOE_OSPEEDR[21:20] = 0b00     0x50006008*/@PE10,PE8ldr r0, =0x50006008ldr r1, [r0]bic r1, r1, #(0x3 << 20)bic r1, r1, #(0x3 << 16)str r1, [r0]@PF10ldr r0, =0x50007008ldr r1, [r0]bic r1, r1, #(0x3 << 20)str r1, [r0]/* 1.5 配置PE10引脚禁止上下拉电阻GPIOE_PUPDR[21:20][17:16] = 0b00      0x5000600C*/ @PE8,PE10ldr r0, =0x5000600Cldr r1, [r0]bic r1, r1, #(0x3 << 20)bic r1, r1, #(0x3 << 16)str r1, [r0]@PF10ldr r0, =0x5000700Cldr r1, [r0]bic r1, r1, #(0x3 << 20)str r1, [r0]/* 2. 实现led1灯闪烁的逻辑 */stop:/* 2.1 配置PE10引脚输出高电平 GPIOE_ODR[10] = 0b1    0x50006014GPIOE_BSRR[10] = 0b1   0x50006018*/@LED1亮,LED3灭ldr r0, =0x50006018mov r1, #(0x1 << 10)orr r1, r1, #(0x1 << 24) str r1, [r0]@LED2灭ldr r0, =0x50007018mov r1,#(0x1 << 26) @LED2灭str r1, [r0]@延时1sbl delay_1s@LED1,3,2亮ldr r0, =0x50006018mov r1, #(0x1 << 26)orr r1, r1, #(0x1 << 24)str r1, [r0]ldr r0, =0x50007018mov r1, #(0x1 << 10)str r1, [r0]@延时1sbl delay_1s/* 2. 配置PE10引进输出低电平  GPIOE_ODR[10] = 0b0         0x50006014GPIOE_BSRR[26] = 0b1        0x50006018*/@LED1/2,3亮ldr r0, =0x50006018mov r1, #(0x1 << 26)orr r1, r1, #(0x1 << 8) @LED3亮str r1, [r0]@LED2灭ldr r0, =0x50007018mov r1,#(0x1 << 26) @LED2灭str r1, [r0]@延时1sbl delay_1sb stop@ 大概 1s的延时函数
delay_1s:mov r3, #0x10000000mm:cmp r3, #0subne r3, r3, #1bne mmmov pc, lr.end

(二)C语言版本

led.h

#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;volatile unsigned int ODR;volatile unsigned int BSRR;
} gpio_t;#define  GPIOE   (*((gpio_t *)0x50006000))
#define  GPIOF   (*((gpio_t *)0x50007000))#define RCC_AHB4 (*((unsigned int *)0x50000A28))typedef  enum{LED1 = 1,LED2,LED3
}leds_t;void led_init(void);
void led_turn_on(leds_t led);
void led_turn_off(leds_t led);#endif

led.c

#include "../include/led.h"/**** 功能:LED1~3初始化;* LED1---PE10* LED2---PF10* LED3---PE8
***/
void led_init(void){//使能GPIOE和GPIOF的时钟,[5:4]置1RCC_AHB4 |= 0x3 << 4;//GPIOx_MODER寄存器,输出模式01//PE8GPIOE.MODER &= ~(0x3 << 16);GPIOE.MODER |= 0x1 << 16;//PE10GPIOE.MODER &= ~(0x3 << 20);GPIOE.MODER |= 0x1 << 20;//PF10GPIOF.MODER &= ~(0x3 << 20);GPIOF.MODER |= 0x1 << 20;//GPIOx_OTYPER寄存器,推挽输出,置0GPIOE.OTYPER &= ~(0x1 << 8);GPIOE.OTYPER &= ~(0x1 << 10);GPIOF.OTYPER &= ~(0x1 << 10);//GPIOx_OSPEEDR寄存器,低速,00GPIOE.OSPEEDR &= ~(0x3 << 16);GPIOE.OSPEEDR &= ~(0x3 << 20);GPIOF.OSPEEDR &= ~(0x3 << 20);//GPIOx_PUPDR寄存器,禁用上下拉电阻,00GPIOE.PUPDR &= ~(0x3 << 16);GPIOE.PUPDR &= ~(0x3 << 20);GPIOF.PUPDR &= ~(0x3 << 20);
}void led_turn_on(leds_t led){switch (led){case LED1://PE10GPIOE.BSRR = 0x1 << 10;//BSRR寄存器不需要担心向除了操作位以外的其他位中写入0,因为写0无意义,所以此处可以直接赋值操作,而无需使用"GPIOE.BSRR|=0x1<<10"break;case LED2:GPIOF.BSRR = 0x1 << 10;break;case LED3:GPIOE.BSRR = 0x1 << 8;}
}void led_turn_off(leds_t led){switch (led){case LED1://PE10GPIOE.BSRR = 0x1 << 26;break;case LED2:GPIOF.BSRR = 0x1 << 26;break;case LED3:GPIOE.BSRR = 0x1 << 24;}
}

main.c

#include "./include/led.h"void delay_ms(unsigned int ms)
{int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 1800; j++);
}int main()
{//初始化led_init();while(1){led_turn_on(LED1);led_turn_off(LED2);led_turn_off(LED3);delay_ms(1000);//延时1sled_turn_on(LED2);led_turn_off(LED3);led_turn_off(LED1);delay_ms(1000);//延时1sled_turn_on(LED3);led_turn_off(LED1);led_turn_off(LED2);delay_ms(1000);//延时1s}return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3250325.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

C语言——详解二级指针及其与二维数组的误区、指针定义大全

C语言中的二级指针&#xff08;也称为指针的指针&#xff09;是指一个指针变量&#xff0c;它存储的不是普通的值&#xff0c;而是另一个指针的地址。这意味着你可以通过二级指针来访问和修改另一个指针的值。这种结构在C语言中非常有用&#xff0c;尤其是在处理动态内存分配、…

C语言实现二叉树以及二叉树的详细介绍

目录 1.树概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4二叉树的存储结构 3.二叉树顺序结构--特殊的二叉树--堆及其实现 3.1堆的概念及结构 3.2堆的实现 3.2.1堆的结构 3.2.2堆…

《昇思25天学习打卡营第25天|第22天》

今天是学习的第22天&#xff0c;今天学的是应用实践的自然语言处理的RNN实现情感分类。 从情感分类开始学习&#xff0c;数据准备、数据下载模块、加载IMDB数据集、加载预训练词向量、数据集预处理、模型构建、Embedding、RNN(循环神经网络)、Dense、损失函数与优化器、训练逻…

Github狂揽2.8k stars,可一键生成绘画全过程,却引发全球骂战

大家好&#xff0c;我是程序员X小鹿&#xff0c;前互联网大厂程序员&#xff0c;自由职业2年&#xff0c;也一名 AIGC 爱好者&#xff0c;持续分享更多前沿的「AI 工具」和「AI副业玩法」&#xff0c;欢迎一起交流~ 这项 AI 技术刚一上线&#xff0c;就在 Github 狂揽 1k stars…

数据库理论基础

1.什么是数据库 1.1数据 描述事物的符号记录&#xff0c; 可以是数字、 文字、图形、图像、声音、语言等&#xff0c;数据有多种形式&#xff0c;它们都可以经过数字化后存入计算机。 1.2数据库 存储数据的仓库&#xff0c;是长期存放在计算机内、有组织、可共享的大量数据…

C++初学者指南-5.标准库(第一部分)--标准库最小/最大算法

C初学者指南-5.标准库(第一部分)–标准库min/max算法 文章目录 C初学者指南-5.标准库(第一部分)--标准库min/max算法minmaxminmaxclamp (C17)min_elementmax_elementminmax_element相关内容 C标准库算法是一块新领域&#xff1f;⇒简短介绍 min min(a, b) → a 如果 a < b则…

全国产服务器主板:搭载飞腾FT2000+/64处理器的高性能加固服务器

近期很多朋友咨询全国产化的服务器主板。搭载的是飞腾FT-2000/64的全国产化服务器主板。他的主要特点是&#xff1a;①丰富的PCIe、千兆以太网、SATA接口&#xff0c;可用作数据处理、存储、通信服务器&#xff1b;②​​​​​​​板载独立显示芯片&#xff0c;对外HDMI/VGA/L…

C语言第5天作业 7月16日

目录 1.求1000以内所有的质数。 2.有1、2、3、4个数字&#xff0c;能组成多少个互不相同且无重复数字的三位数&#xff1f;都是多少&#xff1f; 3.猴子吃桃问题 4.判断最大值 1.求1000以内所有的质数。 质数&#xff1a;只能够1和它本身整除 #include <stdio.h> in…

Java 快速入门学习 -- Day 2

Java 快速入门 Ⅱ 学习视频maven&#xff08;图书管理员&#xff09;IDEA使用 maven框架MyBatis① MyBatis 是持久层框架② MyBatis 是 ORM 框架③ 搭建第一个 MyBatis 框架1、创建数据库表&#xff08;wy数据库 t_book 表&#xff09;2、创建maven 项目3、添加依赖4、创建 My…

万界星空科技MES系统生产计划管理的功能

MES系统&#xff08;Manufacturing Execution System&#xff0c;制造执行系统&#xff09;的生产计划管理功能是其核心功能之一&#xff0c;旨在将企业的生产计划转化为实际的生产操作&#xff0c;并通过实时监控和调整来确保生产活动的顺利进行。以下是MES系统生产计划管理功…

关于 Qt输入法在arm特定的某些weston下出现调用崩溃 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140423667 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

算法篇 滑动窗口 leetCode 水果成篮

水果成蓝 1.题目描述2.图形分析2.1原理解释2.2 怎么想出使用滑动窗口2.3 图形分析 3.代码演示 1.题目描述 2.图形分析 2.1原理解释 2.2 怎么想出使用滑动窗口 2.3 图形分析 3.代码演示

C语言数组进阶探索

1、数组名含义 在C语言程序中&#xff0c;数组的出现有两种可能的含义&#xff1a; &#xff08;1&#xff09;代表整个数组 &#xff08;2&#xff09;代表其首元素的地址 当出现以下情形时&#xff0c;数组代表的是整个数组&#xff1a; &#xff08;1&#xff09;在数组定义…

Zabbix × openGauss完成兼容 | 信创路上,得其法则事半功倍

在当今快速发展的信息技术领域&#xff0c;数据库作为核心组件之一&#xff0c;其性能、可靠性和兼容性一直是企业和开发者关注的焦点。 近期&#xff0c;Zabbix与openGauss完成了兼容性认证&#xff0c;经过严格联合测试&#xff0c;双方产品实现完全兼容&#xff0c;整体运行…

搭建个人智能家居 7 - 空气颗粒物检测

搭建个人智能家居 7 - 空气颗粒物检测 前言说明PMS5003ESPHomeHomeAssistant结束 前言 到目前为止&#xff0c;我们这个智能家居系统添加了4个外设&#xff0c;分别是&#xff1a;LED灯、RGB灯、DHT11温度传感器和SGP30。今天继续添加环境测量类传感器“PMS5003空气颗粒物检测…

前端JS特效第45集:js实现图片放大和拖拽特效

js实现图片放大和拖拽特效&#xff0c;先来看看效果&#xff1a; 部分核心的代码如下(全部代码在文章末尾)&#xff1a; <!DOCTYPE html> <html> <head><meta charset"utf-8"><title>js实现图片放大和拖拽特效</title><meta…

开放式耳机哪个品牌最好?2024年度首发推荐榜单来了!

在很多专业运动人士中&#xff0c;开放式耳机正变得越来越受欢迎。无论是享受纯净的音质、沉浸式的听觉体验&#xff0c;还是舒适度和通透感方面的追求&#xff0c;开放式耳机都展现出了独特的魅力。本文将带您深入探索开放式耳机的世界&#xff0c;揭示其不可忽视的优点和无限…

拒绝废话:computed、watch和methods的区分和使用场景

computed、watch和methods是用于处理数据和响应数据变化的不同方式&#xff0c;三者之间有什么不同呢&#xff0c;贝格前端工场作为10年前端老司机&#xff0c;用浅显的语言给大家分享一下。 computed&#xff1a; computed属性是用来定义一个基于依赖的响应式属性。它会根据…

CVPR2024论文解读|对齐人类审美!MPS让图像生成评估更“懂你”

导读 当人类从不同角度评估不同类型的图像时&#xff0c;偏好结果会有所不同。因此&#xff0c;为了学习多维的人类偏好&#xff0c;我们提出人类多元偏好模型&#xff08;MPS&#xff09;&#xff0c;这是第一个评估文本生成图像的多维评分模型。MPS在3个公开数据集上表现出色…

医疗设备安全、可靠,国产大功率医疗电源功不可没,旭之源医疗电源拥有高可靠性、优异EMC性能、满足医疗认证等优势!

我国作为人口大国&#xff0c;人均医疗资源相较于发达国家仍有不足&#xff0c;医疗健康产业还有很大提升空间。卡脖子的现象在医疗器械中十分明显&#xff0c;这也是医疗产业重点需要解决的。“国产化”便是有效的解决方案。 受益于医疗行业对产品自主可控意识的提升&#xff…