本帖最后由 yangc9 于 2018-5-27 16:30 编辑 4 \7 _4 B* V6 i# d" O STM32的bitband(位带)是个好东西.但是F0不支持.没关系,想办法给他模拟出来. 在F1中,可以这样使用IO口: __no_init vu32 PA[16] @ 0x42210180; __no_init vu32 PB[16] @ 0x42218180; .......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 ........ 把以上代码复制到F0的工程中,运行. 不出所料,进HardFault了.因为此段地址是保留的.* [0 _& b& D; y 进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 R19 k4 e+ I8 S- N. l+ g R2 R32 `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的动作. F0的写外设的指令是STR:3 X) J% k4 V. t5 h/ u& H$ R STR Rt, [Rn {,#imm}] STR Rt, [SP {,#imm}] // 此条不用考虑, SP不可能指向外设区 STR Rt, [Rn, Rm]% z9 x, E# P, V$ X; c! x3 f8 Y9 r SP不可能指向外设区,不考虑PUSH指令 STMxx似乎也不用来操作外设区.1 @$ [% F8 |! G, s0 m 只需要解2种STR就可以了. 上代码: 4 {0 Z5 o3 x( {9 p' T __task void HardFault_Handler(int uu1, int uu2, int uu3, int uu4, int R4, int R5, int R6, int R7, int HFLR, int R0, int R1, int R2, int R3, 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; // STR Rt, [Rn {,#imm}] // imm <= 124 // 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) Addr = *(&R0 + Rn) + imm;( Q. ?1 S6 V& @& Q) \/ W4 q" |6 ~ else Addr = *(&R4 + Rn - 4) + imm; } else if ((ins & 0xFE00) == 0x5000)4 ` A4 }1 Y9 J, |1 P {5 {) ]/ G+ b- t Rt = ins & 7; int Rn = ins >> 3 & 7; int Rm = ins >> 6 & 7;, H& X" E( f! e0 _ U( Q if (Rn <= 3)8 Z) ]6 N' W9 | Addr = *(&R0 + Rn); else" y/ D5 P3 C; W( s, L: Y5 j Addr = *(&R4 + Rn - 4); if (Rm <= 3) Addr += *(&R0 + Rm);7 T+ O- M V/ K {9 Z3 L else2 u; I, G" @. N" \9 J Addr += *(&R4 + Rm - 4); }8 D8 t E# M% ]& \; c ], D+ |% O if (Addr >= 0x42000000 && Addr < 0x44000000)' _( O/ U! s* x8 N h# M. j { 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) 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; PC++;/ E7 {1 q) }$ j) J3 b- \5 i } asm ("POP {R3-R7}");3 A! K, d" ?0 ~1 K$ E6 e } 8 \/ {! 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% ^ 美女说: 回帖送金币哦! |
牛逼!!! |
还好同事不在! |
STM32固件库分享,超全系列整理
三创电子(Tcreate)-STM32F030核心板代码
STM32F0 ADC(DMA中断)多通道,注释超详细
FreeRTOS在STM32F030上的移植
基于STM32移植而引发的疑问经验分享
分享STM32F051中文参考手册(重制书签版)
游名:STM32F0+Trinamic智能步进驱动芯片TMC5160(最高20A)参考原...
【MCU实战经验】+STM32F030的步进电机加减速
STM32F0的中文技术参考手册(标签处理过)
基于STM32F030硬件SPI经验分享