STM32学习3 寄存器映射和GPIO寄存器编程

STM32学习3 寄存器映射和GPIO寄存器编程

  • 一、STM32外设内存空间
    • 1. 内存空间划分
    • 2. 区域功能说明
      • (1)block0
      • (2)block1
      • (3)block2
      • (4)block3~4
      • (5)block5
      • (6)block6
      • (7)block7
    • 3. APB总线
    • 4. AHB总线
  • 二、寄存器映射与位带操作
    • 1. 寄存器映射
    • 2. 位带操作
  • 三、寄存器映射操作步骤
    • 1. 找到外设基地址
    • 2. 找到 GPIOC 的地址
    • 3. GPIO的寄存器
    • 4. 设置GPIO口工作模式
    • 5. 开启时钟
    • 6. 寄存器映射示例

本文通过介绍GPIO寄存器,介绍寄存器编程方法,实现与前一章库函数编程类似的控制功能。
本系列源码地址: https://gitee.com/xundh/stm32_arm_learn

一、STM32外设内存空间

1. 内存空间划分

STM32 的4G地址空间以512M为单位划分为8个地址区域:
在这里插入图片描述

2. 区域功能说明

以下是8个区域每个区域的功能描述:

(1)block0

block 0 是Flash的第一块,它是Flash存储器的重要部分,主要有以下作用:

  • 让Bootloader可以在不同地址上运行,从而实现不同的启动方式和功能;
  • 片内Flash:0x08000000~0x0807FFFF 512K容量 ;
  • System momory:存储bootloader,0x1FFF F000~0x1FFF F7FF;
  • Option Bytes:存储启动方式 、读保护设置 、写保护设置 、时钟源选择、唯一设备标识信息等 ;

在这里插入图片描述

(2)block1

block1 也是Flash存储器的区块,用来设计片内SRAM。

(3)block2

通常用于存储片内外设的配置信息、参数设置 以及其它相关数据,这是寄存器编程控制外设的重点,下表是STM32外设空间映射表:
### (1)

(4)block3~4

用于配置和设置外部存储器接口FSMC(Flexible Static Memory Controller)。
在这里插入图片描述

(5)block5

也是用于FSMC。在这里插入图片描述

(6)block6

预留 。

(7)block7

ARM内部使用。

3. APB总线

在STM32微控制器中,APB(Advanced Peripheral Bus)是一种总线结构,用于连接微控制器内部的外设。STM32微控制器通常具有两个或多个APB总线,包括APB1、APB2等。这些总线的作用是连接微控制器的核心部件(如CPU、存储器等)与外设之间,以实现外设的控制和数据传输。

  • APB1总线主要用于连接一些低速外设,前表从TIM2~DAC的部分;
  • APB2总线则用于连接一些高速外设,前表从AFIO~ADC3。

4. AHB总线

AHB(Advanced High-performance Bus)总线是STM32微控制器中的一种高性能总线,通常有更高的带宽和速度。
AHB总线被分为主AHB总线和备用AHB总线。

AHB的外设从前表的 SDIO~CRC。

二、寄存器映射与位带操作

1. 寄存器映射

寄存器映射是一种将硬件设备内部的控制寄存器映射到处理器的内存地址空间中的技术(即对内存单元取一个别名),使得处理器可以通过读写这些特定的内存地址来控制和配置硬件设备的功能和参数。
寄存器映射使用#define

2. 位带操作

位带操作是一种针对特定位进行操作的技术,它可以在单条指令中对某个位进行设置、清除或者翻转,从而实现对寄存器中的单个位的操作,而不影响寄存器中的其他位。

三、寄存器映射操作步骤

1. 找到外设基地址

假设找GPIOC的第 0 管脚 , 首先,要通过手册知道GPIOC挂在APB2上,总线的基地址如下:

总线名称基地址相对APB地址
APB10x4000 00000x0
APB20x4001 00000x0001 0000
AHB0x4001 80000x0001 8000

C定义:

//  外设基地址
#define PERIPH_BASE ((unsigned int)0x40000000)
// APB2 总线基地址
#define APB2PERIPH_BASE ((PERIPH_BASE + 0x00010000)

2. 找到 GPIOC 的地址

0x4001 1000~ 0x4001 13FF
在这里插入图片描述
C 定义:

#define GPIOC_BASE (AHB2PERIPH_BASE + 0x1000)

在 stm32f10x.h 里可以找到它的定义:
在这里插入图片描述

3. GPIO的寄存器

GPIOC的寄存器偏移根据手册查询:

寄存器地址相对GPIOC基址的偏移
GPIOC_CRL0x4001 10000x00
GPIOC_CRH0x4001 10040x04
GPIOC_IDR0x4001 10080x08
GPIOC_ODR0x4001 100C0x0C
GPIOC_BSRR0x4001 10100x10
GPIOC_BRR0x4001 10140x14
GPIOC_LCKR0x4001 10180x18

C 定义:

typedef struct
{__IO uint32_t CRL;__IO uint32_t CRH;__IO uint32_t IDR;__IO uint32_t ODR;__IO uint32_t BSRR;__IO uint32_t BRR;__IO uint32_t LCKR;
} GPIO_TypeDef;
#define GPIOC               ((GPIO_TypeDef *) GPIOC_BASE)

这样使用 GPIOC->CRL 就可以操作对应的寄存器。

4. 设置GPIO口工作模式

根据前一章的介绍,GPIO的CRL和 CRH是工作模式寄存器。如果要设置推挽输出,可以使用:

    GPIOC->CRL = 0x33333333; // 配置低八位引脚为推挽输出模式GPIOC->CRH = 0x33333333; // 配置高八位引脚为推挽输出模式

5. 开启时钟

在 STM32 中,每个外设都需要时钟信号来工作,在使用外设之前需要先打开对应外设的时钟。

RCC 寄存器中的 RCC_APB2ENR 用于控制 APB2 总线上的外设时钟使能。寄存器编程时,使用宏定义:RCC_APB2ENR_IOPCEN 用来让 GPIOC 的时钟使能位,它对应于 RCC_APB2ENR 寄存器中的 GPIOC 时钟使能位。

以下是 RCC_APB2ENR 寄存器中常用的一些位定义:

  • Bit 0: AFIOEN,用于使能 AFIO 外设的时钟。
  • Bit 2: IOPAEN,用于使能 GPIOA 外设的时钟。
  • Bit 3: IOPBEN,用于使能 GPIOB 外设的时钟。
  • Bit 4: IOPCEN,用于使能 GPIOC 外设的时钟。
  • Bit 5: IOPDEN,用于使能 GPIOD 外设的时钟。
  • Bit 6: IOPEEN,用于使能 GPIOE 外设的时钟。
  • Bit 7: IOPFEN,用于使能 GPIOF 外设的时钟。
  • Bit 8: IOPGEN,用于使能 GPIOG 外设的时钟。
  • Bit 11: ADC1EN,用于使能 ADC1 外设的时钟。

编程时,使用 |= 运算符把相应位置为 1,如:RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;

6. 寄存器映射示例

#include "stm32f10x.h"// GPIO配置函数
void GPIO_Configuration(void)
{// 开启GPIOC的时钟RCC->APB2ENR |= RCC_APB2ENR_IOPCEN;// 设置GPIOC的模式为推挽输出GPIOC->CRL = 0x33333333; // 配置低八位引脚为推挽输出模式GPIOC->CRH = 0x33333333; // 配置高八位引脚为推挽输出模式
}// 延时函数
void delay(uint32_t i)
{while (i--) //当i不为0时,持续减1,实现延时;
}// 打开指定位置的LED
void on(int position)
{GPIOC->BSRR = (1 << position); // 设置对应的位,输出低电平
}// 关闭指定位置的LED
void off(int position)
{GPIOC->BRR = (1 << position); // 清除对应的位,输出高电平
}// 主函数
int main(void)
{GPIO_Configuration(); //调用GPIO配置函数int j;while (1) //无限循环{for (j = 0; j < 8; j++) //遍历0到7号位{on(j); //打开j号位的LEDdelay(0xfffff); //延时off(j); //关闭j号位的LEDdelay(0xfffff); //延时}}
}

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

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

相关文章

猫咪挑食不吃猫粮怎么办?适口性高、可以改善猫咪挑食的主食冻干分享

猫咪挑食不吃猫粮怎么办&#xff1f;在现今社会&#xff0c;养猫的人越来越多&#xff0c;大家都把自家的小猫当作宝贝来宠爱。但宠爱过度有时也会导致猫咪养成挑食的坏习惯。面对这一问题&#xff0c;我们应该如何解决呢&#xff1f;今天&#xff0c;我要分享一个既能确保猫咪…

Adobe Illustrator 2022 for Mac/Win:设计的新篇章

在数字艺术和设计领域&#xff0c;Adobe Illustrator一直以其强大的功能和高效的工具受到专业人士的青睐。随着2022年的到来&#xff0c;Adobe Illustrator 2022&#xff08;简称AI 2022&#xff09;的发布无疑为设计师们带来了新的希望和期待。 一、强大的新功能 AI 2022引入…

C++ 网络编程学习二

C 网络编程学习二 asio异步写操作asio异步读操作asio 异步echo服务端asio异步服务器中存在的隐患 asio异步写操作 async_write_some是异步写的函数&#xff1a;传入buffer和回调函数以及参数以后&#xff0c;发送后会调用回调函数。 void Session::WriteToSocketErr(const st…

什么是小红书品牌笔记,如何做好达人投放?

认认真真撰写了小红书品牌笔记&#xff0c;从各个方面确保了笔记的优质程度&#xff0c;却没能产生爆文。这很可能是笔记与用户之间的中间环节出了问题&#xff0c;也就是达人投放有问题。今天我们就为大家带来什么是小红书品牌笔记&#xff0c;如何做好达人投放&#xff1f; 一…

【c语言】if 选择语句

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;C语言 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进步&…

rk3568 I2C

rk3568 I2C I2C(Inter-Integrated Circuit)总线是一种串行通信协议,由Philips(现在的NXP)公司于1980年代初开发。它最初被设计用于连接不同的集成电路和集成模块,以降低系统成本和复杂度。随着时间的推移,I2C总线已经成为连接各种设备的主要标准之一。I2C总线最初只支持…

java设计模式的总结

作用 设计模式是一套被反复使用、经过验证、解决特定问题的最佳实践。它们提供了一种通用的语言&#xff0c;让软件开发者能够更轻松地理解和设计复杂的系统。设计模式有助于提升代码的可读性、可维护性、可扩展性和灵活性。 总结 现知设计模式总共可以分为三种目的型设计模…

SQL--字符串反转函数 reverse() 简单明了

字符串反转函数&#xff1a;reverse 语法: reverse(string A) 返回值: string 说明&#xff1a;返回字符串A的反转结果 举例&#xff1a; hive> select reverse(abcedfg); gfdecba

Navicat的使用

1. Navicat介绍 Navicat: 是一款流行的数据库管理和开发工具, 它支持多种数据库系统, 如: MySQL, MariaDB, MongoDB, SQL Server, Oracle, PostgreSQL 等. Navicat通过提供直观的图形用户界面(GUI), 使用户能够更轻松地执行各种数据库操作, 而无需记住复杂的SQL命令.以下是Nav…

PyQt5图片浏览器

PyQt5图片浏览器 实现方式功能实现具体代码 界面实现pillow源码修改ImageQt错误主页面布局 项目开源地址 分享一个图片浏览器 实现方式 qt本身有一个QGraphicsView类用来当做视图框架。 具体参考&#xff1a;如何在pyqt中使用 QGraphicsView 实现图片查看器 不过大佬给的例子…

聚集高速托盘类四向穿梭车ASRV|一车跑全仓可获得10000个货位的HEGERLS智能搬运机器人

随着国内外制造业加速转型升级&#xff0c;越来越多的企业需要进行物流智能化升级&#xff0c;但是往往受到仓库面积、高度、形状等现实条件的限制&#xff0c;以及市场不确定性因素的影响。因此&#xff0c;相对于投资传统的自动化立体库&#xff0c;企业更倾向于选择智能化、…

【深度学习数学工具】K-FAC:Kronecker-factored Approximate Curvature

Kronecker-factored Approximate Curvature (K-FAC) 是一种优化深度神经网络的先进方法&#xff0c;特别适用于大规模网络。K-FAC通过近似神经网络的Hessian矩阵的结构&#xff0c;以更有效率和准确性的方式更新网络权重。这种方法基于一个关键的观察&#xff1a;深度网络的Hes…

如何在 HTML 中嵌套、引入其他的 HTML?

在日常开发中&#xff0c;书写的 HTML 页面往往不是独立或互不通用&#xff0c;通常是有些头部、尾部或者其他部分是公用的&#xff0c;但是 HTML 有不同 JSP 页面可以使用类似 include 这样的动作标记&#xff0c;所以接下来介绍二种 HTML 页面引入其他 HTML 页面的方法。 1.…

机器学习-01-课程目标与职位分析

总结 本系列是机器学习课程的第01篇&#xff0c;主要介绍本门课程的课程目标与职位分析 教材 数据挖掘与机器学习 课程教学方法 布鲁姆教学法 认知领域&#xff08;cognitive domain&#xff09; 1.知道&#xff08;知识&#xff09;&#xff08;knowledge&#xff09; 是指…

kylin v10 升级 openssl、openssh

升级 openssl 一、查看当前安装的版本 # openssl version OpenSSL 1.0.2g 1 Mar 2016注意&#xff1a;不要卸载旧版本&#xff0c;会出依赖方面的问题&#xff01; 二、下载 wget https://www.openssl.org/source/openssl-1.1.1g.tar.gz三、编译 tar zxvf openssl-1.1.1g…

细嗦MySQL三大日志

文章目录 三大日志&#xff1a;binlog&#xff08;归档日志&#xff09;、redo log&#xff08;重做日志&#xff09;、undo log&#xff08;回滚日志&#xff09;redo log刷盘机制日志文件组 binlog记录格式写入机制 两阶段提交undo log提供回滚操作提供MVCC&#xff08;多版本…

CSS常见的选择器介绍

CSS&#xff08;层叠样式表&#xff09;选择器是一种模式&#xff0c;用于选择要应用样式的HTML元素。以下是一些常见的CSS选择器类型和实际应用样例供参考&#xff1a; 1、元素选择器&#xff1a; 直接通过HTML元素名称选择元素。例如&#xff0c;p选择所有<p>元素。 …

MySQL基本知识

目录 一&#xff0c;MySQL的元数据库 1.1.什么是元数据库 1.2.有哪些元数据库 1.3.切换数据库 二&#xff0c;账户管理 2.1.设置权限 2.2.授权用户 2.3.查看权限 2.4.撤销权限 三&#xff0c;MySQL引擎 3.1什么是数据库引擎 3.2.查看数据引擎 3.3.MyISAM引擎 3.4…

科技云报道:黑马Groq单挑英伟达,AI芯片要变天?

科技云报道原创。 近一周来&#xff0c;大模型领域重磅产品接连推出&#xff1a;OpenAI发布“文字生视频”大模型Sora&#xff1b;Meta发布视频预测大模型 V-JEPA&#xff1b;谷歌发布大模型 Gemini 1.5 Pro&#xff0c;更毫无预兆地发布了开源模型Gemma… 难怪网友们感叹&am…

【Excel PDF 系列】POI + iText 库实现 Excel 转换 PDF

你知道的越多&#xff0c;你不知道的越多 点赞再看&#xff0c;养成习惯 如果您有疑问或者见解&#xff0c;欢迎指教&#xff1a; 企鹅&#xff1a;869192208 文章目录 前言转换前后效果引入 pom 配置代码实现 前言 最近遇到生成 Excel 并转 pdf 的需求&#xff0c;磕磕碰碰总…