说明:这里以GPIO外设为例,介绍C语言对寄存器的封装。以此类推其他外设同样可以用这种方法来封装。本文有两部分构成:
1、介绍宏定义。
2、使用结构体封装寄存器列表。

1、宏定义

以封装STM32 GPIOH为例:

STM32总线基地址:

STM32GPIO基地址:

STM32 GPIOH端口寄存器列表:

所以我们先定义总线基地址,但是总线基地址是相对外设基地址的偏移,外设基地址又是总线APB1的地址,故可以先定义外设基地址:

#define PERIPH_BASE            ((unsigned int))0X40000000 )de

而APB1、APB2、APH1、APH2总线定义可以 相对基地址的偏移去定义;
如APB2: APB2相对外设基地址的偏移是0X0001 0000(0X4001 0000 - 0X4000 0000),故可定义为:PERIPH_BASE +0X0001 0000.

#define APB2PERIPH_BASE   ((PERIPH_BASE) + 0X0001 0000)

其他类似:

举例

让PH10输出低/高电平,要怎么实现?
根据参考手册我们知道PH10引脚是由寄存器GPIO_ODR的第10位进行控制。

# #define PERIPH_BASE            ((unsigned int))0X40000000 )
#define AHB2PERIPH_BASE          (PERIPH_BASE + 0X00020000)
#define GPIOH_BASE              (AHB2PERIPH_BASE + 0X1C00 )
#define GPIO_ODR                *(unsigned int*)(GPIOH_BASE + 0X14)//PH10输出低电平
GPIO_ODR & =~(1 << 10);
//PH10输出高电平
GPIO_ODR | =(1 << 10);

2、使用结构体封装寄存器列表


如图GPIOH_OTYPER相对GPIOH_MODER 偏移4字节,GPIOH_OSPEEDR相对GPIOH_OTYPER偏移4字节等寄存器。故可以用结构体封装。

所以可以使用结构体指针访问寄存器

所以所有的GPIO端口基地址都可以封装成如上所示:

STM32 | C语言对寄存器的封装相关推荐

  1. STM32(二)----寄存器讲解

    寄存器讲解 原理讲解 芯片讲解 STM32F103芯片 存储器映射 寄存器映射 STM32的外设地址映射 操作实例 C语言对寄存器的封装 封装总线和外设基地址 封装寄存器列表 点亮LED灯 思路 程序 ...

  2. keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)

    [朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...

  3. 【C语言】C语言实现面向对象编程之封装

    00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...

  4. stm32 usart的BRR寄存器的配置,程序是CMSIS中的,分析它是怎么实现的?(自己设置好波特率,库文件会根据波特率计算BRR的值,和以前STM8不一样,需要自己根据波特率计算BRR值再设置)

    stm32 usart的BRR寄存器的配置 stm32 专栏收录该内容 23 篇文章0 订阅 订阅专栏 程序是CMSIS中的,分析它是怎么实现的? 波特率由整数和分数两部分组成. RCC_GetClo ...

  5. STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置

    STM32 GPIO的配置寄存器(CRL.CRH)输入输出模式配置 1.学会使用寄存器设定所需IO的方向,学会配置CRL.CRH 2.理解如下代码的含义 //IO方向设置 #define DS18B2 ...

  6. C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)

    接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...

  7. 最新ST意法半导体STM32全系列型号的PCB封装库 带3D模型

    博根工作室(Bolgen Studio)提供最新的STM32全系列型号的PCB封装库,带原理图库和3D模型.支持Altium Desinger 10以上软件.我们可以提供STM32F0.STM32F1 ...

  8. 使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题

    使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题 比如定时器更新中断,在中断服务程序打下断点后,程序没有执行.但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需 ...

  9. 嵌入式C语言的寄存器地址映射

    对于微处理器,一切的底层配置,最终都是配置寄存器 库函数的本质就是对寄存器的封装 映射文件: stm32f10x.h 根据Datasheet,STM32F1系列的GPIO共有7个寄存器,对应的结构体定 ...

最新文章

  1. WPF中Auto与*的差别
  2. go context剖析之使用技巧
  3. (转)Go语言核心36讲之Go语言入门基础知识
  4. ReadFile 和 补充CreateFile
  5. SAP Cloud for Customer Business Configuration的权限控制
  6. CF1016F:Road Projects(树形dp)
  7. 带有光纤的可扩展,健壮和标准的Java Web服务
  8. asp.net 之高速缓存
  9. 导航一体机端口测试软件,导航端口查看器
  10. 通信专业顶刊_通信类期刊排名_2016通信期刊排名_2016通信前沿新技术
  11. manjaro踩坑记
  12. 数商云在线供应链系统服务方案:构建企业供应链平台业务、功能、技术管理架构
  13. js 剩余时间,包括天数,小时,分数,秒
  14. Qt creator开发的C++应用程序运行崩溃,异常代码0xc0000409,错误偏移量0x0009efbb解决。
  15. java 中的枚举_说说Java中的枚举(一)
  16. java 通用权限管理_通用权限管理设计篇(一)
  17. 【Linux】su 和 sudo 命令
  18. 图像算法工程师学习内容
  19. ROS基础学习之ros-tutorials(一)
  20. 【IoT】NFC 之 M1 非接触式 IC 卡性能浅析(S50)

热门文章

  1. 在树莓派上用python实现人脸识别(face_recognition,PIL,opencv)
  2. Android Google Map集成以及部分功能的实现
  3. mysql数据库网上书店实训报告_数据库.网上书店实验报告.doc
  4. 韩寒郭敬明开启音乐精准营销时代
  5. ViewBinding和DataBinding的理解和区别
  6. html怎么给图片加个叉,html+css 图片右上角加删除叉,图片删除
  7. No module named 'exceptions'
  8. 阅读笔记-DACE随机模型(计算实验设计与分析)
  9. java任意长度获取随机数
  10. 有关神经网络的训练算法,深度神经网络训练方法