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

这次是从头开始学习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_Htypedef 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.hqwc.cn/news/706064.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python批量生成防伪识别二维码

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.代码 三.使用 四.总结 一.前言 二维码(QR Code)是一种矩阵条码技术,它使用黑白矩形图案来表示二进制数据,这些矩形图案可以被设备扫描并解读。二维码可以被用来存储

macOS Ventura 13如何设置定时重启(命令行)

文章目录 macOS Ventura 13如何设置定时重启(命令行)前言具体设置步骤及命令解释其他 macOS Ventura 13如何设置定时重启(命令行) 前言 由于升级 macOS 13 Ventura 之后,之前在节能里面通过鼠标点击设置开机关机的方法不能用了,现在只能用命令设置开机…

设计模式:外观模式(Facade)

设计模式:外观模式(Facade) 设计模式:外观模式(Facade)模式动机模式定义模式结构时序图模式实现在单线程环境下的测试在多线程环境下的测试模式分析优缺点适用场景应用场景模式扩展参考 设计模式&#xff1…

英伟达发布 VILA 视觉语言模型,实现多图像推理、增强型上下文学习,性能超越 LLaVA-1.5

前言 近年来,大型语言模型 (LLM) 的发展取得了显著的成果,并逐渐应用于多模态领域,例如视觉语言模型 (VLM)。VLM 旨在将 LLM 的强大能力扩展到视觉领域,使其能够理解和处理图像和文本信息,并完成诸如视觉问答、图像描…

001_PyQt简介

本系列面向零基础小白,从零开始到Pyqt 进行项目实战。 什么叫从零开始?从软件安装、环境配置开始。 不跳过一个细节,不漏掉一行代码,不省略一个例图。 PyQt作为一个强大的工具包,成功地将脚本语言python和QT库融合到…

Java | Leetcode Java题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution {public int numDecodings(String s) {int n s.length();// a f[i-2], b f[i-1], cf[i]int a 0, b 1, c 0;for (int i 1; i < n; i) {c 0;if (s.charAt(i - 1) ! 0) {c b;}if (i > 1 && s.charAt(i …

【PB案例学习笔记】-03用户名密码校验

写在前面 通过一个个由浅入深的编程实战案例学习&#xff0c;提高编程技巧&#xff0c;以保证小伙伴们能应付公司的各种开发需求。 文章中设计到的源码&#xff0c;小凡都上传到了gitee代码仓库https://gitee.com/xiezhr/pb-project-example.git 需要源代码的小伙伴们可以自行…

海上定位测量难?千寻星基稳如“定”海神针_0416(update-2)

海上定位测量难&#xff1f;千寻星基稳如“定”海神针 近年来&#xff0c;随着海洋资源的开发和利用&#xff0c;海上定位测量的需求日益增加&#xff0c;它通过测量物体的位置和方向来确定海洋中的各项活动。其准确性和可靠性对于确保海上作业的安全和效率至关重要。 由于海…

Qwen学习笔记2:Qwen模型基于ReAct原理实现function calling

前言 这也是一篇笔记&#xff0c;再探索一下Qwen模型的function calling功能。 Qwen1.8B模型能够进行function calling功能吗&#xff1f; 我们使用之前的reason_prompt模板进行测试&#xff1a; PROMPT_REACT """ Use the following format:Question: the…

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果&#xff0c;必须要结合插值法和分布函数来做&#xff0c;主要还是因为勘探点太少&#xff0c;直接用插值法效果不太好&#xff0c;以下是我做的&#xff0c;函数分布可…

宁静致远(“静”)

宁静致远是一个成语&#xff0c;读音为nng jng zh yuǎn&#xff0c;意思是只有心境平稳沉着、专心致志&#xff0c;才能厚积薄发、 有所作为。出自《淮南子:主术训》。 出处 宁静致远张铭篆刻 此句最早出自西汉初年道家刘安的《淮南子:主术训》&#xff0c;蜀汉丞相诸葛亮的…

C语言 | Leetcode C语言题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; int numDecodings(char* s) {int n strlen(s);// a f[i-2], b f[i-1], c f[i]int a 0, b 1, c;for (int i 1; i < n; i) {c 0;if (s[i - 1] ! 0) {c b;}if (i > 1 && s[i - 2] ! 0 && ((s[i - 2] - 0) * 10…