Hi,宝子们~
小铭今天带来了设计师刚拍完的新设计作品呦~
今天是高中老师装修的新家,期待一下~
.
Tips:
在提到新家装修时,
小周老师第一个要求就是整改客厅,
说客厅太小了,要求客厅和书房换个位置,
并把书房改造成小卧室,
说在学校天天教书,回家不想再看到书
Hhhh,原来当代老师也不喜欢内卷啊~
.
装修详情:
地址 | Addr:山水国际
风格 | Style:现代风
面积 | Size :156㎡
设计|design:铭品装饰#美好家居打造法# #装修[超话]# #设计美学# #你家缺什么好看的#
小铭今天带来了设计师刚拍完的新设计作品呦~
今天是高中老师装修的新家,期待一下~
.
Tips:
在提到新家装修时,
小周老师第一个要求就是整改客厅,
说客厅太小了,要求客厅和书房换个位置,
并把书房改造成小卧室,
说在学校天天教书,回家不想再看到书
Hhhh,原来当代老师也不喜欢内卷啊~
.
装修详情:
地址 | Addr:山水国际
风格 | Style:现代风
面积 | Size :156㎡
设计|design:铭品装饰#美好家居打造法# #装修[超话]# #设计美学# #你家缺什么好看的#
Ubuntu 20.04修改ip地址
说明:
“ubuntu从17.10开始,已放弃在/etc/network/interfaces里固定IP的配置,即使配置也不会生效,而是改成netplan方式 ,配置写在/etc/netplan/01-netcfg.yaml或者类似名称的yaml文件里”
查看网卡配置 IP addr 会显示当前的ip配置,
然后vi /etc/nec/netplan/00-installer-config.yaml修改网卡配置配置后按sudo netplan apply 保存,之后再按ip addr就能查看了。
说明:
“ubuntu从17.10开始,已放弃在/etc/network/interfaces里固定IP的配置,即使配置也不会生效,而是改成netplan方式 ,配置写在/etc/netplan/01-netcfg.yaml或者类似名称的yaml文件里”
查看网卡配置 IP addr 会显示当前的ip配置,
然后vi /etc/nec/netplan/00-installer-config.yaml修改网卡配置配置后按sudo netplan apply 保存,之后再按ip addr就能查看了。
STM32开发中的位运算以及位带操作-道合顺大数据infinigo
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。
如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。
想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。
官方给出了如下相应的计算公式:
AliasAddr
=0x42000000+((A‐0x40000000)*8+n)*4
=0x42000000+ (A‐0x40000000)*32 + n*4
其中,AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位。
0x42000000是位带别名区域的起始地址,A是输出数据寄存器GPIOA->ODR的地址,A的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。
多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *(addr))
#define BIT_ADDR(addr, bitnum)MEM_ADDR(BITBAND(addr, bitnum))
第一步,就是我们上面分析的,得到位带别名区域的32位地址。
第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。
举个例子
如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?
# define ADDR 0x00000001
*(int *)ADDR = 1;
第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。
提示:bitnum<<2相当于bitnum2乘以4,位运算相关文章:C语言操作寄存器的常见手法,实际上在计算机底层乘法也是基于位运算实现的。
找国产替代芯片,上道合顺大数据 https://t.cn/A6VtEwIS
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。
如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。
想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。
官方给出了如下相应的计算公式:
AliasAddr
=0x42000000+((A‐0x40000000)*8+n)*4
=0x42000000+ (A‐0x40000000)*32 + n*4
其中,AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位。
0x42000000是位带别名区域的起始地址,A是输出数据寄存器GPIOA->ODR的地址,A的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。
多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))
#define MEM_ADDR(addr) *((volatile unsigned long *(addr))
#define BIT_ADDR(addr, bitnum)MEM_ADDR(BITBAND(addr, bitnum))
第一步,就是我们上面分析的,得到位带别名区域的32位地址。
第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。
举个例子
如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?
# define ADDR 0x00000001
*(int *)ADDR = 1;
第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。
提示:bitnum<<2相当于bitnum2乘以4,位运算相关文章:C语言操作寄存器的常见手法,实际上在计算机底层乘法也是基于位运算实现的。
找国产替代芯片,上道合顺大数据 https://t.cn/A6VtEwIS
✋热门推荐