请选择 进入手机版 | 继续访问电脑版

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

在STM32F0上模拟bitband

[复制链接]
yangc9 发布时间:2018-5-24 00:59
本帖最后由 yangc9 于 2018-5-27 16:30 编辑 % }* \% _7 O* x& w
# ~8 U: o; E1 |" b" v$ d
STM32的bitband(位带)是个好东西.但是F0不支持.没关系,想办法给他模拟出来.
$ f* L0 s; D) F* E, H" i在F1中,可以这样使用IO口:
4 e! n" i" K  B! d2 M0 ?__no_init vu32 PA[16] @ 0x42210180;7 I* O9 F, S. w  m7 s
__no_init vu32 PB[16] @ 0x42218180;+ {( s$ ~+ Z2 D1 Q) R0 e( U
.......
4 x4 T( }7 Q6 n2 ~: h#define LED1 PA[1]" l; w- k+ L  n; O! u: k
#define LED2 PB[2]0 T, }5 F4 N7 F. {
........
7 L" R. c% w" [5 M* zLED1 = 0; // 亮灯* V# s" j" k3 l8 ~) w" ], r2 K
8 l. Q/ s$ r$ }
LED2 = 1; // 灭灯
( n+ X) J3 @6 \& E# p
$ P; o7 G% i. W( [$ v4 H% e......../ @3 t. ]. v1 ]- D  C: s$ k1 k
把以上代码复制到F0的工程中,运行.: ^- W$ v/ h4 l
不出所料,进HardFault了.因为此段地址是保留的.
1 b& `/ \3 z' ?: r& v1 F: J' v7 o0 o6 h, @1 Z
进HardFault时R1~3,R12,LR,PC,xPSR自动压栈.
) I4 R/ ~" B0 e  O低地址& |, v. O' {0 N9 p7 U4 W
R0
1 h2 `9 m' @; x! L( U7 gR1
' Z/ \/ t9 a2 z5 U3 }; VR2: y) Z3 D! L5 z9 q
R3. D0 H" y, l, Y% P, ]. F- U
R12- y( Z& L/ T" `8 t' v2 b8 W
LR
8 L& S7 K. m& u. M' j2 yPC
1 w3 k# y6 t( SxPSR# e1 k+ \8 ?( h+ T# z0 g: u, J8 @: C
高地址
" e$ e' n; z' V9 G- APC的值为0x08000064,指向flash,里面的内容为0x6048,这是一条指令STR  R0, [R1, #0x4]* F4 |! ^7 x+ J$ G! f9 H
知道了指令,就可以解读此条指令,并根据寄存器内容将指令转化为BRR和BSRR的动作.+ y) m3 N9 x3 W* k1 f
F0的写外设的指令是STR:, d7 J9 i( y( R% Z0 p
STR Rt, [Rn {,#imm}]
2 M8 x! O, H. @0 b+ Y* {0 WSTR Rt, [SP {,#imm}] // 此条不用考虑, SP不可能指向外设区3 H1 k, u! z  B  {/ e* K1 X
STR Rt, [Rn, Rm]: m$ u* k% o2 O; z8 t/ `  c4 Z
SP不可能指向外设区,不考虑PUSH指令
8 F; R: O: X) o6 a  M- Z* E8 f# R- oSTMxx似乎也不用来操作外设区.
! b7 x. L/ ]+ j% r6 U# v% e. S4 q只需要解2种STR就可以了.
6 \8 C8 I- \! n) f- C上代码:+ R& y, K3 Q' G
9 M9 P+ v! N4 ?* `5 a. o, _/ }5 }
__task void HardFault_Handler(int uu1, int uu2, int uu3, int uu4,
; @% J3 m1 `* I6 K  w                                                          int R4, int R5, int R6, int R7, int HFLR,
3 K! ?- e' Y( L* e2 i. Z) v                                                          int R0, int R1, int R2, int R3,# D% g# E( a8 {; u% ~* R3 ]
                                                          int R12, int LR, int16* volatile PC, int xPSR)! F3 K% u8 k& K" i& h: b' a
{  u, ^5 g/ Q& b6 B0 F. e
        asm ("PUSH {R3-R7}");% l/ d0 d/ r. F' E
        uint16_t ins = *PC;* O  B3 A" Q: r" x
        int Rt, Addr;
3 t& k  `* e8 R  h        // STR Rt, [Rn {,#imm}]                // imm <= 124
2 g* F; f( ]1 `# i1 a; G- n        // 0x6000 | Rt | Rn << 3 | imm << 4& g! j$ E# C' M. k6 Q: y
        if ((ins & 0xF800) == 0x6000)
/ H- o, Z4 W5 T# k. b9 {% {6 w        {
9 r; K8 l; M7 o                Rt = ins & 7;# Q8 [, {( z4 S! x! a
                int Rn = ins >> 3 & 7;
. S; g$ S4 p/ u# v0 v4 _+ Y                int imm = ins >> 4 & 124;
# D+ ?/ h" ~' w' t                if (Rn <= 3)
6 J  w; b( _4 v4 T. L* |# n5 ^0 l                        Addr = *(&R0 + Rn) + imm;
3 j6 ~# T7 |3 Y3 E                else3 t$ c8 O0 ^. A  `$ B( }
                        Addr = *(&R4 + Rn - 4) + imm;+ N4 Z4 q+ ~& k$ A
        }2 \$ E7 f, @7 o: l8 a5 }
        else if ((ins & 0xFE00) == 0x5000)
9 u9 X( c+ t3 I0 i, L9 G$ o+ M        {
; t2 f1 k. p4 ?& N. w                Rt = ins & 7;
. ?3 m2 B6 r; |- Q2 F- a                int Rn = ins >> 3 & 7;
- k/ S5 z0 @; W9 d6 U' p! y; U/ ~                int Rm = ins >> 6 & 7;/ Y5 b8 G+ {3 }* [" P, H
                if (Rn <= 3)/ C% a" k7 v, n$ Y0 ]& v( G; E
                        Addr = *(&R0 + Rn);
9 n6 T! S; X7 H- h; t+ n9 i                else
% W0 H7 I: r  X' z) J: A) }; g                        Addr = *(&R4 + Rn - 4);
1 v4 n/ r+ Q- R+ X. x, t( z                if (Rm <= 3)
5 K, V. }; M' G9 ^" T                        Addr += *(&R0 + Rm);; X, H2 f8 I9 i" X$ d" g$ r
                else/ p% f) p0 S( j( c+ O6 w0 o" I
                        Addr += *(&R4 + Rm - 4);
4 e5 U" v8 }4 O) \' @        }- d3 j; U/ U4 I
        if (Addr >= 0x42000000 && Addr < 0x44000000)
% G) I6 g4 Y% G5 W& K6 `        {1 O0 h/ V) z8 S& S! K7 l5 _: e  w
                int port = (Addr >> 15 & 7) - 2;
/ V% X% |" i+ y3 M, w; m  u                int pin = Addr >> 2 & 15;
8 ^" S9 ]3 T8 n5 B( F" F; {/ J                int RtVal;  O) [7 l# K1 u8 a1 ?, k* t) n
                if (Rt <= 3)/ G, S# ]0 B' b2 _3 j( {& y
                        RtVal = *(&R0 + Rt);
1 ]/ k6 S$ F; Z1 v6 t                else
( v& }8 v  S- b$ l# ^9 R                        RtVal = *(&R4 + Rt - 4);
! O0 H+ ~2 ]  h' r; M                *(&GPIOA_BSRR + port * 0x100) = (RtVal & 1 | 0x10000) << pin;, P! ~9 h  h8 j* T: P! p
                PC++;/ C0 H6 |* C& a  f) p2 A
        }
- [5 f# N* [* A" Z  G$ e, L        asm ("POP {R3-R7}");
! O/ K( {( \1 y}9 K3 ]3 p7 ?" C$ C7 o. r+ m" a# h. @
# Z* B4 L& G) V) Y6 Q6 Q& D; ]
更新:解决R4-R7的bug.
, h% v7 d# x& N: C0 j0 R
1 X: x2 U( O$ W7 y" v; X美女说: 回帖送金币哦!
: F( }2 b2 Q% B7 M Shaved-Sexy-Totally-Shaved-Blonde-Babe-Mia-Malkova-with-Pierced-Pussy-from-FTV-i.jpg
& A) F, E6 k9 ~
收藏 评论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 手机版