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

在STM32F0上模拟bitband

[复制链接]
yangc9 发布时间:2018-5-24 00:59
本帖最后由 yangc9 于 2018-5-27 16:30 编辑 4 \7 _4 B* V6 i# d" O

7 q( r" U6 u7 q( j1 sSTM32的bitband(位带)是个好东西.但是F0不支持.没关系,想办法给他模拟出来.
* M& ^; `* a. }. T" Z- `, J' w* k在F1中,可以这样使用IO口:
: w% b% O8 Z+ N. Y! U__no_init vu32 PA[16] @ 0x42210180;
5 T/ ]" `' L5 ^: |) _& p9 q__no_init vu32 PB[16] @ 0x42218180;
6 U( k8 i, @$ e4 b5 A.......9 R- I) v( Y9 Z% M2 N/ J8 c0 q# g6 T8 f
#define LED1 PA[1]* K3 i$ n, D1 Z* ?2 m
#define LED2 PB[2]: X& T3 z2 w3 d8 u% ^& X/ z
........2 I; Q- w* A1 x: T  }7 V3 Z
LED1 = 0; // 亮灯* r' [. x1 e* b$ A0 F; |  i2 Y
# V2 O$ {2 X2 b3 Y9 I( X
LED2 = 1; // 灭灯! I8 J# y. U7 k# L) }  P
8 o' o" e2 N. G0 K
........
7 p. m, T2 S9 X* J把以上代码复制到F0的工程中,运行.
: b( S4 L$ K( d6 B) ~1 q; j5 S不出所料,进HardFault了.因为此段地址是保留的.* [0 _& b& D; y

. K. J, C9 [5 |& O  P& v$ l* u进HardFault时R1~3,R12,LR,PC,xPSR自动压栈.2 u( n; ?( y9 o% _( g+ v4 l
低地址% X) ^9 U! r" @( Y# `  b. Q2 {+ q5 z
R0
  r  a5 M( |4 I* s) D: rR19 k4 e+ I8 S- N. l+ g
R2
- I# d  Z/ N2 o6 w& ]; I' {3 pR32 `3 b$ x/ q# b  k7 X- K" S
R126 h) F- Y) B. i! u" a. e; t
LR; a" h3 e' C" c& ?* R+ l
PC0 n7 A: W- n) S- E- x
xPSR5 }9 k; |  K) a
高地址& Y  h9 g( ^, R+ l
PC的值为0x08000064,指向flash,里面的内容为0x6048,这是一条指令STR  R0, [R1, #0x4]: g( w0 }5 [' x& X9 u( h( n
知道了指令,就可以解读此条指令,并根据寄存器内容将指令转化为BRR和BSRR的动作.
- R0 @( A) t( b8 P  ^# oF0的写外设的指令是STR:3 X) J% k4 V. t5 h/ u& H$ R
STR Rt, [Rn {,#imm}]
( J8 w/ Q% q: Q9 bSTR Rt, [SP {,#imm}] // 此条不用考虑, SP不可能指向外设区
1 P6 o. e7 T$ f" RSTR Rt, [Rn, Rm]% z9 x, E# P, V$ X; c! x3 f8 Y9 r
SP不可能指向外设区,不考虑PUSH指令
1 i: f6 R1 G6 _STMxx似乎也不用来操作外设区.1 @$ [% F8 |! G, s0 m
只需要解2种STR就可以了.
  ?: e* b) j, w2 m; C上代码:
( d' c% O$ {5 G* t) O! \4 {0 Z5 o3 x( {9 p' T
__task void HardFault_Handler(int uu1, int uu2, int uu3, int uu4,
5 J, R* k' ]- [- w; \8 j: N                                                          int R4, int R5, int R6, int R7, int HFLR,
3 N, E3 y+ `# Q/ U" l                                                          int R0, int R1, int R2, int R3,
, @" L4 L& `; t: u                                                          int R12, int LR, int16* volatile PC, int xPSR)6 P: A! B) W1 L# @0 W& i3 ^0 ]
{, b% N! o, \" m: P1 S( ]. h( m& ?
        asm ("PUSH {R3-R7}");# k  b) O$ H8 _  L8 `" w" l# V
        uint16_t ins = *PC;# T, p  I5 ^5 {6 }4 V$ R2 _  s
        int Rt, Addr;
( x) l$ Z& `( j( D, g/ b; a- u- F        // STR Rt, [Rn {,#imm}]                // imm <= 124
: J$ H: w% N% O, G        // 0x6000 | Rt | Rn << 3 | imm << 49 ~4 g8 [/ Z! A3 q
        if ((ins & 0xF800) == 0x6000): g. O2 p0 G2 I9 M+ j* a( c
        {3 o3 s* y! ~& q
                Rt = ins & 7;3 y! T9 ~. w. e" \; ]
                int Rn = ins >> 3 & 7;# M: B) k2 u6 t% @0 h. _
                int imm = ins >> 4 & 124;3 a9 M9 k2 M1 R9 n2 C1 ~% c
                if (Rn <= 3)
% V& t7 m5 s" K8 @                        Addr = *(&R0 + Rn) + imm;( Q. ?1 S6 V& @& Q) \/ W4 q" |6 ~
                else
$ G, \6 H  j# p$ t+ D                        Addr = *(&R4 + Rn - 4) + imm;
7 W* K5 O- M$ x8 f: O4 ]        }
- L! W' E3 c) e        else if ((ins & 0xFE00) == 0x5000)4 `  A4 }1 Y9 J, |1 P
        {5 {) ]/ G+ b- t
                Rt = ins & 7;
9 p& [# _4 f  F2 ?+ P6 z  w! D                int Rn = ins >> 3 & 7;
- U) V0 j2 ]6 ~- ?. b0 ]                int Rm = ins >> 6 & 7;, H& X" E( f! e0 _  U( Q
                if (Rn <= 3)8 Z) ]6 N' W9 |
                        Addr = *(&R0 + Rn);
) X; j# U3 b: y  m. i8 I                else" y/ D5 P3 C; W( s, L: Y5 j
                        Addr = *(&R4 + Rn - 4);
( f* u. m- P# W- n( w, N                if (Rm <= 3)
4 }; D# a9 m' b% c% Y# }+ z                        Addr += *(&R0 + Rm);7 T+ O- M  V/ K  {9 Z3 L
                else2 u; I, G" @. N" \9 J
                        Addr += *(&R4 + Rm - 4);
5 y8 w4 Y/ Y4 O9 X- B8 V        }8 D8 t  E# M% ]& \; c  ], D+ |% O
        if (Addr >= 0x42000000 && Addr < 0x44000000)' _( O/ U! s* x8 N  h# M. j
        {
7 k5 T& j2 r3 y9 l3 H1 G% j, K                int port = (Addr >> 15 & 7) - 2;, E* X/ K2 j7 b( F/ w, C; z
                int pin = Addr >> 2 & 15;$ K% T+ v3 @4 V+ u3 {
                int RtVal;; C7 V7 K0 W/ x! e. P
                if (Rt <= 3)
! \7 [8 U8 C5 x! b2 X* I( F" F) |                        RtVal = *(&R0 + Rt);) P. R8 y: m$ ?1 a" e& \& ]
                else  Q0 \5 E# m  U
                        RtVal = *(&R4 + Rt - 4);" H& A4 O. i  q  d# D
                *(&GPIOA_BSRR + port * 0x100) = (RtVal & 1 | 0x10000) << pin;
* ]/ p% C8 y. F$ M" ~8 K) `; v7 A                PC++;/ E7 {1 q) }$ j) J3 b- \5 i
        }
! ?6 c2 F- v" k9 y4 _4 B0 Z. |        asm ("POP {R3-R7}");3 A! K, d" ?0 ~1 K$ E6 e
}
5 i7 P5 x3 ?% ^: F+ A8 \/ {! I' t- ]; u7 j/ e; ^
更新:解决R4-R7的bug.3 p- P' F4 H! M$ r8 [9 P! U& K
7 i& ?; b$ X% O, G; u% ^
美女说: 回帖送金币哦!
) k* f! D* D( `; k! g& W) P8 i8 V% [; d, E Shaved-Sexy-Totally-Shaved-Blonde-Babe-Mia-Malkova-with-Pierced-Pussy-from-FTV-i.jpg
: b" X+ ]% h+ r+ `* P5 B( |
收藏 评论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管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版