你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

在STM32F0上模拟bitband

[复制链接]
yangc9 发布时间:2018-5-24 00:59
本帖最后由 yangc9 于 2018-5-27 16:30 编辑 5 O- @, G4 Y/ h8 H" Z
) o7 ?' M5 P# W! p0 F, D+ S3 M
STM32的bitband(位带)是个好东西.但是F0不支持.没关系,想办法给他模拟出来.2 k* g& y  N" G- N( @
在F1中,可以这样使用IO口:
. `( s$ Z8 G6 C# W4 z$ S__no_init vu32 PA[16] @ 0x42210180;! A4 v  D$ F* i9 d
__no_init vu32 PB[16] @ 0x42218180;
/ a0 \, N$ c! z.......
2 b9 P+ O+ {, j5 C+ a/ Z$ t#define LED1 PA[1]; {3 P: p4 r- Z
#define LED2 PB[2]
# s4 o- O6 M0 S, e% T7 f! f........! G$ N! [: R! [+ H* c- Z/ h. s
LED1 = 0; // 亮灯
1 r. X+ s# B) c( Y# L. `2 y; a* R! r, n6 h: N) ]- h# T- O0 f+ x
LED2 = 1; // 灭灯% R: \5 ~6 ~) G, ]! u9 ?6 F; ^
" I: n) [# z# ]! x* E. ^
........, N: I9 o5 X, b0 @% {! F$ G
把以上代码复制到F0的工程中,运行.
2 m( T( w3 A5 ~  z; L不出所料,进HardFault了.因为此段地址是保留的.
+ D( R/ \5 Y3 g' ^
; i4 g1 }3 k0 y% V进HardFault时R1~3,R12,LR,PC,xPSR自动压栈.3 u2 P  e6 O) A& o
低地址7 J! {7 R3 B) Q" ~3 m5 T% y
R0  u# {  F3 W/ ~* X6 r
R1. }) N* S4 r: v: c
R2( h# B0 T* J0 L3 i: |7 A  I
R3
/ Q( O+ {+ P" n& A7 u3 c2 K9 jR12
- x7 T; b, D3 OLR
; x& V7 A2 {/ H7 [5 MPC
5 j3 O( [% z: s: c3 g) KxPSR! d% ~, k  c! w+ P$ |$ ^' I
高地址  k( m0 z8 H& z5 u( m* N0 \$ v
PC的值为0x08000064,指向flash,里面的内容为0x6048,这是一条指令STR  R0, [R1, #0x4]
# [& u5 X& ]+ M/ H% S( B: j知道了指令,就可以解读此条指令,并根据寄存器内容将指令转化为BRR和BSRR的动作.5 c# e2 P4 [) p! ^; N3 P( ^: w
F0的写外设的指令是STR:' G8 u2 |. }5 [& Z
STR Rt, [Rn {,#imm}]3 A- Z2 U% m) Q* S
STR Rt, [SP {,#imm}] // 此条不用考虑, SP不可能指向外设区
/ I- o' f2 ?+ K: j5 ]8 ?STR Rt, [Rn, Rm]
5 e& C7 n0 f- l% F- oSP不可能指向外设区,不考虑PUSH指令
3 R: W6 ^! l8 T# h# hSTMxx似乎也不用来操作外设区.
3 ]: A9 Q6 W/ J% \5 x只需要解2种STR就可以了.# l& ?7 E7 y5 o% E6 ?# t1 t, b, a5 {+ e
上代码:
/ M* ]5 o0 z3 S7 H' l, c- u+ m! O; O+ J& O* Y  \
__task void HardFault_Handler(int uu1, int uu2, int uu3, int uu4,
4 D* x- R% `) @+ N                                                          int R4, int R5, int R6, int R7, int HFLR,
5 Z4 X6 q1 o" }& h1 u) R# e                                                          int R0, int R1, int R2, int R3,
3 C9 I' k5 G& E4 Q+ A                                                          int R12, int LR, int16* volatile PC, int xPSR)
( Q' ?. Y+ y1 u- d{
1 I2 r9 l' x6 t" m( L        asm ("PUSH {R3-R7}");% v1 Q3 G( I8 h5 E0 i4 \; U" z6 u
        uint16_t ins = *PC;
4 \" u7 h- V2 y  @        int Rt, Addr;7 U. N6 X" {+ o" B8 @4 m! p8 N6 Z8 T, U% X
        // STR Rt, [Rn {,#imm}]                // imm <= 124
0 n7 c& I5 c; V0 N% @        // 0x6000 | Rt | Rn << 3 | imm << 4
: J+ w$ \) }" ]0 e: x) p# E$ R1 f        if ((ins & 0xF800) == 0x6000)& H# I5 z* x& B. K! x7 m  t
        {/ v, b0 ?. u: |/ b; z
                Rt = ins & 7;
( s* ?2 u# E$ A, @- m% @' [                int Rn = ins >> 3 & 7;
. D( ]" k7 p, x# u  o. e( c; M% c+ Q# G                int imm = ins >> 4 & 124;! m+ b, t2 f5 n' N& t& n  U
                if (Rn <= 3)  \& v0 a  C5 a
                        Addr = *(&R0 + Rn) + imm;
/ S. J! |# q: P7 W1 u7 j                else" N1 G! u# ]- q8 x
                        Addr = *(&R4 + Rn - 4) + imm;
0 e. g5 |7 n6 v9 o' D: x: x        }
- H" J9 G7 }# {# I6 j2 N        else if ((ins & 0xFE00) == 0x5000)
4 A5 G7 z: d6 w: K1 W        {
, H* F+ L% g" @$ _                Rt = ins & 7;
* t$ a8 n0 |) T% l& u                int Rn = ins >> 3 & 7;( O5 S% y' d) ?$ ^% I
                int Rm = ins >> 6 & 7;. D( j' I5 R2 L- q! f
                if (Rn <= 3), H( u9 f3 N8 W
                        Addr = *(&R0 + Rn);
- o' b! X- u9 s4 B* h3 A3 R/ e                else0 i8 u, F! g) w7 H1 E& V. s' V7 s
                        Addr = *(&R4 + Rn - 4);
6 j2 N6 a* u% s$ a' T6 `                if (Rm <= 3)
1 T( |. O# T. F3 d) R6 ^                        Addr += *(&R0 + Rm);9 G2 t( x/ d& k& ]
                else
- I0 y8 K+ x. {+ C; Z                        Addr += *(&R4 + Rm - 4);. B! t6 j8 C# |  W1 l! l0 W) w. H
        }" }$ N. r( l; {1 f9 i
        if (Addr >= 0x42000000 && Addr < 0x44000000)/ `4 X* ^5 A# S0 U. D; G3 _. ~
        {
  p# e2 m* [- i  F                int port = (Addr >> 15 & 7) - 2;
8 a* h. N  Q0 u$ r$ k                int pin = Addr >> 2 & 15;1 b+ r, L9 t, i' O
                int RtVal;
0 J5 L& Z8 a. s5 p& o/ c                if (Rt <= 3)  E8 }1 |; J5 Y1 C
                        RtVal = *(&R0 + Rt);" l' d1 R( m* i
                else
! R; m' s) g) q9 n                        RtVal = *(&R4 + Rt - 4);
8 S7 ^5 o$ _) v                *(&GPIOA_BSRR + port * 0x100) = (RtVal & 1 | 0x10000) << pin;
* \: I6 ]4 s7 j( f0 O& a5 @3 r                PC++;& ^5 X5 F) x. `6 o5 r# Q
        }
) q4 G1 @6 F# F9 O7 e        asm ("POP {R3-R7}");! f; }" E+ L6 n4 ]3 K+ \
}0 e3 W& Q+ k0 n

) @! g  H' ?! ]& ~更新:解决R4-R7的bug.; a) @* {4 V+ P1 `6 O5 i( Y

1 g8 V% p8 d4 R& S美女说: 回帖送金币哦!/ I, Q- }6 |. j" b3 q# Z
Shaved-Sexy-Totally-Shaved-Blonde-Babe-Mia-Malkova-with-Pierced-Pussy-from-FTV-i.jpg
& E/ F2 c3 J8 W+ l
赞 收藏 评论3 发布时间:2018-5-24 00:59

举报

3个回答
MrJiu 回答时间:2018-5-24 09:38:35
牛逼!!!
andey 回答时间:2018-6-7 10:56:18
提示: 作者被禁止或删除 内容自动屏蔽
lvwy0704 回答时间:2018-6-7 16:32:34
还好同事不在!

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版