美文网首页硬件&嵌入式C,C++,程序员
C语言硬件操作之位操作相关总结

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

作者: 海牛embed | 来源:发表于2015-09-18 09:05 被阅读280次

    【引言】:

            嵌入式开发工程师有别于其他软件开发工程师,最大的区别就是对硬件操作的敏感性,众所周知,硬件的最小描述单位是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,那么该如何操作那?

    相关文章

      网友评论

        本文标题:C语言硬件操作之位操作相关总结

        本文链接:https://www.haomeiwen.com/subject/eypbcttx.html