C语言硬件操作之位操作相关总结

【引言】:

        嵌入式开发工程师有别于其他软件开发工程师,最大的区别就是对硬件操作的敏感性,众所周知,硬件的最小描述单位是bit,而软件领域中,我们能表示的最小单位是Byte,原因在本人的课程视频中已经分析过了,如果有其他认识,也欢迎和我交流探讨。

         那么如何通过C语言更好的操作硬件那,我们就会想到对某些bit设置为高电平或者低电平(看看吧,硬件就是这样的呆萌^_^)。那么我们就来给大家简单的总结下在今后开发过程中,常用的位操作方式吧。

        本文,也是本人在教学中,看到很多同学和开发中遇到的问题,进行的总结,如有不妥,欢迎大家共同交流共同进步。

【正文】:

        一、某一个位的操作:

          这个要简单的多,基本的思想就是对对应位进行与和或的操作。比如,我们想对某一组寄存器的第12bit设置为高电平,那么我们就自然想到了:

          unsigned int *addr = (unsigned int *)0xE0100100;

         // 这里我们假设我们操作的寄存器组的基地址是0xE0100100.

         addr[0] |= (0x1<<12);    // 注意硬件的bit计数也是从0开始的哦。

         那么,如果想对某一组寄存器的第12bit变成低电平那,那么我们就会想到:

         addr[0] &= ~(0x1<<12);

         所以,对某一位的操作,是比较简单的,如果还没有理解的,可以看看本人讲的C语言高级课程的视频啊。

         二、对某一块特定区域设置为一个特定的数:

          这种操作,在目前嵌入式开发中,使用的越来越多,因为目前的soc功能越来越多,数字电路的功能选项也非常庞大,再用一个bit代表一种开关状态已经不能满足现在的开发需求了。所以都是某几个bit组合来代表几个功能的选择。比如我想对12bit---15bit这4个bit位设置为1010的话,如果我们还是沿用上一种的方式进行操作,那么想一想会不会出问题那?

          答案很明显,如果我们只是单纯的用“|”操作进行设置1的操作,那么如果之前这4个bit都是1,那么在设置完成后,4个bit还是1,达不到我们的要求,同样的道理,清零也是会出现这个问题。

          那么应该怎么处理那,思路很简单,就是先对这些控制区域清零,然后再置位的方式。代码实现如下:

          unsigned int *addr = (unsigned int *)0x20008000;

          addr[0] &= ~(0xf<<12);

          addr[0] |= (0x6<<12);

【总结】:

         如果我想对4-7bit设置1011,并且对10-13bit设置1100,那么该如何操作那?

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 8,396评论 6 13
  • 其实这篇文章主要是介绍自己为其写的GPIO库,自己借鉴了原子写的STM32,野火写的K60,还有LPC官方库,然后...
    杨奉武阅读 466评论 0 0
  • 什么是嵌入式 IEEE(Institute of Electrical and Electronics Engin...
    Leon_Geo阅读 2,922评论 1 20
  • ​​​本文主要介绍嵌入式系统的一些基础知识,希望对各位有帮助。 嵌入式系统基础 1、嵌入式系统的定义 (1)定义:...
    OpenJetson阅读 2,513评论 0 12
  • 你的衬衫有我喜欢的皂角味 你喜欢傻笑 你身上有阳光的味道. 你喜欢傻笑 你的手搭在我的肩上是那么的暖 你喜欢傻笑 ...
    高大壮儿阅读 48评论 0 1
  • 相遇也许是上天注定,相遇后的交集却是不满如意。那年我们按耐内心的懵懂,分离也不会显得那么悲伤。那年机缘巧合又遇见了...
    小满会茴字的四种写法阅读 157评论 1 4
  • 如题 我不愿意成为简书里的我 懦弱胆小又没有主见 一分一秒都不行 我也不愿意一直在一个圈里走不出去 反正每个人终究...
    没勇气的风阅读 164评论 0 1