STM32入门:位操作

一个小题外话...


上一课中,我们研究了如果您决定学习STM32微控制器,从何处开始:如何设置IDE,如何创建简单项目,如何编译程序以及如何运行程序。 欣赏发现板上闪烁的LED之后)


开始写新文章时,我计划立即对程序列表进行详细分析,这会使我们的LED交替闪烁,但是当我开始写作时,我突然意识到自己有很多问题没有答案,因此有必要继续考虑该程序过早地。 对于我自己,我已经确定了此类问题的完整清单


  1. 什么是按位运算 ? 如何使用它们?
  2. 什么是寄存器 ,它们与位操作有何关系?
  3. STM32F0xx系列微控制器什么组成,如何进行时钟控制以及MK内部寿命?
  4. MK的初始化是如何进行的,为什么我需要一个启动文件SystemInit函数的作用什么? 手指上的解释。
  5. CMSIS库由什么组成 ? 如何导航? 从中可以学到什么以及如何使用它?

出于对这些问题的考虑,我想继续讲述STM32的编程故事。


文章清单:
  1. 学习STM32或智能管理光的入门
  2. STM32入门:位操作
  3. STM32入门:什么是寄存器? 如何与他们合作?


基本逻辑运算


刚开始学习微控制器时,“寄存器”和“位操作”这两个词在我看来似乎是神秘的,而且很长一段时间以来,我都不想继续讲这个话题。 但是,当我或多或少地了解了它的含义后,我意识到我白费力气地在遥远的盒子里推迟了对如此重要主题的研究。 位操作可能是微控制器中最常见的操作,并且知道如何以及为什么可以在我们的工作中使用它们,这将为我们控制MK中的所有事物提供巨大的潜力!


我们所有人在学校的计算机科学课上都了解数字技术是什么,为什么这样称呼它,存在什么基本逻辑运算,所有现代数字技术都基于二进制数学和逻辑电路。

微控制器始终仅以两种状态运行:“零”-无电压,“一个”-电压。 让我们稍微刷新一下基本逻辑运算的知识。 它们构成了所有数字技术的基础。


  • 连词 -被指定为“逻辑与”“逻辑乘法” 。 实际上,对表达式A和B执行两个逻辑运算的结果类似于它们的乘法。 也就是说,仅当A和B都具有值“ 1”时,表达式才会采用值“ 1”。 在所有其他情况下,该值将为“ 0”。 可以用AND,&&,AND和&表示
  • 析取 -指定为“逻辑或”“逻辑加法” 。 对表达式A和B执行此逻辑两个运算的结果类似于它们的加法运算。 即,如果表达式A和B中的至少一个具有值“ 1”,则该表达式将取值为“ 1”。 可以指定为OR,||,OR,|。
  • 反转 -指定为“逻辑非”“拒绝” 。 对表达式A执行两个逻辑运算的结果是相反的。 也就是说,如果表达式A为0,则表达式将取值为1,反之亦然。 可能被指定为NOT,!,NOT,〜。

  • 严格析取 -指定为“异或”“逻辑加法异或” 。 如果A和B具有不同的值,则对表达式A和B执行两个逻辑运算的结果将取值为1。 可以指定为Excl。 或,异或,^。

位操作


位运算与逻辑运算几乎相同,唯一的区别是它们适用于位和二进制数。


顺便说一句,为了简化研究位运算的过程,我使用了ManHunter32位ASM Calculator程序 。 使用此程序,您可以检查位运算的结果,将数字从一个数字系统传输到另一个数字系统。 该程序具有直观的界面,见面后该程序已成为我使用微控制器的主要工具之一。 下图给出了程序界面的小解释:


位操作“ NOT”-“〜”

如果该位为“ 1”,则在执行操作“ NOT”后将等于“ 0”,反之亦然。 立即对二进制数的所有位执行该操作。 例如,反转FF号:



位运算“ AND”-“&”

如果该位的两个位均等于“ 1”,则在执行“与”运算后,该位的结果将等于“ 1”,但是如果至少一个位为“ 0”,则结果将等于“ 0”。 该操作也按位执行。 例如,将两个数字0xFF0和0xF0F“相乘”:


结果,我们将看到在两个数字中都有单位的类别中,结果在所有其他情况下均为零。

考虑实际应用的选项:

  • 在需要将特定位或一组位重置为零的情况下,可以使用掩码。 我认为通过示例来说明这一点将更加清晰。 假设我们使用一个数字和0xF8F,我们需要第7位变为零而不是1。 没问题,戴上面具,然后取消选中所需的位。 将数字相乘并得到结果:

  • 如果我们需要检查数字中的特定位是否为0或1-我们还使用掩码进行乘法。 在掩码中,我们设置要检查的位。 如果所需位为“ 0”,则计算结果将为“ 0”,如果为“ 1”,则计算结果将分别为“ 1”。 如果我们想知道第7位是否等于1,则制作相应的掩码,然后将数字乘以掩码。 一切都很简单:

    如果我们需要检查一个数字的奇偶性 (意味着一个数字可以被二整除的能力),则我们以相同的方式检查第一个比特,如果它是“ 1”,那么这个数字是奇数,如果有“ 0”,那么这个数字是偶数。 自己尝试,以训练和建立技能,请进行此测试。

按位运算“或”-“ |”

如果一对位中的一个或两个都为“ 1”,则结果将为“ 1”,否则,如果两个位均等于“ 0”,则结果将为“ 0”。 即,大致而言,执行数字中所有单位的加法。 例如,如果我们将两个数字0xF8F和0x7F相加,则得到以下结果:



考虑一个实际应用:
  • 如果需要将数字中的特定位设置为1 ,则还可以使用掩码执行加法。 例如,要设置数字0xFF0中的第15位,您需要执行逻辑加法运算,我们将获得所需的结果:


尝试自己玩不同的数字并观察结果。

异或运算按“ ^”

如果该位中的位不同且不相等,则结果将为“ 1”,否则为“ 0”。 例如,如果我们使XOR编号为0xF8F和0x7F,那么我们将看到,在具有出色位的位中,结果为“ 1”,在位相同的地方,结果为“ 0”或“ 1”-结果为“ 0” ”,最后我们得到以下结果:


考虑实际应用的选项:

  • 如果我们需要反转数字中的任何位 ,我们可以使用掩码通过XOR操作轻松地做到这一点。 让我们使用掩码0xC0反转数字0xF8中的第6位和第7位。 您可以在图像中看到结果:

  • 在某些情况下,有必要比较两个寄存器并确定它们是否相等 。 在这种情况下,我们需要将值注册到XOR操作。 如果结果为“ 0”,则寄存器相等,否则它们不相等:



移位操作
有许多有趣的,有时是非常有用的位操作,称为移位操作 。 您可以将排放物向右和向左移动。 在此操作期间,二进制数的所有位均移位指定的位置数,在这种情况下,如果向左移位,则最高有效位(最左边)将丢失,并且将“ 0”写入最低有效位(最右边)。 在向右逻辑移位的情况下,会发生相反的情况-低位(最右边)丢失,而“ 0”写入高位。 另外,我想指出的是,在32位字的情况下,所有32位都作为一个整体移位。 更详细地考虑换档操作。


左移-“ <<”

您可以在下图中看到移位的发生方式。 我认为一切都很明显:


通过二进制移位,您可以注意到一个有趣的功能。 移位一位数字将我们的数字乘以2。如果我们将x移位n位,则得到x *(2 * n)。 尝试通过我们的实用程序独立跟踪此模式以进行计数。 =)

向右移动-“ >>”

图像中很清楚地体现了向右移动的结果:


向右二进制移位时,您会注意到情况与向左移位相反-数字以1位数的移位除以2 s,然后除以2 * n,其中n是进行移位的位数。 还可以尝试自己玩数字,这些数字显然被完全分为2。 还有回填的问题-如果以这种方式除以奇数,结果将是什么?

重要说明 。 如果您对带有负号(带符号)的变量进行平移,则空缺的职位将被填充一个。

总而言之...


对于许多初学者来说,这个主题似乎很无聊,似乎还不清楚在哪里以及如何应用这些知识。 在您需要抬起MK的另一只脚或将参数写入外围设备或模块中的线程的情况下,我会尽快向您保证,在那里,将需要全面了解位操作。 由于文章篇幅如此之大,我们将把寄存器的考虑转移到下一课。 好吧,将来您可以将本文用作备忘单。


作为家庭作业,请尝试在while(1){...}块中自行解析我们的程序代码,并了解我们如何通过按位操作来打开和关闭LED 。 好吧,在下一课中,我将告诉您它是如何发生的!



文章清单:
  1. 学习STM32或智能管理光的入门
  2. STM32入门:位操作
  3. STM32入门:什么是寄存器? 如何与他们合作?

Source: https://habr.com/ru/post/zh-CN406889/


All Articles