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引入…

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

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

【c语言】if 选择语句

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

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;企业更倾向于选择智能化、…

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

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

细嗦MySQL三大日志

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

科技云报道:黑马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;磕磕碰碰总…

stm32——hal库学习笔记(DMA实验)

一、DMA介绍&#xff08;了解&#xff09; 二、DMA结构框图介绍&#xff08;熟悉&#xff09; 三、DMA相关寄存器介绍&#xff08;熟悉&#xff09; 四、DMA相关HAL库驱动介绍&#xff08;掌握&#xff09; 五、DMA配置步骤&#xff08;掌握&#xff09; 六、编程实战&#xff…

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

大概了解一下G1收集器

在上一篇文章中&#xff08;链接&#xff1a;大概了解一下CMS收集器&#xff09;我们提到&#xff0c;CMS是一种主要针对旧生代对象进行回收的收集器。与CMS不同&#xff0c;G1号称“全功能的垃圾收集器”&#xff0c;对初生代内存和旧生代内存均进行管理。鉴于此&#xff0c;这…

pyspark分布式部署随机森林算法

前言 分布式算法的文章我早就想写了&#xff0c;但是一直比较忙&#xff0c;没有写&#xff0c;最近一个项目又用到了&#xff0c;就记录一下运用Spark部署机器学习分类算法-随机森林的记录过程&#xff0c;写了一个demo。 基于pyspark的随机森林算法预测客户 本次实验采用的…

成功解决ModuleNotFoundError: No module named ‘cv2’

&#x1f525; 成功解决ModuleNotFoundError: No module named ‘cv2’ &#x1f525; &#x1f308; 个人主页&#xff1a;高斯小哥 &#x1f525; 高质量专栏&#xff1a;Matplotlib之旅&#xff1a;零基础精通数据可视化、Python基础【高质量合集】、PyTorch零基础入门教程 …

中间件-Nginx漏洞整改(限制IP访问隐藏nginx版本信息)

中间件-Nginx漏洞整改&#xff08;限制IP访问&隐藏nginx版本信息&#xff09; 一、限制IP访问1.1 配置Nginx的ACL1.2 重载Nginx配置1.3 验证结果 二、隐藏nginx版本信息2.1 打开Nginx配置文件2.2 隐藏Nginx版本信息2.3 保存并重新加载Nginx配置2.4 验证结果2.5 验证隐藏版本…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录&#xff0c;然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

Jenkins 中针对视图分组(11)

一、将没有在视图的项目进行归纳操作&#xff1b; 新增的项目规则&#xff0c;并入到某就一个视图中&#xff0c;但常规是设置一个规则&#xff0c;后续按照规则走&#xff0c;就不用单独设置 1、首先到控制台页面&#xff0c;如果没有视图分组就点击加号新增&#xff1b;已存在…

JavaScript异步编程

回调地狱 回调地狱是一种由于过度使用嵌套回调函数而导致的代码结构不清晰、难以理解和维护的问题。一个典型例子是嵌套多个回调函数&#xff0c;每个回调函数都作为另一个回调函数的参数。这样会导致各个部分之间高度耦合、程序结构混乱、流程难以追踪&#xff0c;每个任务只能…