嵌入式系统实验——【玄武F103开发板】实现两个LED小灯闪烁
目录
- 一、实验文件
- `main.c`
- `stm32f10x.h`
- 二、实验思路
- (一)打开两个LED小灯
- 1.在玄武F103开发板上找到LED0、LED1对应的GPIO控制寄存器
- 2.找到GPIOB、GPIOE的地址
- 3.打开APB2外设时钟的使能寄存器
- 4.对GPIO寄存器进行设置
- 对端口输出寄存器进行设置
- (二)使两个LED小灯闪烁
一、实验文件
main.c
#include "stm32f10x.h" typedef unsigned int u32;void delay(u32 i)
{while(i--);
}int main(void)
{ RCC_APB2ENR |= (1<<3);GPIOB_CRL &= ~( 0x0F<< (4*5)); GPIOB_CRL |= (1<<4*5);RCC_APB2ENR |= (1<<6);GPIOE_CRL &= ~( 0x0F<< (4*5)); GPIOE_CRL |= (1<<4*5);while(1){GPIOB_ODR^=(1<<5);GPIOE_ODR^=(1<<5);delay(600000);}while(1);
}void SystemInit(void)
{
}
/*********************************************END OF FILE**********************/
stm32f10x.h
/*±¾ÎļþÓÃÓÚÌí¼Ó¼Ä´æÆ÷µØÖ·¼°½á¹¹Ì嶨Òå*//*片上外设基地址*/
#define PERIPH_BASE ((unsigned int)0x40000000)/*APB2总线基地址*/
#define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000)
/*AHB总线基地址,这个不完全准确,与真实值有不同*/
#define AHBPERIPH_BASE (PERIPH_BASE + 0x20000)/*GPIOB外设基地址*/
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)/* GPIOB寄存器*/
#define GPIOB_CRL *(unsigned int*)(GPIOB_BASE+0x00)
#define GPIOB_CRH *(unsigned int*)(GPIOB_BASE+0x04)
#define GPIOB_IDR *(unsigned int*)(GPIOB_BASE+0x08)
#define GPIOB_ODR *(unsigned int*)(GPIOB_BASE+0x0C)
#define GPIOB_BSRR *(unsigned int*)(GPIOB_BASE+0x10)
#define GPIOB_BRR *(unsigned int*)(GPIOB_BASE+0x14)
#define GPIOB_LCKR *(unsigned int*)(GPIOB_BASE+0x18)/*GPIOE外设基地址*/
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)/* GPIOE寄存器*/
#define GPIOE_CRL *(unsigned int*)(GPIOE_BASE+0x00)
#define GPIOE_CRH *(unsigned int*)(GPIOE_BASE+0x04)
#define GPIOE_IDR *(unsigned int*)(GPIOE_BASE+0x08)
#define GPIOE_ODR *(unsigned int*)(GPIOE_BASE+0x0C)
#define GPIOE_BSRR *(unsigned int*)(GPIOE_BASE+0x10)
#define GPIOE_BRR *(unsigned int*)(GPIOE_BASE+0x14)
#define GPIOE_LCKR *(unsigned int*)(GPIOE_BASE+0x18)/*RCC外设地址*/
#define RCC_BASE (AHBPERIPH_BASE + 0x1000)
/*RCC的AHB1始终使能寄存器地址,强制转换成指针*/
#define RCC_APB2ENR *(unsigned int*)(RCC_BASE+0x18)
二、实验思路
(一)打开两个LED小灯
1.在玄武F103开发板上找到LED0、LED1对应的GPIO控制寄存器
玄武F103开发板原理图.pdf (ctrl+f查找LED0即可)
分别位于GPIOB和GPIOE(PB5中的B对应GPIOB、PE5中的E对应GPIOE)


2.找到GPIOB、GPIOE的地址
在STM32F1xx中文参考手册中的28页找到:

但是在本次实验的文件中,采取分别列出各个总线的地址,具体寄存器位于基于总线的偏移量的方式记录各寄存器的地址

3.打开APB2外设时钟的使能寄存器

可以在STM32F1xx中文参考手册中的低70页看到RCC上GPIOB、GPIOE对应的始终分别在位3和位6

于是在main.c中打开这两个端口的时钟



4.对GPIO寄存器进行设置
采用通用推挽输出,速度为10M
在此之前需要清空控制其的端口位


对端口输出寄存器进行设置

如图所示,当LED0所在位置为低电平时,LED0点亮,相反则熄灭
(这里我没搞明白为什么是第五位,可能是因为PB5和PE5中的数字5,如果是这样的话,代码中的(1<<5)都应该改为16,但好像并不是这样)
//PB5输出低电平设置
GPIOB_ODR&=(0<<5);
//PE5输出低电平设置
GPIOE_ODR&=(0<<5);
(二)使两个LED小灯闪烁
将
//PB5输出低电平设置
GPIOB_ODR&=(0<<5);
//PE5输出低电平设置
GPIOE_ODR&=(0<<5);
改为
while(1){GPIOB_ODR^=(1<<5);GPIOE_ODR^=(1<<5);delay(600000);}
并添加delay函数的定义:
void delay(u32 i)
{while(i--);
}
上述代码含义即为每隔一定的CPU执行一定数量的算术运算指令(delay函数的内容)后,就将GPIOB和GPIOE的端口输出寄存器的低五位的值按位取反
如下的代码会导致两个LED等都常亮
while(1){GPIOB_ODR^=(16);GPIOE_ODR^=(16);delay(600000);}
相关文章:
嵌入式系统实验——【玄武F103开发板】实现两个LED小灯闪烁
目录一、实验文件main.cstm32f10x.h二、实验思路(一)打开两个LED小灯1.在玄武F103开发板上找到LED0、LED1对应的GPIO控制寄存器2.找到GPIOB、GPIOE的地址3.打开APB2外设时钟的使能寄存器4.对GPIO寄存器进行设置对端口输出寄存器进行设置(二&a…...
数组之双指针题
文章目录一、最长连续不重复子序列1.题目介绍2.思路3.二、长度最小的子数组1.题目介绍2.思路3.代码三、数组元素的目标和1.题目介绍2.思路3.代码总结其实在之前我写过不少双指针得题解,刷题专练之数组移除元素 刷题专练之翻转题练习这两篇文章的题解基本就是双指针法…...
真实需求和梦想实现满足
多少的时光和岁月中都不曾认真系统的深度思考自己的真实需求和欲望之间是否一致,随着时间的流逝才发现自己追求的是一场空,自己的真实需求并不是苦苦追求的东西,这也是当梦想照进现实!欲望是无善无恶的,不必为了满足自…...
[ant-design-vue] tree 组件功能使用
[ant-design-vue] tree 组件功能使用描述环境信息相关代码参数说明描述 是希望展现一个树形的菜单,并且对应的菜单前有复选框功能,但是对比官网的例子,我们在使用的过程中涉及到对半选中情况的处理: 半选中状态: 选中…...
QT父子窗口事件传递与事件过滤器
处理监控系统的时候遇到问题,在MainWidget中创建多个子Widget的时候,原意是想鼠标点击先让MainWidget截获处理后再分派给子Widget去处理,但调试后发现如果子Widget重新实现了事件方法,就直接处理掉事件了,没有进到Main…...
【2.4 golang中的循环语句for】
- 循环语句for 1. 循环语句for 1.1.1. Golang for支持三种循环方式,包括类似 while 的语法。 for循环是一个循环控制结构,可以执行指定次数的循环。 语法 Go语言的For循环有3中形式,只有其中的一种使用分号。 for init; condition; pos…...
Windows 系统下 Apache 和 php 环境怎么搭建?
传统搭建方法在 Windows 系统下,可以通过以下步骤来搭建 Apache 和 PHP 环境:1.下载 Apache 在 Apache 官网下载最新版本的 Apache,例如下载地址为 https://httpd.apache.org/download.cgi。2.安装 Apache 将下载的 Apache 压缩包解压到某个目…...
Python基础知识——字符串、字典
字符串 在Python中,字符和字符串没有区别。可能有些同学学过其他的语言,例如Java,在Java中,单引号’a’表示字符’a’,双引号"abc"表示字符串"abc",但在Python当中,它们没…...
JVM常用指令
JVM常用指令1.准备工作2.jps3. jconsole4.jstat5.jstack6.jmap7.jvisualvm工具8.自动dump内存信息1.准备工作 在idea中编写代码 public class JVMTest {Testpublic void test() throws InterruptedException {while (true) {Thread.sleep(1000);System.out.println(123);}} }…...
排序中常见的一些指标
1、错误率与精度 错误率与精度是分类任务中最常用的两种性能度量,错误率是指分类错误的样本占样本总数的比例,精度则是分类正确的样本数占样本总数的比例。 错误率: 精度: 2、准确率/召回率/FScore True Positive(真正例, TP)&…...
51单片机入门————数码管显示
我们在马路上看到的红绿灯,就是由数码管来实现的,就是其中可能加入了一些延时和转换数码管是通过控制138译码器与74HC245来控制数码管的亮灭与数字的显示电路原理图我们先讨论一个数码管数码管有共阳极和共阴极,我们现在使用的STC89C52是共阴…...
Spring事务未生效场景
一.抛出事务不支持的异常 原理: Spring事务默认支持RuntimeException异常,抛出的异常为RuntimeException异常及其子类异常事务均可生效,而我们日常常见的异常基本都继承自RuntimeException,所以无需指定异常类型事务也能生效。但…...
servlet注解开发
文章目录servlet注解开发内容回顾响应对象 HttpServletResponse重定向与请求转发ServletConfig简介案例ServletContext简介案例Servlet 注解开发简介注解使用案例WebServlet 注解详细参数综合的增删改查案例登录注册功能servlet注解开发 内容回顾 响应对象 HttpServletRespon…...
mysql一联合主键
联合主键就是用2个或2个以上的字段组成主键。用这个主键包含的字段作为主键,这个组合在数据表中是唯一,且加了主键索引。 可以这么理解,比如,你的订单表里有很多字段,一般情况只要有个订单号bill_no做主键就可以了&…...
openpnp - 判断吸嘴是否指定了正确的旋转轴
文章目录openpnp - 判断吸嘴座是否指定了正确的旋转轴概述笔记吸嘴单独矫正的时候Calibrate precise camera ↔ nozzle N1 offsets.ENDopenpnp - 判断吸嘴座是否指定了正确的旋转轴 概述 如果没有指定吸嘴座的正确旋转轴, 会因为对应吸嘴该旋转时不旋转, 而是另外一个空闲的吸…...
【办公类-19-03】办公中的思考——Python批量统一文件名的序号(保教主任整理打印文件)
背景需求:为迎接督导检查,保教主任从各条线收集文本资料。并在每个文件名称前手动编号。但是她嘀咕道:”为什么两套资料放在一个文件里就不是按照数字序号排序?,有的是1X-,有的是40X,看起来很乱…...
MySQL约束
约束约束总结约束 1、概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。 2、目的:保证数据库中数据的正确、有效性和完整性。 3、分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表…...
x86 平台利用 qemu-user-static 实现 arm64 平台 docker 镜像的运行和构建
文章目录[toc]关于 docker 版本查看是否开启 experimental 功能开启 experimental 功能查看当前环境平台拉取一个 arm 平台的容器运行一个 arm 平台的容器整一个 qemu-user-static注册可支持的架构解释器尝试启动 arm64 镜像尝试启动 ppc64le 镜像后台运行 arm64 容器build 一个…...
找工作经验分享
好的简历的特点:简洁:不要使用花里胡俏的简历模板,一般就是一行行写下来那种就行主次分明:一定要有重点,让面试了解你强项是什么首先当然是突出技术,不要花大批篇幅在个人信息、兴趣爱好等,重点…...
C语言学习之路--操作符篇,从知识到实战
目录一、前言二、操作符分类三、算术操作符四、移位操作符1、左移操作符2、右移操作符五、位操作符拓展1、不能创建临时变量(第三个变量),实现两个数的交换。2、编写代码实现:求一个整数存储在内存中的二进制中1的个数。六、赋值操…...
变量 varablie 声明- Rust 变量 let mut 声明与 C/C++ 变量声明对比分析
一、变量声明设计:let 与 mut 的哲学解析 Rust 采用 let 声明变量并通过 mut 显式标记可变性,这种设计体现了语言的核心哲学。以下是深度解析: 1.1 设计理念剖析 安全优先原则:默认不可变强制开发者明确声明意图 let x 5; …...
日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
pam_env.so模块配置解析
在PAM(Pluggable Authentication Modules)配置中, /etc/pam.d/su 文件相关配置含义如下: 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块,负责验证用户身份&am…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
LeetCode - 199. 二叉树的右视图
题目 199. 二叉树的右视图 - 力扣(LeetCode) 思路 右视图是指从树的右侧看,对于每一层,只能看到该层最右边的节点。实现思路是: 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
