打印
[技术问答]

关于新唐M051最新的bspv3.00.02的只言片语: 小议论mask

[复制链接]
1043|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Harvard|  楼主 | 2015-6-25 22:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
新唐的库中有 很多的msk,也就是掩码,有时候为了设置多bit的寄存器如32bit寄存器中的 某些位,比如不连续的bit1和bit10,这时候也可以用方便多位操作的掩码,这样,可以把这两个bit的4种取值情况通过掩码而传入,但不影响寄存器中其他bit的值,
一般我们c书上只讲了单个bit,
  其实这个掩码 ,可以用比较明显的位置信息来表是:
如上面的可以表述成这样 0x00000402 这是新唐的做法,
  其实也可以这样写: ((1<<10)|(1<<1))
这样比较一目了然.
所谓mask,其实质就是把要操作的bit置为1其余为0的一个数,这样我们操作的时候,如果要对对应的bit置0,就可以:
Reg &=~(mask);
要置1,
就是reg |=mask;
如果mask有几个 bit ,且不连续的话,要赋值一个特殊的值,有0 有1, 就必须先清零各位,然后利用mask代入
  如: Reg= Reg& (~mask);
然后再利用或,代入新的值;
Reg |= Newval;
这个值仅在mask对应的bit上有0和1的取值变化,
  其余都为0;
  例如: 新唐的P14口的MFP配置:
#define SYS_MFP_P14_GPIO    0x00000000UL /*!< P1_MFP pin 4 setting for GPIO   */
#define SYS_MFP_P14_AIN4    0x00000010UL /*!< P1_MFP pin 4 setting for AIN4   */
#define SYS_MFP_P14_SPISS0  0x00001000UL /*!< P1_MFP pin 4 setting for SPISS0 */
#define SYS_MFP_P14_CPN0    0x00001010UL /*!< P1_MFP pin 4 setting for CPN0   */
#define SYS_MFP_P14_ACMP0_N 0x00001010UL /*!< P1_MFP pin 4 setting for ACMP0_N */
#define SYS_MFP_P14_Msk     0x00001010UL /*!< P1_MFP pin 4 mask               */

我要配置P14口为AIN4;可以这样操作

     SYS->P1_MFP &= ~SYS_MFP_P14_Msk;
     SYS->P1_MFP |= SYS_MFP_P14_AIN4;

非常秒的mask,还记得avr时代的端口port操作吗?
PORTA !=(1<<PA0)|(1<<PA3); //细看PA0原来就是0; PA3原来就是3
标准c的位操作, mask恰到好处, 美妙的新唐bsp
犹记v2xx版本的犀利,如今,更加高效的v3xx来临,虽有所不适应,但依旧去努力适应吧!
沙发
菜鸟+新手| | 2015-6-26 08:50 | 只看该作者
新唐的BSP包总是在变,啥时候是个头啊

使用特权

评论回复
板凳
Harvard|  楼主 | 2015-6-26 13:01 | 只看该作者
哈哈 到了 v3xxx时代 应该是趋于完善了

使用特权

评论回复
地板
mintspring| | 2015-6-27 10:57 | 只看该作者
那种写0<<5,等的,感觉很傻很天真,楼主这个将的不错。。

使用特权

评论回复
5
Harvard|  楼主 | 2015-8-25 23:40 | 只看该作者
谢谢楼上.

使用特权

评论回复
6
springvirus| | 2015-8-26 11:15 | 只看该作者
当时看avr的1<<x,很是研究了一番,呵呵

使用特权

评论回复
7
Harvard|  楼主 | 2015-8-27 21:08 | 只看该作者
哈哈. 到了arm时代 跟多的是把1<<x 的多个这样的操作结合在一起 形成mask 委实方便.

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

74

主题

1729

帖子

21

粉丝