TA的每日心情 | 开心 2022-12-9 15:13 |
---|
签到天数: 10 天 [LV.3]偶尔看看II
|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
为了像51单片机一样能够对某个管脚单独操作,引入了位带操作这样的操作机制。
' H! \( ?9 W ?8 G2 t
: ]' y: p- A3 \; F% |9 b# ?5 Y 如下图,位带(Bit band)区就是就是你想单独操作的IO的区域,比如PA1、PA2。而位带别名区就是你给每一位重新起了个名字的那一片地址区域。可以看下表,M3内核存储器映射表,你能看到1M内存的BitBand区,还有与之对应的32M内存的BitBand别名区,因为你将每一位膨胀成为了一个32位的地址,所以相应的别名区的内存也会是位带区的32倍。8 N$ u; c ^3 l$ E
$ E: ~& c" r2 \! b 想进行位带操作,应该先去找该位对应的别名区的地址,找到了这个地址,对这个地址进行操作,那么实际上也就是对该位进行操作了。
5 G2 Q) @& g/ W9 h' t& g* x8 d/ ]3 R' F3 j- B: W& B* w. Y
官方给出了如下相应的计算公式:" K5 U3 e# ~- |0 f7 Q% ~
. X) Z! X. n. S0 u7 h; rAliasAddr
: U" H( R; e1 N1 X" t$ n; V=0x42000000+((A‐0x40000000)*8+n)*46 G% H4 A i& I9 w' f2 W8 \3 Y
=0x42000000+ (A‐0x40000000)*32 + n*4
. t* T" C# }5 d, l2 `
. O; G$ \. A- g1 m; Y! | 其中,AliasAddr是别名区的地址,A是GPIOA->ODR的地址,n是该端口的上的某一位。
) j# w& M2 J+ x; Y: G/ G. M, f
2 K& S9 f) U0 l) L, m 0x42000000是位带别名区域的起始地址,A是输出数据寄存器GPIOA->ODR的地址,A的地址先减去位带区基地址,得到的是相对于位带区基地址的偏移地址,那么膨胀之后还是一个偏移地址,是相对于位带别名区基地址的偏移量,加上位带别名区域基地址,就得到了其对应的别名区地址。
. j0 U8 I8 q1 s& g" T
A; c9 D% N; p- k 多数情况下,大家见到的代码,应该是以下这个样子,一共分为三步:
T% |! z, ]! \4 G M$ X7 L4 E+ i7 _; r. e( f! ?3 m2 x
#define BITBAND(addr, bitnum) ((addr & 0xF0000000)+0x2000000+((addr &0xFFFFF)<<5)+(bitnum<<2))# ]. i' ~5 w$ k+ U; \" ?
#define MEM_ADDR(addr) *((volatile unsigned long *(addr)) l1 F. J1 m8 l% |* k) B
#define BIT_ADDR(addr, bitnum) MEM_ADDR(BITBAND(addr, bitnum))
% B ?. H& q% f$ M) M2 W( \' b3 e1 i' a
第一步,就是我们上面分析的,得到位带别名区域的32位地址。
* r, |5 v- K, W% a) b; s& ? m! N2 g0 P5 Q
第二步,就是将第一步得到的32位地址,给转换成一个指针变量,并且操作这个地址里的值,唯一的区别,就是由于安全的考虑,多加了一个volatile 这样的关键字。
0 d8 ~2 D6 h2 e. e1 U9 k$ b/ f6 }) l% T. s; s7 i5 n% m/ A5 u4 J
举个例子# V) E- H8 W$ ^- Z9 i- ~! \
2 {2 `) T5 n( O) \4 P
如下,想直接访问0x00000001这个地址,并且给这个地址写1,该怎么做呢?
1 K Z4 Q/ i9 Y1 a& N7 w- q: H% b# N) [2 X2 @
# define ADDR 0x00000001) A* a! k5 s+ z- L5 ?
*(int *)ADDR = 1;3 K/ o* @: f6 f
1 K3 p6 {% U# M( e+ V9 [6 e 第三步,就是将前两部,结合在一起,根据传入的addr和bit计算得到32位的地址,然后强制类型转换,使得我们可以去操作这个地址里的值。
2 @1 `1 h: k% k4 e) M( L0 ]' Z+ {% c! l
提示:bitnum<<2相当于bitnum2乘以4,位运算相关文章:C语言操作寄存器的常见手法,实际上在计算机底层乘法也是基于位运算实现的。 }, d0 l) D% e5 n
3 |) V& ~- z: [. h7 i5 n2 i. M
找国产替代芯片,上道合顺大数据
# l+ h7 F; x9 P8 x3 s9 N0 T# E9 g5 h
|
|