单片机对底层寄存器的操作

2023-05-16

最近项目用到了国产的一款单片机,没有例程的支持,需要自己从头开始写底层。又感受到了自己本科刚学习51的时候的浮躁,不懂得如何操作底层的寄存器,只是一味的抄写别人的例程,然后进行简单改动。后来参加比赛,使用的恩智浦的K60单片机也是这样,直接使用别人写好的代码库,调用一下函数,再后来学习STM32也是这样,完全不懂得软件和硬件的接轨,也就没有对底层了如指掌的从容,写出来的代码也不够优雅。

铺垫了这么多,也该进入正文了。单片机编程和直接的计算机编程的一个突出区别就是对底层的操作,计算机编程时不需要关心计算机的寄存器如何配置,而单片机则需要通过配置寄存器来实现某些功能。在将寄存器的地址也以C语言的命名规则进行命名之后,就是C语言的天下了。对这些代表寄存器地址的变量进行修改,就可以修改寄存器的值,读取这些变量的值也就相应的读取寄存器的值了。这一过程的关键点就是将单片机的寄存器地址与C语言变量建立关系。

在51单片机的编程中主要提供了两个关键字 sfr和sbit。sfr a = 0x00; 这样a代指就是单片机的0x00这个地址里面的数据,这个地址总共有8位,这是一款8位单片机。如果这个地址代表的是GPIO的话,那么每一位都可能代表一个GPIO的电平状态,因此就要进行位操作,通过“&”和“|”进行位操作自然是可以的,也是较常用的,但是对于GPIO口这种外设,经常需要操作某一个GPIO口,如果频繁的进行位操作,编程就比较麻烦。因此就诞生了sbit这个关键字,sbit b = P0^0; 这样b就代表了单片机的P0.0引脚所代指的数据。如果GPIO初始化为推挽输出的话,可以通过直接修改b的值对P0.0引脚的电平进行修改。如果GPIO初始化为上拉输入的话,也可以通过读取b的值读取GPIO连接的外部电平的状态。

接下来看STM32单片机,STM32单片机编程的时候就不用sfr和sbit这两个关键字了,但是使用了一个更加巧妙的方法,这个方法可以说是C语言的灵魂了,这就是指针。声明指针变量,指针变量指向的地址就是各个寄存器的地址。通过更改指针变量的值或者读取指针变量的值也就让C语言和底层寄存器建立了联系。下面举例说明,uint32_t* a = (uint32_t *)(0x00000001);首先声明指针变量a,该变量指向单片机0x00000001这个地址,通过地址可以看出,该单片机是32位的。接下来就可以通过指针变量直接修改0x00000001的值,*a = 0x00000008;这样地址0x00000001中的数据就变为了0x00000008。

两种方式比较而言,我觉得STM32这种采用指针的方式更加简洁,不用引入额外的关键字,通过C语言自身所带的指针特性就完成了底层的访问。

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

单片机对底层寄存器的操作 的相关文章

  • ROS学习笔记#4 ros节点介绍&常见的rosnode命令

    ros节点 xff1a 是运行计算的过程 xff0c 所有的节点都包含在一张图中 xff08 rqt graph可以查看 xff09 xff0c 通过话题流 xff0c RPC服务和参数服务器彼此进行通信 xff0c 1个机器人控制系统包含
  • MFC CArray类的基本使用

    CArray 类 支持类似于 C 数组的数组 xff0c 但可以根据需要动态减小和增大 语法 template lt class TYPE class ARG TYPE 61 const TYPE amp gt class CArray p
  • 树莓派4B上手教程 2.SSH安装及相关设置

    SSH简介 SSH是一种网络协议 xff0c 用于计算机之间的加密登录 如果一个用户从本地计算机 xff0c 使用SSH协议登录另一台远程计算机 xff0c 我们就可以认为 xff0c 这种登录是安全的 xff0c 即使被中途截获 xff0
  • Ubuntu4B上手教程 3.5如何关闭虚拟桌面

    暑假马上要完事了 树莓派也跟着我要换网络环境 现在的树莓派 虽说插上电就能用 但是也得是同一局域网下 到学校wifi就换了 不知道怎么在ssh和vnc都用不了的情况下让树莓派连接新的WiFi 于是今天想着把虚拟桌面先关掉它 学校起码有显示器
  • 树莓派4B上手教程 4.ROS2不换源安装

    安装ROS对于大多数人来说是一个比较不好的回忆 再难受也得一步一步来啊 不多说了 分享一下我安装ROS2的一些经验 安装环境 我的安装环境是树莓派4B 烧的Ubuntu22 04LTS桌面版镜像 对应的ROS版本是ros2 humble 安
  • 苹果输入法自动合并两个短横线/减号的解决方法

    最近在学MD的时候学到了表格 xff0c 怎么打都打不出来 仔细一看发现在连着打两个横线的时候 xff0c 他合到了一起了 解决方法 设置 通用 键盘 智能标点 Off 问题解决
  • (一篇绝杀)考研英语二阅读题型与技巧总结

    目录 题型一 xff1a 词汇 短语 句子题 xff08 indicate xff09 题型二 xff1a 推断题 xff08 inferred implicit indicate xff09 题型三 xff1a 判断题 xff08 EXC
  • Cache 和 Buffer 都是缓存,主要区别是什么?

    提到这个问题 xff0c 可能意味着你意识到了两者的相关性 的确 xff0c 他们确实有那么一些联系 首先cache是缓存 xff0c buffer是缓冲 xff0c 虽然翻译有那么一个字的不同 xff0c 但这不是重点 个人认为他们最直观
  • C++课后练习

    题目需求 xff1a 编写一个程序 xff0c 它要求用户首先输入其名 xff0c 再输入其姓 然后程序使用一个逗号和空格组合起来 xff0c 并存储和显示组合结果 请使用char数组和头文件cstring 中的函数 xff0c 下面是该程
  • 像睿智一样简单地使用 Shiro

    加我微信索要我正在使用的 Apacher Shiro参考手册中文版学习 pdf 我们一起学习吧 Apache Shiro 中文文档 Apache Shiro 教程 Docs4dev Apache Shiro 是一个功能强大且易于使用的 Ja
  • Zookeeper 安装

    单机版 1 下载 tar gz 2 解压到 usr local zookeeper 下 3 在任何地方 xff08 我是在zookeeper bin 同级下 xff09 创建一个data文件夹 xff0c 用于存放运行时缓存数据 4 在 c
  • 【推荐系统算法之多任务学习】

    推荐系统算法之多任务学习 引言多任务学习设计思路ESMM模型实验 MMOE模型 引言 本文主要是在组队学习 xff0c pytorch复习推荐模型课程中 xff0c 学习课程笔记进行的总结 多任务学习 多任务学习是指模型在同一时间可以学习多
  • Idea快捷键

    1 进入 返回方法快捷键 Ctrl 43 B 进入光标所在方法定义的地方或返回该方法被使用的地方 xff08 代替Ctrl 43 鼠标点击方法进入方式 xff0c 避免了手指在键盘和鼠标之间切换 xff0c 非常好用的快捷键 xff09 C
  • ASP.NET C# 获取当前日期 时间 年 月 日 时 分 秒

    转贴 xff09 在 ASP net c 中 我们可以通过使用DataTime这个类来获取当前的时间 通过调用类中的各种方法我们可以获取不同的时间 xff1a 如 xff1a 日期 xff08 2008 09 04 xff09 时间 xff
  • ASP.NET中的几种弹出框提示基本方法

    NET程序的开发过程中 xff0c 常常需要和用户进行信息交互 xff0c 对话框的出现将解决了这些问题 xff0c 下面是本人对常用对话框使用的小结 xff0c 希望对大家有所帮助 我们在 NET程序的开发过程中 xff0c 常常需要和用
  • 单链表的就地逆置(头插,就地,递归)

    http blog csdn net lycnjupt article details 47103433 https blog csdn net v xchen v article details 53067448 单链表的就地逆置是指辅助
  • Panads(四):数据清洗——对缺失值的处理

    文章目录 一 处理缺失值的四个函数二 使用1 1 数据样子1 2 处理 一 处理缺失值的四个函数 isnull函数 xff1a 检测是否是空值 xff0c 可用于df和series notnull函数 xff1a 检测是否是空值 xff0c
  • 单片机数字钟(调时,调时闪烁,万年历,年月日)超详细解析

    2019 07 13 单片机数字钟 xff08 调时 xff0c 调时闪烁 xff0c 万年历 xff0c 年月日 xff09 超详细解析 发表日期 xff1a 2019 07 13 单片机开发板 xff1a 巫妖王2 0 xff0c 使用
  • MATLAB轨迹规划 发给ROS中机器人实现仿真运动

    MATLAB轨迹规划 发给ROS中机器人实现仿真运动 现象如图所示 xff1a 0 matlab 与 ROS 通信 xff1a https blog csdn net qq 40569926 article details 11216287
  • 树莓派 Ubuntu mate 16.04使用VNC开启远程桌面

    1 安装 vncserver sudo apt span class token operator span get span class token operator span y install vnc4server 2 启动 vncs

随机推荐

  • js for in 循环出现bug

    这样使用for in循环时可能会有一种bug for let item in list 原因 xff1a for in循环会把某个类型的原型 prototype 中方法与属性给遍历出来 xff0c 所以这可能会导致代码中出现意外的错误 解决
  • 面试官:Spring中用了哪些设计模式?

    spring中常用的设计模式达到九种 xff0c 我们举例说明 以后再也不怕面试官问我 xff1a Spring中用了哪些设计模式了 1 简单工厂模式 又叫做静态工厂方法 xff08 StaticFactory Method xff09 模
  • 论文笔记 | Learning Deep Features for Discriminative Localization

    作者 Bolei Zhou Aditya Khosla Agata Lapedriza Aude Oliva Antonio Torralba Bolei Zhou Abstract 受到NIN 的启发 xff0c 将global aver
  • stm32 编码器配置

    stm32f103 void TIM4 Encoder Config void GPIO InitTypeDef GPIO InitStructure span class hljs comment span TIM TimeBaseIni
  • 树莓派部署(三):安装teamviewer远程软件

    安装teamviewer远程软件 下载Teamviewer安装因受网络原因影响 xff0c 国外源安装依赖失败则需要切换源一 修改文件二 安装依赖三 安装Teamviewer三 启动Teamviewer 不用命令行启动可忽略 下载Teamv
  • 【数字图像处理】MATLAB实现直方图均衡化

    直方图均衡化的MATLAB实现 目录 1 回顾 直方图均衡化2 代码实现 1 回顾 直方图均衡化 基本原理 直方图均衡化方法的基本思想是 xff1a 对在图像中像素个数多的灰度级进行展宽 xff0c 而对像素个数少的灰度级进行缩减 xff0
  • 【NCC】之一:从Pearson相关系数到模板匹配的NCC方法

    文章目录 lt center gt NCC Normalized Cross Correlation 1 Pearson相关系数 2 协方差 covariance 3 方差 variance 4 模板匹配中的NCC方法5 实现过程6 测试结
  • ST-Link使用和配置总结

    xff08 1 xff09 ST Link实物参考图 xff08 2 xff09 ST Link 引脚介绍和接线方式 ST Link SWD引脚连接方式 参考链接1 xff1a https blog csdn net xinghuanmei
  • CentOS安装CMake

    文章目录 1 问题背景2 前言3 步骤 1 问题背景 最近想玩玩CLion远程调试JDK源码 xff0c 需要用到CMake xff0c 因此来安装 2 前言 需要先看CLion支持哪个版本的CMake xff0c 再下载对应的版本 本文采
  • 跟丛博,学习CMMI2.0

    CMMI2 0 xff0c 三天的学习非常高强度 xff0c 学习了两门课 xff1a 2天的Foundations of Capability和1天的Building Development Excellence 内容多 xff0c 讲义
  • strtok的实现与原理

    该函数包含在 34 string h 34 头文件中 函数原型 xff1a char strtok char str constchar delimiters 函数功能 xff1a 切割字符串 xff0c 将str切分成一个个子串 函数参数
  • Java入门小知识(++a和a++的区别)

    关于java中 43 43 a和a 43 43 的区别 与C语言中的一致 43 43 a xff1a 先进行自增运算 xff0c 在进行表达式运算 a 43 43 xff1a 先进行表达式运算 xff0c 在进行自增运算 下面用一个实例来加
  • Linux VNC搭建方法

    首先介绍下VNC xff0c VNC是类似于向日葵的远程桌面控制工具 xff0c 非常好用 本文详细介绍了VNC的搭建方法与使用教程 yum安装指令 yum install y tigervnc server 复制服务文件放到配置文件夹下
  • (Linux)Ubuntu查看系统版本

    uname a 查看操作系统的发行版号和操作系统版本 Command uname a Result Linux SERVER 5 19 0 35 generic 36 Ubuntu SMP PREEMPT DYNAMIC Fri Feb 3
  • aes-128 速度测试

    官方白皮书 xff1a Intel Advanced Encryption Standard AES New Instructions Set pdf https software intel com zh cn articles inte
  • 【Feature Denosing】Feature Denoising for Improving Adversarial Robustness

    摘要 对图像分类系统的对抗攻击 xff0c 给卷积网络带去挑战的同时 xff0c 也提供了一个理解他们的机会 对抗扰动使得网络提取的特征包含噪声 受这个观察启发 xff0c 我们执行feature denoising 具体来说 xff0c
  • Tomcat8.5配置https启动报空指针错误

    Tomcat8 5配置https启动报空指针错误 报错信息tomcat SSL配置Tomcat8 5 8及以上而外配置 SSL别名获取 报错信息 报错代码 span class token number 02 span span class
  • python琐事系列1:关于如何真正的在vscode用gpu跑代码

    你们要的完整代码 xff1a span class token punctuation span span class token comment 使用 IntelliSense 了解相关属性 span span class token c
  • 影响力最大化 CELF 成本效益延迟转发算法

    文章目录 简介CELF Cost Effective Lazy Forward Algorithm算法原理算法实现代码实现实例测试 简介 对于影响力最大化问题 xff0c 我以前写过几个blog 影响力最大化 IC模型 43 贪心算法 影响
  • 单片机对底层寄存器的操作

    最近项目用到了国产的一款单片机 xff0c 没有例程的支持 xff0c 需要自己从头开始写底层 又感受到了自己本科刚学习51的时候的浮躁 xff0c 不懂得如何操作底层的寄存器 xff0c 只是一味的抄写别人的例程 xff0c 然后进行简单