结构体定义寄存器方法(很流行哦)

2023-05-16



ARM寄存器数量之多,叹为观止!幸运的是,它都是以模块分布,再依托C语言的模块化编程,用户就没有必要记忆那么多的寄存器名称了!

拿LPC1114来说,单片机内部模块有“模数转换器ADC模块”,“看门狗WDG模块”,“中断模块NVIC”,“串口UART模块”等等。

每个模块都有一些寄存器。

在51单片机中,用串口发送数据,会这样写:SBUF=0x88,如何正确的把0x88写到名称为SBUF的寄存器中,在51的寄存器地址定义文件<reg51.h>里面,SCON的地址这样定义:sfr SCON = 0x98。

同样,LPC1114里面也需要定义地址,由于LPC1114用纯C语言编写程序,所以不能用“伪C语言”sfr来定义地址了。
涉及到地址,肯定会用到指针,因为指针可以指向地址。
拿看门狗模块来举例,结构体定义如下:
  1. typedef struct
  2. {
  3.     RW_en MOD;              /*看门狗模式寄存器,  地址偏移: 0x000 (R/W) */
  4.     RW_en TC;               /*看门狗常量寄存器,  地址偏移: 0x004 (R/W) */
  5.     W_en  FEED;             /*看门狗喂狗寄存器,  地址偏移: 0x008 (W)   */
  6.     R_en  TV;               /*看门狗当前值寄存器,地址偏移: 0x00C (R/ ) */
  7. }WDT_TypeDef
复制代码
结构体定义了看门狗里面一共有四个寄存器
基址定义如下:
  1. #define WDT_BASE          (APB0_BASE + 0x04000)
  1. #define APB0_BASE         (0x40000000UL)
  1. #define WDT         ((WDT_TypeDef    *) WDT_BASE   )
在官网用户手册中指出:看门狗模块的四个寄存器地址分别为0x40004000,0x40004004,0x40004008,0x4000400C,如何正确的把寄存器地址放到这个地方,上面的语句就是实现方法。

看懂上面的语句,并不是十分困难,因为都是些C语言的基础知识。(所以说,不管任何行业,高手并不是掌握了高深的技能,而是掌握了扎实的基础!)

#define 在C语言中表示 :用define后面的词代替这个词后面的语句。

写程序赋值的时候,我们会这样写:
  1. WDT->TC = 80000;
那么WDT就是:(WDT_TypeDef *) (0x40000000UL + 0x04000) 即把上面的结构体地址定义为0x40004000,那么里面的4个寄存器地址就分别是:
MOD = 0X40004000
TC= 0x40004004
FEED=0X40004008
TV=0X4000400C
地址为什么会递增4?
请看前面的RW_en,R_en,W_en,分别是:
  1. #define R_en   volatile uint32
  2. #define W_en   volatile uint32
  3. #define RW_en volatile uint32
uint32即四个字节,所以地址会增加4。

“->”运算符用于指向结构体变量指针,当然也可以用“.”,如果用“.”,对于结构体指针,要这样用:
  1. (*WDT).TC = 80000;
用"->"和"."都可以,书写正确就可以,都可以正常使用!

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

结构体定义寄存器方法(很流行哦) 的相关文章

  • Nginx进程项说明

    说明 xff1a 在Windows中nginx服务每次点击启动之后 xff0c 都会生成2个进程项 注意事项 xff1a 在Windows中nginx只能启动一次 关于与启动2项说明 进程项1 xff1a nginx主要进程信息 进程项2
  • 如何设置go环境变量GOPATH?

    如何设置go环境变量GOPATH xff1f 安装 gin gonic gin 报错 cannot download GOPATH not set For more details see go help gopath go get u g
  • vs2022发生生成错误,但错误列表没有报错的一个解决办法

    如题 xff0c 事件的起因是我在编译程序时 xff0c 遇到了这个问题 我写的是最基本的c 43 43 控制台应用程序 然而观察错误列表 xff0c 没有错误 xff0c 也没有警告 进一步尝试后发现 xff0c 即使是原先可以正常运行的
  • Google开源框架AutoFlip 实现视频智能剪裁

    Photo by Kyle Loftus from Pexels Google宣布开源视频剪裁框架AutoFlip xff0c 实现智能化自动裁剪视频 编译 xff1a 郑云飞 amp Coco Liang 技术审校 xff1a 郑云飞 原
  • 如何使用FFmpeg将AVI转换为MP4(有损转换和无损转换)

    翻译 编辑 xff1a Alex 技术审校 xff1a 刘歧 本文来自OTTVerse xff0c 作者为Krishna Rao Vijayanagar 扫描图中二维码了解音视频技术大会更多信息 Easy Tech 021 在本篇文章中 x
  • Web渗透测试之XSS攻击:反射型XSS

    文章目录 前言反射型XSS最简单的反射型XSS利用反射型XSS获得cookie获得cookie的最简单的方法DNSlog辅助获得cookie 总结 前言 在上一篇文章中我们基本了解了XSS的类型和危害 xff0c 在本篇中我们将通过具体的例
  • Web渗透测试之XSS攻击:基于DOM的XSS

    文章目录 前言基于DOM的XSS什么是DOM基于DOM的XSS产生的原因如何手工挖掘基于DOM的XSS漏洞如何利用基于DOM的XSS漏洞 总结 前言 本篇主要讲解什么是基于DOM的XSS漏洞 xff0c 基于DOM的XSS漏洞产生的原因以及
  • GET、POST、PUT、DELETE的介绍及其安全和幂等性

    先介绍一下安全和幂等的概念 所谓幂等是指不管进行多少次操作 xff0c 结果都一样 比如 xff0c 调用GET方法只是去请求资源 xff0c 自然每次调用结果都是相同的 xff0c 就是幂等的 对于POST请求 xff0c 两次调用POS
  • Debian 10(buster) 更换软件源

    编辑 etc apt sources list文件 etc apt sources list 是包管理工具 apt 所用的记录软件包仓库位置的配置文件 注释原文件所有内容 xff0c 用以下内容替代 deb http mirrors tun
  • SKB 结构详解

    SKB xff08 socket buffer xff09 是Linux网络代码中最根本的数据结构 xff0c 收发数据包都是通过skb struct sk buff These two members must be first stru
  • socket error:[Errno 111]Connection refused 问题

    1 确保服务端在相应的端口监听 xff1b 2 关闭防火墙 xff08 ubuntu下面的命令 xff1a sudo ufw disable xff09 3 而且server端要 sudo 运行 xff1b UNP第一个小程序 xff08
  • Tomcat部署项目时出错java.lang.IllegalStateException: ContainerBase.addChild: start:org.apache.catalina.Life

    Tomcat部署项目时出错java lang IllegalStateException ContainerBase addChild start org apache catalina LifecycleException Failed
  • golang报错:unrecognized import path "golang.org/x/tour"

    golang报错 xff1a unrecognized import path golang org x tour 由于golang org官网无法顺利打开 xff0c 国内的用户可以使用golang google cn镜像网站来查看一些文
  • SIFT,SURF,ORB,FAST 特征提取算法比较

    SIFT SURF ORB FAST 特征提取算法比较 主要的特征检测方法有以下几种 xff0c 在一般的图像处理库中 xff08 如opencv VLFeat Boofcv等 xff09 都会实现 FAST Machine Learnin
  • SIFT,SURF,ORB,FAST,BRISK 特征提取算法比较

    SIFT SURF ORB FAST 特征提取算法比较 图像处理的基础就是要进行特征点的提取 xff0c feature interest points detect 的方法也在不断的进步 xff0c 边检测 xff0c 角点检测 xff0
  • DispatcherServlet 源码阅读(1)

    有时间还是应该多看看源码 DispatcherServlet 是一个实实在在的 Servlet xff0c 所以 Spring MVC 引入后不会改变 Servlet 容器的行为 xff0c 仍然是解析 web xml 部署文件 xff0c
  • Kafka安装(windows)

    Kafka 简介 是一个分布式消息队列 xff0c 高吞吐量 xff0c 使用Scala实现 安装 1 安装JDK 2 下载zookeeper和kafka 解压到某个目录下面 xff0c 比如我的是 D dev 3 修改zookeeper的
  • 利用Kafka发送/消费消息-Java示例

    利用Kafka发送 消费消息 Java示例 当使用命令行工具把基本的组件运行起来后 xff0c 再使用Java client就很简单 xff0c 这里是入门的第一个Java客户端程序 xff0c 有很多需要深入理解的地方 依赖配置 span
  • 全景丨0基础学习VR全景制作,平台篇第18章:热点功能-音频

    大家好 xff0c 欢迎观看蛙色VR官方 后台使用系列课程 xff01 功能说明 应用场景 热点 xff0c 指在全景作品中添加各种类型图标的按钮 xff0c 引导用户通过按钮产生更多的交互 xff0c 增加用户的多元化体验 音频热点 xf
  • Ubuntu /mnt/hgfs/下不显示共享文件夹的处理办法

    1 安装Vmware Tools 给Vmware安装Vmware Tools 安装好Vmware Tools后可以实现主机与虚拟机之间的文件共享和复制 粘贴操作 2 终端中运行命令行 在虚拟机Ubutnu mnt hgfs文件夹下找不到共享

随机推荐