STM32手写寄存器的方式实现点亮LED灯

news2025/1/23 23:25:28

这次是从头开始学习STM32,看野火的视频开始学习,感觉需要记录的时候就要记录一下学习的心得。野火视频学习的老师讲的还是很到位的,能够学习到很多的细节之处,有时会感觉很啰嗦,但是不得不说确实很详细,只有这样对于真正的底层才能更清楚明白是怎么回事,原理很重要。写这篇博文的目的是记录我的练习过程中连续好几天犯得同一个错误,每次写都这样,而且找半天找不到哪里错了,必须拿着原来写的一行一行的对,才能发现问题,特此记录一下,下次再范同样的错误时就来看这篇文章吧!感觉这样就能快速的定位错误了。我犯得错误就是每次宏定义外设基地址时都定义成了无符号整型指针类型了,其实只需要定义成无符号整型类型就好了。结果每次都忘了这事,今天有一次查了半天,感觉还是要记录一下才对,太浪费时间了。

好了,多了不想说了,直接贴代码吧:

#include "stm32f10x.h"



int main(void)
{
	/*
	
	RCC_APB2ENR = 0x0008;  //APB2外设时钟使能寄存器
	
	GPIOB_CRL = 0x0003;    //GPIOB端口配置低寄存器
	
	GPIOB_ODR = 0xFFFE;    //GPIOB端口输出配置寄存器
	
	*/
	
	RCC->APB2ENR = 0x0008;  //APB2外设时钟使能寄存器
	
	GPIOB->CRL = 0x0003;    //GPIOB端口配置低寄存器
	
	GPIOB->ODR = 0xFFFE;    //GPIOB端口输出配置寄存器
		
	
}

void SystemInit(void)
{
	
}
#ifndef __STM32F10X_H    //如果没有编译__STM32F10X_H
#define __STM32F10X_H    //就编译 __STM32F10X_H

typedef unsigned int uint32_t;    //把无符号整型重新命名为  :uint32_t

#define PERIPHL_BASE               ((uint32_t )0x40000000)   // 外设基地址(**********这里主要只是强转成无符号整型(不是指针)**********)
#define APB1_PERIPHL_BASE          (PERIPHL_BASE)            // APB1基地址 = 外设基地址
#define APB2_PERIPHL_BASE          (PERIPHL_BASE + 0x10000)  // APB2基地址 = 外设基地址 + 0x10000
#define AHB_PERIPHL_BASE           (PERIPHL_BASE + 0x20000)  // AHB基地址  = 外设基地址 + 0x20000

#define RCC_BASE                    (AHB_PERIPHL_BASE + 0x1000)  //RCC基地址 = AHB基地址 + 0x1000
#define GPIOB_BASE                  (APB2_PERIPHL_BASE + 0x0C00) //GPIOB基地址 = APB2基地址 + 0x0C00

//#define RCC_APB2ENR                 *((uint32_t *)(RCC_BASE + 0x18))    //APB2外设时钟使能寄存器
//#define GPIOB_CRL                   *((uint32_t *)(GPIOB_BASE + 0x00))  //GPIOB端口配置低寄存器
//#define GPIOB_ODR                   *((uint32_t *)(GPIOB_BASE + 0x0C))  //GPIOB端口输出配置寄存器

typedef struct
{                      //创建结构体GPIO_TypeDef 里面的每个成员地址正好相差4个字节,把GPIOB的地址赋给他
	uint32_t CRL;      //结构体内部的每个成员的地址就正好是GPIOB每个寄存器的地址,免去了一个一个的#define了
	uint32_t CRH;
	uint32_t IDR;
	uint32_t ODR;
	uint32_t BSRR;
	uint32_t BRR;
	uint32_t LCKR;
}GPIO_TypeDef;

typedef struct
{                      //创建结构体RCC_TypeDef 里面的每个成员地址正好相差4个字节,把RCC的基地址赋给他
	uint32_t CR;       //结构体内部的每个成员的地址就正好是RCC每个寄存器的地址,免去了一个一个的#define了
	uint32_t CFGR;
	uint32_t CIR;
	uint32_t APB2_RSTR;
	uint32_t APB1_RSTR;
	uint32_t AHBENR;
	uint32_t APB2ENR;
	uint32_t APB1ENR;
}RCC_TypeDef;

#define GPIOB                    ((GPIO_TypeDef *)GPIOB_BASE)  // GPIOB就是把GPIOB的基地址强转成GPIO结构体的指针
#define RCC                      ((RCC_TypeDef *)RCC_BASE)     // RCC就是把RCC的基地址强转成RCC结构体的指针







#endif  /*__STM32F10X_H*/  //结束编译




这个工程是很简单的,从0开始建立工程,自己手写寄存器映射,感觉对标准库的理解又前进了一大步。

整个工程只是参考了数据手册中对RCC和GPIO的寄存器描述

最后编译就能正常点亮GPIOB 0的LED灯了:

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

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

相关文章

IT行业现状与探索未来发展趋势

​​​​​​​ 我眼中的IT行业现状与未来趋势 随着技术的不断进步,IT行业已成为推动全球经济和社会发展的关键力量。从云计算、大数据、人工智能到物联网、5G通信和区块链,这些技术正在重塑我们的生活和工作方式。你眼中IT行业的现状及未来发展趋势是…

六西格玛绿带培训:解锁质量工程师的职场新篇章

在质量管理这条道路上,我们或许都曾有过这样的疑问:为何付出了同样的努力,却未能获得预期的回报?当我们看到身边的同行们逐渐步入高薪的行列,而自己却似乎陷入了职业的泥沼,这种对比无疑令人倍感焦虑。然而…

iRemovalPro完美解4G信号,支持A12+,支持6S~14ProMax,支持iOS17.4+

iRemovalPro是一款绕过激活锁界面的解锁工具,可以激活所有iPhone/ipad恢复信号,并且支持插卡接打电话、收发短信、4G流量上网,支持iCloud登录,有消息通知,支持iPhone6S~14ProMax的所有型号,支持iOS15-iOS17…

酷开科技的智能电视操作系统—酷开系统,带来更加舒适的观看体验

酷开科技的智能电视操作系统——酷开系统,通过大数据和人工智能技术的结合,会根据会员的观看历史和收视行为偏好,刻画出“消费者群体画像”,然后将内容进行“人工编辑智能推荐”的方式推送到消费者面前,不仅省去了消费…

僵尸网络的威胁值得关注

僵尸网络(botnet)是指一组受到恶意软件感染并遭到恶意用户控制的计算机。术语“僵尸网络”由“机器人(bot)”和“网络(network)”两个词组合而成,每台受感染设备被称为“机器人”。僵尸网络可用…

谷歌举办Gemini API开发者大赛;ChatGPT iOS版更新支持中文

🦉 AI新闻 🚀 谷歌举办Gemini API开发者大赛,大奖1981款电动DeLorean 摘要:IT之家 5 月 15 日消息,在 2024 年谷歌 I/O 开发者大会上,谷歌宣布举办 Gemini API 开发者大赛,主要面向个人开发者…

Springboot+Vue项目-基于Java+MySQL的高校专业实习管理系统(附源码+演示视频+LW)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:Java毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计 &…

Spring MVC(建立连接 + 请求)

文章目录 一、建立客户端和服务器的连接二、如何构造请求(传参)2.1 构造请求方式 参数通用注解2.2 传递单个参数2.3 传递多个参数2.4 传递数组/集合2.5 传递对象2.6 传递JSON 三、相关的其他请求操作3.1 获取URL中的参数 PathVariable3.2 上传文件 Requ…

Golang | Leetcode Golang题解之第92题反转链表II

题目&#xff1a; 题解&#xff1a; func reverseBetween(head *ListNode, left, right int) *ListNode {// 设置 dummyNode 是这一类问题的一般做法dummyNode : &ListNode{Val: -1}dummyNode.Next headpre : dummyNodefor i : 0; i < left-1; i {pre pre.Next}cur :…

Dubbo配置上的一些概念

对于dubbo在spring中我们可能看到有如下配置&#xff08;可参考Schema 配置参考手册 | Apache Dubbo&#xff09;&#xff1a; dubbo:application:id: dubbo-account-examplename: dubbo-account-example# 是否启用 Dubbo 的 QoS&#xff08;Quality of Service&#xff09;服…

什么是趋肤效应

很多同行来问什么是趋肤效应&#xff0c;趋肤效应应该是附在表面&#xff0c;为什么变成了附在线路横截面的底面&#xff1f;下面就和小易&#xff0c;一起具体了解下趋肤效应。 趋肤效应也称集肤效应&#xff0c;英文术语是Skin effection,它是指在电流流过导体时&#xff0c;…

DOS学习-目录与文件应用操作经典案例-cd

欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一.前言 二.案例 三.练习 一.前言 虽然Windows 2000/XP/2003系统已经不再使用纯DOS平台&#xff0c;但它们内建了一个功能强大的命令行界面。在这个界面中&#xff0c;用户可以像在Wind…

2024.05.15学习记录

1、完成Ts重构Axios项目中更多功能的开发 2、刷题&#xff1a;二叉树&#xff08;代码回忆录&#xff09; 3、复习diff算法源码解读

在k8s中搭建elasticsearch高可用集群,并对数据进行持久化存储

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《洞察之眼&#xff1a;ELK监控与可视化》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、引言 1、Elasticsearch简介 2、k8s简介 二、环境准备 …

k8s概述及核心组件

一、k8s概述 1.1 引言 docker compose 单机编排工具 有企业在用 docker swarm 能够在多台主机中构建一个docker集群 基本淘汰集群化管理处理工具 容器 微服务封装 dockerfile 编写成镜像 然后进行发布 dockerfile 可以写成shell脚本&#xff08;函数做调…

xmzs切换镜像源

1.全局安装 npm install xmzs -g 2.mmp ls 查看镜像源 3.mmp use 选择镜像源

CTF网络安全大赛web题目:just_sqli

这道题目是bugku的web题目 题目的 描  述: KosenCTF{} 原文链接&#xff1a; CTF网络安全大赛web题目&#xff1a;just_sqli - 红客网-网络安全与渗透技术 题目Web源代码&#xff1a; <?php$user NULL; $is_admin 0;if (isset($_GET["source"])) {highlig…

Spring实现数据库读写分离(MySQL实现主从复制)

目录 1、背景 2、方案 2.1 应用层解决: 2.2 中间件解决 3、使用Spring基于应用层实现 3.1 原理 3.2 DynamicDataSource 3.3 DynamicDataSourceHolder 3.4 DataSourceAspect 3.5 配置2个数据源 3.5.1 jdbc.properties 3.5.2 定义连接池 3.5.2 定义DataSource 3.6…

企业微信hook接口协议,ipad协议http,大文件网络上传

大文件网络上传 参数名必选类型说明url是String网络图片地址 请求示例 {"uuid":"2b0863724106a1160212bd1ccf025295","authkey":"0AAxxx031", "filekey":"346b7bff-08d5-4ac2-bc67-fd10e3eb2388", "fileur…

恒创科技:域名CNAME解析和A记录解析有哪些区别?

​  域名是互联网上的一种地址&#xff0c;是用以替代复杂IP地址的字符标识&#xff0c;在进行域名解析时&#xff0c;主要有两种常见的记录类型&#xff1a;CNAME 记录和 A记录解析。今天就给大家讲下CNAME解析和A记录解析有哪些区别、优势。这里&#xff0c;我们先了解下什…