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