STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义

2023-05-16

 前面把基础部分讲得差不多,比如说什么是寄存器,寄存器映射,怎么样来寄存器编程,寄存器编程的时候应该参考官方的什么手册,

  • 前面讲了什么是寄存器   怎么使用寄存器编程  寄存器编程的时候应该 参考哪些手册 接下来我们开始利用固件库编程,今天开始从 最底层开始写库函数  《在零死角玩转STM32》 第九章 l利用我们上节课的历程 下面这些是7个GPIO口的寄存器映射我们到GPIO口的寄存器映射,这些是最底层的东西,我们基本上已经学会了,那么接下来我们   进入固件库编程在真正进入固件库编程之前,我们应该了解固件库与寄存器的联系,参考《零死角玩转STM32F103-霸道》第九章  自己写库构建库函数雏形针对霸道 和指南者    

   

上图是我们上节课的历程,是我们对上节课 寄存器的映射,每一个寄存器都实现了寄存器的映射,GPIO口的寄存器有7个,但是如果寄存器多的话,这样的代码要写好多 就不太方便了,那么今天就要来对他进行优化


我们来看一下上图中的寄存器映射,比如说我们要操作GPIOB  ,那么就要操作  端口B外设的基地址 :GPIOB_BASE,地址在C语言里就是指针,而且他是32位的,那么他就指向了4个字节的内存,那么我们的  GPIOB_BASE就指向GPIOB的第一个地址,那么如果我们操作 GPIOB_BASE  这个指针,那么他访问的就是CRL这个寄存器,而且我们可以看到这些寄存器都是有规律的分布的,地址都是以4个字节递增,这个就跟C语言当中的结构体是类似的,因此我们在  定义一个结构体,这个结构体也有7个成员,类型叫做 GPIO_Type,我们刚刚说了GPIOB_BASE  是一个32位的通过我们这个指针他只能访问4个字节的内存,那么如果说我们想基于这个地址来访问GPIO的所有寄存器的话,该怎么办呢?如果GPIOB_BASE 这个指针是下图中的GPIO_Type的结构体类型的话,它就可以访问GPIO的所有寄存器的话了,所以说如果我这个指针和外设的基地址是一样的话那我们就可以通过一个结构体的方式访问这个寄存器了,比起上节课讲的每一个寄存器都要找到他的绝对地址这样子要方便很多,那么怎样将我们的GPIO_BASE转化成GPIO_Type这种结构体类型的指针呢?   C语言当中有一种 叫强制类型转化

然后再将上面的类型定义成一个宏

那么这个GPIOB可以指向GPIO_Type的所有成员,这里只要GPIO_Type成员的名字对应的实际地址不变那么,那么这个结构体的成员名可以 随便定义

以下的代码中就是通过GPIOB的结构体类型指针去访问他的成员变量,利用->这个 符号就可以指向他的各个成员。

 

总结;实现结构体方式访问的原理:1.先声明一个结构体,结构体中包含很多成员, 结构体成员的类型与分布的顺序都与我们寄存器的排列方式是一样的(上图8.5中寄存器的排列方式与我们结构体中的排列都是一致的,而且我们每一个寄存器都是u32类型的,与实际的寄存器大小一致,这样就做到了结构体GPIO_Type的成员与外设寄存器的一一对应)

2找到外设的基地址例如是GPIOB_BASE,然后把这个地址强制转化成上面的结构体类型

经过强制类型转换后,它就指向了GPIO_Type这里的所有成员,那么这样我们就可以通过C语言的结构体方式来操作stm32的所有外设。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32 (5) 自己写库 构建库函数雏形1 寄存器结构体定义 的相关文章

  • UDP接收端收不到广播的消息问题排查

    网络调试助手可以互相发送 xff0c 而你的UDP广播代码却不行 你是广播 是不会被路由器转发的 但是在同一个交换机下 是可以收到广播的 还有就是 电脑的虚拟网卡会拦截广播操作 xff0c 因为你没有指定一个地址 xff0c 所以代码正确的
  • STM32带FIFO的DMA传输应用示例

    STM32系列芯片都内置DMA外设 xff0c 其中很多系列的DMA配备了FIFO 这里以STM32F429芯片及开发板为例 xff0c 演示一下带FIFO的DMA传输实现过程 大致情况是这样的 xff0c 我用TIMER1通道1的比较事件
  • 两种方式判断内存的大小端存储方式

    1 目的 xff1a 判断ubuntu操作系统的内存属于大端还是小端存储 2 源代码 两种方法判断大小端 xff08 处理器取值时的字节序 xff09 xff1a 1 字符指针 2 联合体 法1 if 1 include lt stdio
  • 字符串:求str1在str2中首次出现的位置。

    span class token macro property span class token directive keyword include span span class token string lt stdio h gt sp
  • 基于ROS利用客户端和服务端实现C++节点和python节点间传送图像

    基于ROS利用客户端和服务端实现C 43 43 节点和python节点间传送图像 配置ROS下和python3通信以及配置python3可用的cv bridge 环境安装和使用 参考 xff1a https blog csdn net qq
  • iMaxB6充电介绍

    iMaxB6是一款多用途充电器 xff0c 能够为Li ion Li Poly Li Fe Ni Cd Ni MH和Pb类型电池充电 xff0c 支持6串以内的平衡充电 简要步骤 xff1a 1 连接正负电源 xff1b 2 连接平衡线 x
  • 基于stm32串口环形缓冲队列处理机制

    原文链接 xff1a 基于stm32串口环形缓冲队列处理机制 入门级 xff08 单字节 xff09 串口环形缓冲区实验 1 1 实验简介 最简单的串口数据处理机制是数据接收并原样回发的机制是 xff1a 成功接收到一个数 xff0c 触发
  • 源码安装nginx 1.23.1

    先看看仓库们 yum list nginx 已加载插件 xff1a fastestmirror langpacks Loading mirror speeds from cached hostfile base mirrors aliyun
  • Sublime Text运行C和C++程序

    原文链接 xff1a Sublime Text运行C和C 43 43 程序 Sublime Text 是一款当下非常流行的文本编辑器 xff0c 其功能强大 xff08 提供有众多的插件 xff09 界面简洁 还支持跨平台使用 xff08
  • keilC51编译常见错误和警告说明

    如对编译出错感兴趣的网友能否把你们常遇到的错误信息收集起来并提出最终的解决办法加以归纳以期共享 xff01 1 L15 重复调用 WARNING L15 MULTIPLE CALL TO SEGMENT SEGMENT PR SPI REC
  • RS485的电路以及相关波形

    1 RS485的电路 xff0c 要注意RE引脚一般是和DE引脚接在一起的 2 差分信号AB的波形 xff0c 高电平6 2v左右 xff0c 低电平 3v 3 A点的波形 4 B点波形 5 接收RX的波形
  • Ubuntu安装cmake

    Ubuntu18 04安装cmake 转载自https www cnblogs com yanqingyang p 12731855 html 一 使用安装命令 span class token function sudo span apt
  • C/C++混淆点-strcat和strcpy区别

    一 原因分析 假设 xff1a char str 61 NULL str 61 new char 11 你想为字符串str开辟一个存储十个字符的内存空间 xff0c 然后你现在有两个字符串 xff1a char c1 61 34 abc 3
  • QGC 添加电机测试功能

    组装过程中为了测试电机的连接以及转向 xff0c 现将电机测试功能单独制作一个页面 xff0c 以便使用 一 xff0c 效果 原型 实际效果总是差那么一丢丢 二 xff0c 实现思路 MavlinkConsole 功能 xff0c 可以在
  • 川崎duAro机器人 ROS_moveit demo

    说明 demo cpp Author hiics include lt ros ros h gt include lt iostream gt MoveIt include lt moveit move group interface mo
  • Windows10 下C/C++网络编程基本:socket实现tcp的例子

    1 说明 待编辑 2 代码 test server h span class token macro property span class token directive keyword ifndef span INCLUDE TEST
  • C++ 实现简单Tcp服务器端 -- Select方式

    test server h span class token macro property span class token directive keyword ifndef span INCLUDE TEST SERVER H span
  • curl 命令的使用:HTTP请求、下载文件、FTP上传下载

    1 curl 命令简介 cURL xff08 CommandLine Uniform Resource Locator xff09 xff0c 是一个利用 URL 语法 xff0c 在命令行终端下使用的网络请求工具 xff0c 支持 HTT
  • ROS/Gazebo练习2: stack light simulation

    light description urdf light xacro span class token prolog lt xml version 61 34 1 0 34 gt span span class token comment
  • GPS基础知识(一)、GPS 定位原理

    GPS xff0c 全称 Global Positioning System xff0c 已经广泛应用于我们的日常生活中了 xff0c 现在的智能手机 里都会自带GPS定位功能 这是一个美国的全球定位系统 xff0c 虽然我们现在也有北斗了

随机推荐