STM32 | C语言对寄存器的封装
说明:这里以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语言对寄存器的封装相关推荐
- STM32(二)----寄存器讲解
寄存器讲解 原理讲解 芯片讲解 STM32F103芯片 存储器映射 寄存器映射 STM32的外设地址映射 操作实例 C语言对寄存器的封装 封装总线和外设基地址 封装寄存器列表 点亮LED灯 思路 程序 ...
- keil 4c语言读写寄存器,【STM32单片机学习】第四课:GPIO控制LED(用寄存器编程)
[朱老师课程总结] 第一部分.章节目录 第二部分.章节介绍 3.5.1.STM32的GPIO模块数据手册详解1 本节讲解STM32数据手册中GPIO模块相关的部分,主要是GPIO的各类模式及其配置方法 ...
- 【C语言】C语言实现面向对象编程之封装
00. 目录 文章目录 00. 目录 01. 前言 02. 简单程序示例 03. 程序示例优化 04. 总结 05. 参考 01. 前言 面向对象编程(OOP)并不是一种特定的语言或者工具,它只是一种 ...
- stm32 usart的BRR寄存器的配置,程序是CMSIS中的,分析它是怎么实现的?(自己设置好波特率,库文件会根据波特率计算BRR的值,和以前STM8不一样,需要自己根据波特率计算BRR值再设置)
stm32 usart的BRR寄存器的配置 stm32 专栏收录该内容 23 篇文章0 订阅 订阅专栏 程序是CMSIS中的,分析它是怎么实现的? 波特率由整数和分数两部分组成. RCC_GetClo ...
- STM32 GPIO的配置寄存器(CRL、CRH)输入输出模式配置
STM32 GPIO的配置寄存器(CRL.CRH)输入输出模式配置 1.学会使用寄存器设定所需IO的方向,学会配置CRL.CRH 2.理解如下代码的含义 //IO方向设置 #define DS18B2 ...
- C++57个入门知识点_17 类的访问权限及C语言模拟类的封装(类的私有权限突破方法:编译期进行权限检查,运行期通过指针修改类的私有成员变量;利用函数指针对结构体中成员变量进行修改;CPU大小尾排列)
接上篇:C++57个入门知识点_16 类的标准写法(类名.成员变量.成员函数及对象命名规则:成员变量一般为私有,成员函数为公有并暴露给外部使用成员变量:防止类过大,声明写在.h,实现写在.cpp,调用 ...
- 最新ST意法半导体STM32全系列型号的PCB封装库 带3D模型
博根工作室(Bolgen Studio)提供最新的STM32全系列型号的PCB封装库,带原理图库和3D模型.支持Altium Desinger 10以上软件.我们可以提供STM32F0.STM32F1 ...
- 使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题
使用keil调试STM32,定时器的CNT寄存器数值在断点读取数值不准确问题 比如定时器更新中断,在中断服务程序打下断点后,程序没有执行.但是定时器的计数器一直在计数,并不会停止,同时调试器读取数值需 ...
- 嵌入式C语言的寄存器地址映射
对于微处理器,一切的底层配置,最终都是配置寄存器 库函数的本质就是对寄存器的封装 映射文件: stm32f10x.h 根据Datasheet,STM32F1系列的GPIO共有7个寄存器,对应的结构体定 ...
最新文章
- WPF中Auto与*的差别
- go context剖析之使用技巧
- (转)Go语言核心36讲之Go语言入门基础知识
- ReadFile 和 补充CreateFile
- SAP Cloud for Customer Business Configuration的权限控制
- CF1016F:Road Projects(树形dp)
- 带有光纤的可扩展,健壮和标准的Java Web服务
- asp.net 之高速缓存
- 导航一体机端口测试软件,导航端口查看器
- 通信专业顶刊_通信类期刊排名_2016通信期刊排名_2016通信前沿新技术
- manjaro踩坑记
- 数商云在线供应链系统服务方案:构建企业供应链平台业务、功能、技术管理架构
- js 剩余时间,包括天数,小时,分数,秒
- Qt creator开发的C++应用程序运行崩溃,异常代码0xc0000409,错误偏移量0x0009efbb解决。
- java 中的枚举_说说Java中的枚举(一)
- java 通用权限管理_通用权限管理设计篇(一)
- 【Linux】su 和 sudo 命令
- 图像算法工程师学习内容
- ROS基础学习之ros-tutorials(一)
- 【IoT】NFC 之 M1 非接触式 IC 卡性能浅析(S50)
热门文章
- 在树莓派上用python实现人脸识别(face_recognition,PIL,opencv)
- Android Google Map集成以及部分功能的实现
- mysql数据库网上书店实训报告_数据库.网上书店实验报告.doc
- 韩寒郭敬明开启音乐精准营销时代
- ViewBinding和DataBinding的理解和区别
- html怎么给图片加个叉,html+css 图片右上角加删除叉,图片删除
- No module named 'exceptions'
- 阅读笔记-DACE随机模型(计算实验设计与分析)
- java任意长度获取随机数
- 有关神经网络的训练算法,深度神经网络训练方法