标志寄存器中有哪些标志位?各在什么情况下置位?_寄存器的位数由什么决定

标志寄存器中有哪些标志位?各在什么情况下置位?_寄存器的位数由什么决定C语言、嵌入式位操作精华技巧大汇总大家好,我是杂烩君。对于ST的芯片的使用,大家平时在学习、工作中大多使用库函数的方式来开发吧?我之前也是用库函数来进行配置,最近发现直接配置寄存器有时候好像更容易些,而且可读性也不会很差。下面分享关于寄存器配置的一些笔记:一、位操作简单介绍首先,以

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

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/58701.html

(0)
上一篇 2024年 8月 30日 下午5:10
下一篇 2024年 8月 30日 下午5:14

相关推荐

关注微信