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

在STM32F0上模拟bitband

[复制链接]
yangc9 发布时间:2018-5-24 00:59
本帖最后由 yangc9 于 2018-5-27 16:30 编辑
, ]$ U6 D: |1 E) ~8 s8 u5 E7 }3 b6 Z7 [$ {
STM32的bitband(位带)是个好东西.但是F0不支持.没关系,想办法给他模拟出来.
/ P; _' H% q8 p8 g在F1中,可以这样使用IO口:
( r$ B( Y* ]0 j* l/ p__no_init vu32 PA[16] @ 0x42210180;
6 I  ?7 r9 n, e__no_init vu32 PB[16] @ 0x42218180;2 A( ?7 d# s+ E
.......' x9 m0 M$ i6 z( k6 y
#define LED1 PA[1]- y0 S) m' q- A5 X- @& H
#define LED2 PB[2], d+ P# u0 S' P5 u' T1 K
........2 s  `/ b, H6 L
LED1 = 0; // 亮灯9 _) f; q' d, m, {
# A/ B, K6 [0 D
LED2 = 1; // 灭灯4 L6 ^" V$ r# k2 Z  s

8 X4 P/ |# w7 i1 P7 R' l' p........# ?8 k! u, V8 o: W2 B5 G
把以上代码复制到F0的工程中,运行.
* C/ X3 m9 s& t. Q" N1 m不出所料,进HardFault了.因为此段地址是保留的.) j; L0 B9 w. b; H3 i* t" f
  k: H0 O% d/ Y  ?6 h+ r3 Y5 o
进HardFault时R1~3,R12,LR,PC,xPSR自动压栈.$ `5 o& \5 B6 H  a) Q
低地址
; p2 p' ?4 {5 N/ e, o* oR0
- |" U8 l1 f% `+ ^7 V2 AR1
! S9 d2 h, r! Y0 qR22 I' z+ D3 v5 r! E9 [% X
R3! @3 C3 c  G6 M* H
R12% f0 `: F9 ~8 b6 ?
LR
0 c2 }0 w2 {! p1 TPC6 C$ Z' X: l3 N, e6 m
xPSR
5 _) a, j  x* Y1 L6 U高地址
' ~- _+ K5 o( m- V! v* I5 v; ?PC的值为0x08000064,指向flash,里面的内容为0x6048,这是一条指令STR  R0, [R1, #0x4]  q" E( ^! y" I- ]2 y
知道了指令,就可以解读此条指令,并根据寄存器内容将指令转化为BRR和BSRR的动作.
5 i# x* s, L$ X3 T8 W' C+ R6 oF0的写外设的指令是STR:
1 d0 E: ?) p  h& USTR Rt, [Rn {,#imm}], ^2 T1 a: T4 g/ z: P+ _- I" z
STR Rt, [SP {,#imm}] // 此条不用考虑, SP不可能指向外设区' H5 _0 n$ f. t
STR Rt, [Rn, Rm]
4 X% t' X+ R% y- c4 ASP不可能指向外设区,不考虑PUSH指令
) M& ?+ j; ~- O3 ]* {STMxx似乎也不用来操作外设区.
0 E0 ]* ?9 j. O  `" w( N  Z只需要解2种STR就可以了.( A! X3 I+ N! v) B' Q4 z( o
上代码:+ }, B( g$ v* P
4 [9 Y1 T3 L6 G. G
__task void HardFault_Handler(int uu1, int uu2, int uu3, int uu4,+ F9 \: W- [) z: S0 D- L, `9 m# c
                                                          int R4, int R5, int R6, int R7, int HFLR,
5 O8 D; z: C6 A) U, u7 P9 V6 X" J                                                          int R0, int R1, int R2, int R3,
( ]5 `/ Y, p% I- q                                                          int R12, int LR, int16* volatile PC, int xPSR)* \8 E" u( v3 o& P- N
{8 G5 w- p' Z- M& }  S5 t
        asm ("PUSH {R3-R7}");
) @$ ]. R6 m  I6 i        uint16_t ins = *PC;
1 `+ H6 v/ s; v1 r2 a8 e5 M/ u        int Rt, Addr;
" l* x* T% L2 m4 \) c# S        // STR Rt, [Rn {,#imm}]                // imm <= 124( h3 d5 u  p+ \7 {
        // 0x6000 | Rt | Rn << 3 | imm << 4
% _6 f/ P8 v( s5 l        if ((ins & 0xF800) == 0x6000)9 g) a0 n5 C& Q* [* m
        {
0 ?' c7 H* P% r! h  ~                Rt = ins & 7;& p1 w, `+ H! ]2 T9 T
                int Rn = ins >> 3 & 7;! u# z2 q+ C/ j  Z: F3 j
                int imm = ins >> 4 & 124;
: b# v- B# O5 x4 X! x# @                if (Rn <= 3)
( W( c% O/ u5 d                        Addr = *(&R0 + Rn) + imm;/ t5 j; X+ u8 @7 j1 _
                else: ], q: y' I, @
                        Addr = *(&R4 + Rn - 4) + imm;, S& n* n% X, D
        }
; b2 _4 g6 N, [$ A3 ]" ~% P        else if ((ins & 0xFE00) == 0x5000)
  B) J1 M5 X5 M5 A        {
7 b5 Z% h8 w" C4 y6 P5 a4 V                Rt = ins & 7;
! v) K9 P7 F. n2 l/ |                int Rn = ins >> 3 & 7;
3 G2 S# j; {1 t) b) c                int Rm = ins >> 6 & 7;
+ n  b, l. m) X8 l- J4 a3 J                if (Rn <= 3)
2 Q7 H" D5 b, C0 X7 {8 v                        Addr = *(&R0 + Rn);
% B2 m$ ?# P- G4 i3 {+ u                else$ h: i: s# L& n# [& x; `" }. q* R1 K  l! P
                        Addr = *(&R4 + Rn - 4);) `! z3 N) u) P1 o. S9 R
                if (Rm <= 3)" G8 y7 {  y) v$ W% \# K. ~
                        Addr += *(&R0 + Rm);
' d5 F9 Z, \1 s) W* F6 V                else
( ~; ?. ^" s" G                        Addr += *(&R4 + Rm - 4);3 R3 _/ Q/ @  ^
        }% Z( d9 k& |8 C
        if (Addr >= 0x42000000 && Addr < 0x44000000)
5 }( Y" a4 \/ y5 M6 G/ k, ?$ A" y        {
8 d# V! b, X; B, p% _                int port = (Addr >> 15 & 7) - 2;! F2 i! F+ b" [2 e6 r# O4 _( \6 d
                int pin = Addr >> 2 & 15;
% o" o6 q' D4 c" Q* L3 V3 }                int RtVal;7 P. B+ ?" D9 p2 P" }
                if (Rt <= 3)
6 A9 `) U9 Z8 p1 c; ~                        RtVal = *(&R0 + Rt);' _' {- b- ~/ P
                else$ \7 H; M9 l4 r! [! P
                        RtVal = *(&R4 + Rt - 4);' T* ~$ M2 ]# v6 i
                *(&GPIOA_BSRR + port * 0x100) = (RtVal & 1 | 0x10000) << pin;5 W* R" Q/ h! h" i( x4 k* i
                PC++;
, R& E+ S5 N& \# U+ W; P8 ?        }
4 L: v) s: _+ a( Q  A# x* e; X        asm ("POP {R3-R7}");
- \) L: n& b* ?2 e}
. i: l; `  g3 |5 k6 c4 n& [0 K# q: }, |  l( A$ s5 z) Z* \, O6 D4 P
更新:解决R4-R7的bug.
$ m0 f" p2 g0 K  [7 r$ X0 a, s" Y1 E0 h9 |5 l+ B3 j. ~$ y: P
美女说: 回帖送金币哦!
! j3 h" K# m# h1 x3 \9 T% ? Shaved-Sexy-Totally-Shaved-Blonde-Babe-Mia-Malkova-with-Pierced-Pussy-from-FTV-i.jpg 6 D$ L$ {1 p% t% }0 `! {% b9 a
收藏 评论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 手机版