控制/MCU
凡事都要脚踏实地去做,不弛于空想,不骛于虚声。努力只能做到合格,用心才能做到优秀。
这次一起来学习一下单片机开发时必备技术——位运算和寄存器编程。
目前已经发布了几篇文章,文章多为个人观点,可能会有错误。欢迎朋友们指正错误或提出宝贵建议,必有重谢!
一、位运算符号
常用的位运算符有:
符号 | 结合方向 | 功能 |
---|---|---|
& | 向右 | 按位与 |
向右 | ||
^ | 向右 | 按位异或 |
~ | 向左 | 按位取反 |
<< | 向右 | 数据左移 |
>> | 向右 | 数据右移 |
二、单片机开发为什么需要学习位运算?
单片机开发常用的编程方法有:寄存器法 和 库函数法。其中基于寄存器编程是一种通用型的方法,即所有的单片机都可以采用寄存器方法进行编程。
那么寄存器又是什么?
初学者可以这样理解:
1.寄存器是在单片机中真实存在的(有明确的地址)、有明确功能的“开关”或者“指示器”。
3.当需要控制单片机实现某种功能 或者 需要获取单片机的工作状态时,就必须要操作到对应的寄存器。
4.对于不同位数的单片机,其寄存器的位数也不同,并且一个寄存器可能通过不同的位来控制不同的功能。
总结:位运算在单片机开发中主要用途是操作寄存器,是单片机编程的基础!其重要性可见一斑。
三、位运算的重点内容
假设下表中的X是单片机中某个寄存器。
功能 | 表达式 |
---|---|
将寄存器第n位置位 | X |
一共就4行,非常好记。但知识点仅记住是没用的,得实践!现在我们基于一款单片机的手册来模拟实操一下。有条件的朋友建议购买一套单片机套件,边学边练,效果加倍!
四、实例演示位运算
下方是一款单片机的一个寄存器表,来源于主流单片机型号STM32F1xx的参考手册。图中这个寄存器的功能是配置IO引脚的方向,比如配置引脚是作为输入还是输出。
若需要将单片机的PB4引脚配置为通用推挽输出,那应该如何配置此寄存器呢?
Step1,结合引脚正确表示出该寄存器。由于操作的引脚是PB4,属于GPIOB,故该寄存器写作GPIOB->CRL。
Step2,阅读表格中关于位功能的说明,找出需要操作该寄存器的哪些位。
由于待操作引脚序号为4,所以应操作该寄存器的第19~16位(因为这些位对应的功能是CNF4和MODE4,匹配该引脚)。
Step3,结合注释部分,确定待操作位的值。从图中可以看出MODE4(即第17、16位)可以配置为“01”以实现输出模式;CNF4(即第19、18位)可以配置为“00”以实现通用推挽输出模式。
Step4,将位运算与上一步结合,写出代码。
GPIOB- >CRL &=~(1< < 19);
GPIOB- >CRL &=~(1< < 18);
GPIOB- >CRL &=~(1< < 17);
GPIOB- >CRL |= (1< < 16);
化简上方四行位运算,整理得:
GPIOB- >CRL &=~(0xF< < 16);//清零[19:16]
GPIOB- >CRL |= (0x1< < 16);
ps: 以上代码仅是实现PB4引脚输出数据的部分代码。
若需要实现完整功能,还需要配置其他寄存器。
全部0条评论
快来发表一下你的评论吧 !