范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

嵌入式C语言位操作的一些常见用法归纳

  分享关于位操作、寄存器配置的一些笔记:
  一、位操作简单介绍
  首先,以下是按位运算符:
  在嵌入式编程中,常常需要对一些寄存器进行配置,有的情况下需要改变一个字节中的某一位或者几位,但是又不想改变其它位原有的值,这时就可以使用按位运算符进行操作。下面进行举例说明,假如有一个8位的TEST寄存器:
  当我们要设置第0位bit0的值为1时,可能会这样进行设置:TEST = 0x01;
  但是,这样设置是不够准确的,因为这时候已经同时操作到了高7位:bit1~bit7,如果这高7位没有用到的话,这么设置没有什么影响;但是,如果这7位正在被使用,结果就不是我们想要的了。
  在这种情况下,我们就可以借用按位操作运算符进行配置。
  对于二进制位操作来说,不管该位原来的值是0还是1,它跟0进行&运算,得到的结果都是0,而跟1进行&运算,将保持原来的值不变;不管该位原来的值是0还是1,它跟1进行|运算,得到的结果都是1,而跟0进行|运算,将保持原来的值不变。
  所以,此时可以设置为:TEST = TEST | 0x01;
  其意义为:TEST寄存器的高7位均不变,最低位变成1了。在实际编程中,常改写为:TEST |= 0x01;
  这种写法可以一定程度上简化代码,是 C 语言常用的一种编程风格。设置寄存器的某一位还有另一种操作方法,以上的等价方法如:TEST |= (0x01 << 0);
  第几位要置1就左移几位。
  同样的,要给TEST的低4位清0,高4位保持不变,可以进行如下配置:TEST &= 0xF0;
  二、嵌入式中位操作一些常见用法
  1、一个32bit数据的位、字节读取操作
  (1)获取单字节:#define GET_LOW_BYTE0(x) ((x >> 0) & 0x000000ff) /* 获取第0个字节 */ #define GET_LOW_BYTE1(x) ((x >> 8) & 0x000000ff) /* 获取第1个字节 */ #define GET_LOW_BYTE2(x) ((x >> 16) & 0x000000ff) /* 获取第2个字节 */ #define GET_LOW_BYTE3(x) ((x >> 24) & 0x000000ff) /* 获取第3个字节 */
  示例:
  (2)获取某一位:#define GET_BIT(x, bit) ((x & (1 << bit)) >> bit) /* 获取第bit位 */
  示例:
  2、一个32bit数据的位、字节清零操作
  (1)清零某个字节:#define CLEAR_LOW_BYTE0(x) (x &= 0xffffff00) /* 清零第0个字节 */ #define CLEAR_LOW_BYTE1(x) (x &= 0xffff00ff) /* 清零第1个字节 */ #define CLEAR_LOW_BYTE2(x) (x &= 0xff00ffff) /* 清零第2个字节 */ #define CLEAR_LOW_BYTE3(x) (x &= 0x00ffffff) /* 清零第3个字节 */
  示例:
  (2)清零某一位:#define CLEAR_BIT(x, bit) (x &= ~(1 << bit)) /* 清零第bit位 */
  示例:
  3、一个32bit数据的位、字节置1操作
  (1)置某个字节为1:#define SET_LOW_BYTE0(x) (x |= 0x000000ff) /* 第0个字节置1 */  #define SET_LOW_BYTE1(x) (x |= 0x0000ff00) /* 第1个字节置1 */  #define SET_LOW_BYTE2(x) (x |= 0x00ff0000) /* 第2个字节置1 */  #define SET_LOW_BYTE3(x) (x |= 0xff000000) /* 第3个字节置1 */
  示例:
  (2)置位某一位:#define SET_BIT(x, bit) (x |= (1 << bit)) /* 置位第bit位 */
  4、判断某一位或某几位连续位的值
  (1)判断某一位的值
  举例说明:判断0x68第3位的值。
  也就是说,要判断第几位的值,if里就左移几位(当然别过头了)。在嵌入式编程中,可通过这样的方式来判断寄存器的状态位是否被置位。
  (2)判断某几位连续位的值/* 获取第[n:m]位的值 */ #define BIT_M_TO_N(x, m, n) ((unsigned int)(x << (31-(n))) >> ((31 - (n)) + (m)))
  示例:
  这是一个查询连续状态位的例子,因为有些情况不止有0、1两种状态,可能会有多种状态,这种情况下就可以用这种方法来取出状态位,再去执行相应操作。
  以上是对32bit数据的一些操作进行总结,其它位数的数据类似,可根据需要进行修改。
  三、STM32寄存器配置
  STM32有几套固件库,这些固件库函数以函数的形式进行1层或者多层封装(软件开发中很重要的思想之一:分层思想),但是到了最里面的一层就是对寄存器的配置。我们平时都比较喜欢固件库来开发,大概是因为固件库用起来比较简单,用固件库写出来的代码比较容易阅读。最近一段时间一直在配置寄存器,越发地发现使用寄存器来进行一些外设的配置也是很容易懂的。使用寄存器的方式编程无非就是往寄存器的某些位置1、清零以及对寄存器一些状态位进行判断、读取寄存器的内容等。
  这些基本操作在上面的例子中已经有介绍,我们依旧以实例来巩固上面的知识点(以STM32F1xx为例):
  (1)寄存器配置
  看一下GPIO功能的端口输出数据寄存器 (GPIOx_ODR) (x=A..E) :
  假设我们要让PA10引脚输出高、输出低,可以这么做:
  方法一:GPIOA->ODR |= 1 << 10; /* PA10输出高(置1操作) */ GPIOA->ODR &= ~(1 << 10); /* PA10输出低(清0操作) */
  也可用我们上面的置位、清零的宏定义:SET_BIT(GPIOA->ODR, 10); /* PA10输出高(置1操作) */ CLEAR_BIT(GPIOA->ODR, 10); /* PA10输出低(清0操作) */
  方法二:GPIOA->ODR |= (uint16_t)0x0400; /* PA10输出高(置1操作) */ GPIOA->ODR &= ~(uint16_t)0x0400; /* PA10输出低(清0操作) */
  貌似第二种方法更麻烦?还得去细心地去构造一个数据。
  但是,其实第二种方法其实是ST推荐我们用的方法,为什么这么说呢?因为ST官方已经把这些我们要用到的值给我们配好了,在stm32f10x.h中:
  这个头文件中存放的就是外设寄存器的一些位配置。
  所以我们的方法二等价于:GPIOA->ODR |= GPIO_ODR_ODR10; /* PA10输出高(置1操作) */ GPIOA->ODR &= ~GPIO_ODR_ODR10; /* PA10输出低(清0操作) */
  两种方法都是很好的方法,但方法一似乎更好理解。
  配置连续几位的方法也是一样的,就不介绍了。简单介绍配置不连续位的方法,以TIM1的CR1寄存器为例:
  设置CEN位为1、设置CMS[1:0]位为01、设置CKD[1:0]位为10:TIM1->CR1 |= (0x1 << 1)| (0x1 << 5) |(0x2 << 8);
  这是组合的写法。当然,像上面一样拆开来写也是可以的。
  (2)判断标志位
  以状态寄存器(USART_SR) 为例:
  判断RXNE是否被置位:/* 数据寄存器非空,RXNE标志置位 */ if (USART1->SR & (1 << 5)) {  /* 其它代码 */    USART1->SR &= ~(1 << 5); /* 清零RXNE标志 */ }
  或者:/* 数据寄存器非空,RXNE标志置位 */ if (USART1->SR & USART_SR_RXNE) {  /* 其它代码 */    USART1->SR &= ~USART_SR_RXNE; /* 清零RXNE标志 */ }
  四、总结
  以上就是本次关于位操作的一点总结笔记,有必要掌握。虽然说在用STM32的时候有库函数可以用,但是最接近芯片内部原理的还是寄存器。有可能之后有用到其它芯片没有像ST这样把寄存器相关配置封装得那么好,那就不得不直接操控寄存器了。
  此外,使用库函数的方式代码占用空间大,用寄存器的话,代码占用空间小。之前有个需求,我能用的Flash的空间大小只有4KB,遇到类似这样的情况就不能那么随性的用库函数了。
  最后,应用的时候当然是怎么简单就怎么用。学从"难"处学,用从易处用,与君共勉~
  END:以上笔记中如有错误,欢迎指出!谢谢

oppo真的走下坡路了吗?oppo闷声发大财,oppo理念当老二,千年老二,产品跟着老大走。oppo手机做工精良,售后服务好,零售网点多。oppo认真做产品,何来下坡路。哪怕是华为当年入日中天,oppo市场我一个朋友是低保户,他还想买5000多的手机,你觉得合适吗?在这里我想说的是,并不是说低保户不配拥有5000多元的手机,凡事都要量力而行。既然是低保户买一两千元的就行了,没必要买那么多钱的手机,何况自己还没有结婚,自己是干什么工作的?非要买买了4G版的P50,能不能自己更换5G射频芯片,变成5G手机?大兄弟你要真有这本事你也不会干这事儿了感谢您的阅读。买了4G版的P50,能不能自己更换5G射频芯片,变成5G手机?不得不说,您的想法确实不错,自己换个5G射频芯片,4G手机就变成了据说手机屏幕即将生产不了了,这是真的吗?怎么可能!国内现在普通的LCD屏,以及一些中低档的OLED屏幕国产生产完全没有任何问题,产能充足!一些高端的OLED屏,以及一些高品质的LCD屏,主要是接JdiLG三星等厂家的生产弱势手机厂商不断阵亡,中国手机品牌将形成122格局国内手机市场竞争尤为激烈,大家不仅要比拼配置,还要比拼价格,导致一些年出货量本就很少的手机厂商,从供应链拿货的价格不断提升,但是销量逐年下滑,产品价格却逐年上涨,留给研发上的预算越switch强敌,壹号游戏掌机5G时代,11代酷睿TigerLakei71195G7switch迎来强敌,国内壹号游戏掌机进入5G时代,搭载11代酷睿TigerLakei71195G7switch是最强的掌机?强不强咱们且先不说,自打上市以来各种游戏荒游戏各种贵,资讯OPPO柯南联名新款产品官宣,两款摩托罗拉新机8月5日发布7月26日消息,OPPO官宣将推出OPPO柯南联名新品,并将在本周3晚上1800正式揭晓。官方给出的暗示是红色羁绊,应该与毛利兰和柯南的感情线有关系,正牌男友新一已经哭晕在厕所。欧为造梦,换芯颜11代酷睿强势加持深度创作本戴尔XPS179710游戏玩家之外,以设计师为代表的创作者组成了笔记本一大细分市场,创作者们不仅要求笔记本有足够的生产力性能,以满足其高效内容输出,让创作的每个阶段都有底气,更希望笔记本能够成为工作生活旗舰机是高性价比吗?答案肯定的!推荐给大家这三款肯定高性价比我们每次买手机,追求的都是高性价比,就是买旗舰机也追求的是高性价比,那么,旗舰机是高性价比手机吗?答案是的,旗舰机毕竟一是价格高,二代表的是每家的实力,手机厂家肯定会不遗余力地去做洛天依九周年,英伟达公布唯一RTX3080Ti定制显卡制造视频IT之家7月26日消息在本月初举办的BilibiliWorld2021展会上,多款英伟达定制显卡亮相,,包含成都猎人主题定制版仙剑奇侠传七定制版以及洛天依九周年纪念定制版RTX30iPhone12在安兔兔跑分中不敌高通骁龙865在安兔兔最新发布的2021年6月设备性能榜中,iPhone12Pro喜提586178分!不敌高通骁龙865处理器,以小米10为例,小米10安兔兔跑分为645701分!甚至不敌联发科
我们人人都会使用的微信,为什么外国人看不上?我在国外生活多年,外国人有手机,但公共场所很少使用,大多都不用微信,因为网络太慢。人家老外不怎么喜欢即时通讯软件,说白了微信之前人家老外早开发出来,只是没人用,老外喜欢的是推特或者全球首个活体机器人能自己生孩子!专家短时间内很难对人类有威胁近日,美国科研人员发现了一种全新的生物繁殖方式,并利用这一发现制造出了史上第一个可自我繁殖的活体机器人。根据相关报道,最初,科研人员从非洲爪蟾的胚胎中提取干细胞并培育成皮肤细胞或心瑞士通过自杀胶囊法律审批明年将上市,30秒即可平静死亡文观察者网冯智源据瑞士媒体当地时间6日消息,一款由3D打印技术制造的自杀胶囊Sarco近日在瑞士通过了该国法律审批,预计将在明年在当地上市并投入使用。与传统药物注射的方式有所不同,让新鲜农产品搭上互联网快车来源人民网人民日报在山东德州禹城,刚刚从地里采摘下的芹菜迎着晨光被送上去往中心仓的汽车,经过分拣加工输送等高效处理流程,这些及时进仓保存的芹菜最终以新鲜的状态被端上了餐桌。禹城芹菜中国互联网企业综合实力指数发布阿里腾讯百度位居前三甲中经济导报中国发展网讯记者王晓涛11月26日,在中国互联网企业综合实力指数(2021)线上发布会上,中国互联网协会副理事长兼副秘书长何桂立公布了中国互联网综合实力前百家企业和互联网MySQL查询优化使用索引通过慢查询日志找出效率差的SQL,再进一步判断索引是否高效MySQL的查询优化程序analyzetablescoreexplainselectfromscorewheref数据采集ETL工具Elasticsearchdatatranv6。3。9发布数据采集ETL工具Elasticsearchdatatranv6。3。9发布。Elasticsearchdatatran由bboss开源的数据采集同步ETL工具,提供数据采集数据清守护数字化安全,360安全卫士深度解析JavaXminer挖矿木马近年来,加密货币的迅速发展,也催生了一种全新的黑产挖矿木马。挖矿木马源于数字货币,利用挖矿程序获取数字货币利益。随着比特币等数字货币交易价格的不断攀高,各类挖矿木马的身价水涨船高,全球多国房价达10年最大涨幅阿里巴巴升级多元化治理,张勇加码内需与全球化战略海外撬动洛克希德马丁获NASA商用空间站合同,涉及金额达1。6亿美元洛克希德马丁公司将与Nanoracks和VoyagerSpace合作,为美国宇航局(NASA)设计Starlab全球首款存算一体AI芯片诞生能效比提升300倍据报道,阿里达摩院近日成功研发新型架构芯片。该芯片是全球首款基于DRAM的3D键合堆叠存算一体AI芯片,可突破冯诺依曼架构的性能瓶颈,满足人工智能等场景对高带宽高容量内存和极致算力去中心化应用(DApp)是什么?去中心化应用程序(DApps)是运行在分布式计算系统上的应用程序,即区块链网络。虽然有多种定义DApp的方式,但它们通常被描述为具有以下特征的应用程序开源源代码有意向公众提供,这意