使用 C语言对寄存器赋值时,我们常常要求只修改该寄存器的某几位的值,且其它的寄存器位不变,这个时候我们就需要用到 C 语言的位操作方法了。

1. 把变量的某位清零

此处我们以变量 a代表寄存器,并假设寄存器中本来已有数值,此时我们需要把变量a 的某一位清零,且其它位不变。

//定义一个变量 a = 1001 1111 b (二进制数)
unsigned char a = 0x9f;//对 bit2 清零a &= ~(1<<2);//括号中的 1 左移两位,(1<<2)得二进制数:0000 0100 b
//按位取反,~(1<<2)得 1111 1011 b
//假如 a 中原来的值为二进制数: a = 1001 1111 b
//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 1011 b),
//经过运算后,a 的值 a=1001 1011 b
// a 的 bit2 位被被零,而其它位不变。

2. 把变量的某几个连续位清零

由于寄存器中有时会有连续几个寄存器位用于控制某个功能,现假设我们需要把寄存器的某几个连续位清零,且其它位不变。

//若把 a 中的二进制位分成 2 个一组
//即 bit0、bit1 为第 0 组,bit2、bit3 为第 1 组,
// bit4、bit5 为第 2 组,bit6、bit7 为第 3 组
//要对第 1 组的 bit2、bit3 清零a &= ~(3<<2*1);//括号中的 3 左移两位,(3<<2*1)得二进制数:0000 1100 b
//按位取反,~(3<<2*1)得 1111 0011 b
//假如 a 中原来的值为二进制数: a = 1001 1111 b
//所得的数与 a 作”位与&”运算,a = (1001 1111 b)&(1111 0011 b),
//经过运算后,a 的值 a=1001 0011 b
// a 的第 1 组的 bit2、bit3 被清零,而其它位不变。//上述(~(3<<2*1))中的(1)即为组编号;如清零第 3 组 bit6、bit7 此处应为 3
//括号中的(2)为每组的位数,每组有 2 个二进制位;若分成 4 个一组,此处即为 4
//括号中的(3)是组内所有位都为 1 时的值;若分成 4 个一组,此处即为二进制数“1111 b”//例如对第 2 组 bit4、bit5 清零
a &= ~(3<<2*2);

3. 对变量的某几位进行赋值。

寄存器位经过上面的清零操作后,接下来就可以方便地对某几位写入所需要的数值了,且其它位不变,这时候写入的数值一般就是需要设置寄存器的位参数。

//a = 1000 0011 b
//此时对清零后的第 2 组 bit4、bit5 设置成二进制数“01 b ”a |= (1<<2*2);
//a = 1001 0011 b,成功设置了第 2 组的值,其它组不变

4. 对变量的某位取反

某些情况下,我们需要对寄存器的某个位进行取反操作,即 1 变 0 ,0变 1,这可以直
接用如下操作,其它位不变,见代码清单 5-4。

//a = 1001 0011 b
//把 bit6 取反,其它位不变a ^=(1<<6);
//a = 1101 0011 b

STM32单片机修改寄存器的位操作方法(全网最全)相关推荐

  1. 基于STM32单片机光学指纹识别模块(FPM10A)全教程(基于C语言)

    本文转载,其来源在参考中:1,稍加修改,因为近期使用到这个模块,故而加以整理! 1.平台 首先我使用的是 奋斗 STM32 开发板 MINI板 基于STM32单片机光学指纹识别模块(FPM10A)全教 ...

  2. STM32单片机修改串口波特率

    文章目录 前言 一.串口配置 1.串口初始化 2.修改波特率 总结 前言 对于STM32F1系列的开发板,串口波特率设置之后,就开始进行通信了,一般情况下是不需要修改的,但是在实际的项目开发中,我们可 ...

  3. stm32单片机实现多个闹钟_如何学习单片机:单片机都是相通的,一通百通

    单片机是一种可编程的器件,现在所见到的电子产品中几乎都是以单片机为核心的,根据不同的功能需求,搭建不同的电路,从8位的单片机到32位的单片机,甚至比较高大上的ARM和DSP都可以看成是高级一点的单片机 ...

  4. STC单片机和STM32单片机哪个更适合入门?

    1.引言 在当今这个模拟电子技术看似被冷落(其实无处不在)和数字电子技术主导的信息时代,对于刚入电子信息相关专业的大中专学生或需要转型进入电子产品硬件研发行业的工程师而言,首先面对的第一个问题是:8位 ...

  5. STM32单片机怎么学最快?用这个方法只需要一周!

    最近看到很多小伙伴学STM32学的一脸茫然,有些甚至学1年都不会,有些虽然学会了外设使用,一做起项目来无从下手. 那今天通过自己的经历来告诉大家STM32怎么学最快,领悟到了1周学会绝对没问题! 一. ...

  6. 单片机搭建环境烧录方法_万物互联-stm32单片机简介、烧录、编程及其项目环境搭建...

    万物互联-stm32单片机简介.烧录.编程 前言:stm32单片机这里给出简单介绍,给不了解的朋友普及下硬件端的基本知识,叙述的较为简单,想深入研究的朋友可以去一些官方网站.论坛.博客汲取知识.最下端 ...

  7. STM32单片机(三).STM32单片机的开发方法

    经过前两章节对STM32的简单介绍,在接下来的几个章节中开始进行STM32单片机的软件开发实践,所使用到的工具有Keil5.STM32CubeMX以及串口软件.对于STM32F1系列的单片机,其存储器 ...

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

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

  9. GDB 修改当前判断函数的返回值(即修改寄存器的值)的方法

    工作中遇到的问题: 在GDB调试时要进入下边该判断后边的函数,而m_EtherDecode.Chk_MakeSure_IP_Pkt(pPacket,dwPacketLen)的返回值是false,所以需 ...

最新文章

  1. vue脚手架解决跨域问题-------配置反向代理
  2. Spring MVC中注解 @ModelAttribute
  3. CentOS 查看系统 CPU 个数、核心数、线程数
  4. wxWidgets:在所有平台上分发应用程序
  5. 如何将.crt的ssl证书文件转换成.pem格式
  6. 10分钟带你逆袭kafka之路
  7. 华为鸿蒙系统正式拜拜,从“哄蒙”到“鸿蒙”,现在,正式对华为鸿蒙OS说你好!...
  8. 策略模式和职责链模式在CMS中的应用
  9. Oracle意外赢官司,程序员或过苦日子
  10. 日常记录,记下来自己的遇到的问题
  11. 【论文笔记】Depth Map Prediction from a Single Image using a Multi-Scale Deep Network
  12. 笔记(五)Home Assistant Lovelace UI基本用法
  13. iphone或者ipad上安装自己打包的ipa文件
  14. 管理科学与运筹学(MS/OR)国际期刊最新权威排名
  15. STM32通过串口控制LED闪烁或者呼吸效果
  16. 增加对ARM64和X86的硬件预取控制驱动的支持
  17. 异常你看这一篇就行了,全程白话很好理解(完结撒花)
  18. 计算机二级考MS office还是WPS office?
  19. Abaqus接触分析--SurfaceBaseContact 法向切向接触行为
  20. AlexNet分类Fashi-MNIST(Pytorch实现)

热门文章

  1. 年轻代,老年代,永久代
  2. Python如何正确保留大括号?
  3. Instance Segmentation入门总结
  4. ecshop 360支付宝插件漏洞+ flow.php注入漏洞,ecshop支付宝注入漏洞分析
  5. 《少有人走的路》 评论
  6. 肠内、外营养的优缺点有哪些?
  7. Beanstalk(内存队列)
  8. 把年月日转换为今天,明天,后天,大后天
  9. Linux学习大全(看一篇就够了)持续更新...
  10. 最基础的前台上传图片