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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:, @4 Y5 s' U; u- C6 D: d

: P# E, C0 R! x
$ I3 d. Y) u4 s& B- c" ^
位带操作
. ~; K0 n0 o! d中断
" h7 j2 h) j1 E0 b5 V% Vprintf重定向
  c4 M2 F. y$ @' V7 `' U( d随机数发生器RNG
5 V+ ]4 l. h, o" t& L& h/ L* v- cAD/DA
- J1 U. w7 [/ j1 DDMA
8 ?3 L# J, H2 X0 ]高性能计算能力9 ^* V# j5 I$ }$ v
加密
- Q! _. Z+ D/ f  ?8 c6 O3 pART加速
" w: K) f- T% e) F0 Y$ [8 |
% \' e* N5 P2 i7 {$ Q# K1 l

; D* E6 c% _' t
8 y- t4 e: P" T# |. ~一、位带操作
" z* h" ?- C2 h+ }% t8 t  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。% _2 s, |0 ?1 G( ~  y
1 u6 ^" H8 c9 D8 b2 t) U

- S, A" z0 @$ k" H3 M* j  支持位带操作的两个内存区的范围是:
+ |2 i& j2 Q7 l; r  g              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)
- Z2 g2 p- t" N# Y( O1 g3 D0 \/ o              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)0 \! R( G, ?/ k( o: r
* N8 b5 s* S6 I! P  T% ?# b1 B4 }/ X
; Z8 u) Q5 b; \0 S% w
      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)
! P+ J: `5 c; Q: J# S4 B- ^( W" }" r, m) v+ E3 U' q
# _( q- r3 g# a0 y  k* W" S8 ^
  其中A为位带区地址,n为该字节的第几位。
: z5 t- ^* a% O. C! m) z
' |& c  y" C7 _) ?( |

* m6 C/ w# V# Y1 ?! q3 }       这里再不嫌啰嗦地举一个例子:
) I) }/ n2 a; M/ O' v7 e1 q! T       1. 在地址 0x20000000 处写入 0x3355AACC
$ ]# a/ i0 @$ t       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。' p' H1 ?. F4 g3 P: p5 D$ i/ s
       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。% t8 _1 X; \! b; C% d0 }
       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。
$ t. r* E- L+ u! I. E: d
* q$ n: w$ Z7 i

7 G" T* w/ @. o  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。
3 T2 R1 i' F3 y6 p! D- O/ ~  \6 N! z
! T7 V# g" |- c, e5 {* {7 F; l
* B+ P: D5 p6 [. L6 d- e二、中断$ i, D  U+ _1 A/ u; O
8 w4 A  A' @7 Y* F
+ d8 C0 |1 y/ }9 N- ~
  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。8 o1 ]. ^- R5 y1 |+ o

& \" [/ N$ E/ W
) ^! j. O# c8 c3 k4 n& Q# e( e
部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。; Z0 h6 J, R5 `2 j0 I2 H( B2 k4 ~
( A- Q( m8 q! ~+ m" b) G
" @1 L; D$ G4 _& J4 l+ M  r, U/ ]7 e
  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。9 m5 a9 N2 t( [- a

' \) H3 a8 _4 E% A4 a  ?
7 B' h6 Y' k3 U; b3 M% S
  注:中断和事件的区别:
) Y  y2 i/ b1 Q$ v) {/ [& d0 B8 t) W
+ V/ T0 B! E/ b% F' w
  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。
8 l/ O% }9 H! a0 P' j3 u7 R
, u! b7 V) ~' b" b  w( c/ F* P

9 k4 S- L6 W. \0 w* f: Q$ v" l
- B, _& W' P- A2 m* M

$ R( |* N. y. ], P三、printf重定向' @- p2 O7 M3 v3 W5 A
# j0 o1 J3 H7 F( g: m, A4 R* `

4 I# d7 b6 W) Y) y1 f* U* H. i  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。
3 b$ ~9 N! C+ x1 ~9 L7 L2 S+ N& q0 }+ a0 i2 b" N

. \- M5 \% q( ?5 @四、随机数发生器RNG
+ S. V$ U5 j. N5 S' C% s
4 O# A3 U: K8 j( J6 y

" e2 U4 ^8 y! m5 Z* d& Z- b0 S/ `  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。
9 T& T! k3 u. m& v( \& J3 ~
& ^8 W' U1 S# p- u7 h) {, L8 H五、AD/DA: P# \/ b8 A( X+ X: W6 m

/ G$ O& z& S; g( ~# C
; \7 L! ^) n) i( x( D6 }" v
  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色
  L' m' {1 Q+ W4 @( _2 H7 T2 o9 b0 l' V+ J
' Q$ j2 H% }1 O! q+ K
      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)
1 _; n! C0 t& c' e# @
4 E' m5 J* e* O' X) w

+ V7 Z  H% R- ], i6 N5 _$ Y& E/ ?           STM32F103系列:在56MHz时转换时间为:1μs% d, w: @8 C0 @6 J' v% v! F0 s
& k2 b$ q  `! p) ?: x) d, `

) `( V9 r7 w6 N+ X                                         在72MHz时转换时间为:1.17μs+ A1 y! [! r% X6 {# ?3 Y

7 P5 p4 F0 p0 j
, ^( I. m: k- c  M6 A
      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))
4 I0 z! K( X$ f8 h# K7 F2 a( C# i. F% y3 p, }
  e& t, S$ K9 u2 D! a5 u) P" M
      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)
' h- e' N3 f& Z- q1 ?9 Z
2 R2 X5 S; U  }: w

) q' e: S- X& p$ M9 i      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)
* D# ?0 ~+ o4 V6 n/ p# Q, H( P: I+ }6 O8 K, f- v  v  |
6 X  F' V0 S. ?; }6 ]& x5 I
      5、双重模式(带2个ADC的设备): 8种转换模式
6 P* q" d: p: V" J  M1 i
2 M7 Z" f1 Q- z. t! S: M; L

  d  q4 S& \6 b! M" u      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。
: S3 k$ W5 Y6 A. C# D
1 ?! v  i* B5 m! R6 ]
0 @9 X. |! S8 ~# b) J& S5 ?6 @& _5 L0 A
  其转换步骤如下:0 n+ D5 D/ c! |; X0 p3 R1 ^6 Z9 ~. h! a+ z
使能端口时钟和ADC时钟6 A9 i+ A4 C- ?4 n+ w# y
设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等)
' y& N  _' j( ?, M2 [8 x初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)
; n& Q0 k. X" l) `( K- D开启ADC
% S. V0 Q( G- l+ B; N& I读取ADC转换值
) j5 l: X. j0 }, V/ j
4 ~; J$ Y8 L$ z- F9 J9 B( L2 U  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。
, b4 `- @2 ~4 S5 L: X
, D. v0 Y4 y: t  o+ f
/ j2 S: S2 j, {0 C3 L
  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。+ \9 ~0 R& M2 R( t9 o3 U/ h4 |
+ @% s! W* Z0 e2 @, Y
# Q% d. j& }6 s9 U3 i7 \+ O1 b/ g4 ]
  我们来看看STM32之DAC的Resume(简历简介):) z( }; q- ?: {2 Q+ y+ i' x! h% g7 }

* L. J3 W% c7 U% @/ {6 M5 y$ ^

7 a, H' g* F1 j8 I' |6 K. \   ● 2个DAC转换器:每个转换器对应1个输出通道
( \9 Y9 a$ R% E7 e: V+ o, j$ M3 q$ v- S2 i4 P: z
4 R' C! z5 G. x; [' u
   ● 8位或者12位单调输出
# p2 `' U% d) Z1 L  r" ]2 x. ?/ c+ h! g7 A: j

9 R; B; G0 `  x" p3 _4 F5 b- c' [, ]   ● 12位模式下数据左对齐或者右对齐
; \7 {! y; M' g0 J7 @% F: r  u' D* I" F. N
% b$ b% r6 n$ u4 M
   ● 同步更新功能
, H( f9 r, |3 q& g) u' m4 n  k4 f% J) C: {8 |9 E

0 y9 P0 @2 a5 u   ● 噪声波形生成
( s7 N5 z- ^; L7 c
( w3 j: ?$ W5 m+ c$ Z
1 n8 z1 |: M# @( P) P  I
   ● 三角波形生成' K# H# G& f7 U) c& _

0 V! Q3 c" m6 v2 R3 z2 e/ R

/ Q; O7 o0 m) U3 n, c   ● 双DAC通道同时或者分别转换+ l5 H$ W! u" ?
/ F9 x2 X# K$ a* W

3 L5 ]) t) W" E+ v! D$ n2 g/ g   ● 每个通道都有DMA功能
4 K$ T4 D2 n  q
; h; V, r4 O. R
7 s$ @8 S1 @) J0 V1 o  t, z
   ● 外部触发转换, P* H% X0 Y0 B7 U# H3 c* f
! M1 Z! k' p* }

9 M. ~: m- y6 p( h% ]' K   ● 输入参考电压VREF+   2 J9 L6 Z( \# r( r+ ?4 {2 l

: k2 P+ L/ W  U: `3 T

- B/ [4 E- l# m# @) Z4 b8 O2 J1 i0 s9 e5 B  注:PWM+RC滤波可以模拟DAC的输出方式。0 F! c% B  i+ f( S3 ~+ W$ x- ?

- `1 m6 q. J' f, q

3 `9 |8 D1 k2 L* ]  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:
0 p. M0 ~; l( F
4 n, _0 h5 P" G; l

; e- a+ L5 K7 p        在8位分辨条件下,我们一般要求1次谐波对输出电压的影响不要超过1个位的精度,也就是3.3/256=0.01289V。假设VH为3.3V,VL为0V,那么一次谐波的最大值是2*3.3/π=2.1V,这就要求我们的RC滤波电路提供至少-20lg(2.1/0.01289)=-44dB的衰减。STM32的定时器最快的计数频率是168Mhz,部分定时器只有84MHz,以84M为例,8为分辨率的时候,PWM频率为84M/256=328.125Khz。如果是1阶RC滤波,则要求截止频率为2.07Khz,如果为2阶RC滤波,则要求截止频率为26.14Khz。/ u  h0 O' S' Y$ y: H+ I
! u9 ]5 p5 a* W: |' [

& B  I: K4 Q* J6 p" P+ ?% ?9 i4 f1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;4 v: w' Q/ d, B7 f7 {- V
2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。8 k9 o* q- }' Q1 S3 }
所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。. D1 o' [: A# W
3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。2 H/ j5 j# p* P, X3 s( P
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。
; A9 H; Q, y7 U6 q8 _# L' A, F
7 J# ^5 ^" s5 ~* F. E" \2 b

) f. z  Q# d  o. R2 G  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。3 [- ?8 `" V' ~) u- J0 {
/ [7 d$ q- z; p! l- j
  k" `: F. m$ ^. }
3 x" R8 D6 i# ^- ]3 p& f& ^+ I$ {
六、DMA ) T% Y7 J& a" n

) w) k" s8 o7 }" A* `6 W, F1 _0 P

( C8 c( a: z' U8 }( g  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。8 I. _2 x% ^1 o% ?
4 g% [0 d! o# B

& U2 m& O' c. B2 U: P  O* {: f       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。4 n1 e: }, P1 g* n! \5 h  {2 P0 r9 g
3 z  Q# q+ ~' |0 `; K
' Y4 V* Z' c" E- j6 s0 V8 g$ |
      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。& P( _  s5 c# o, Q( D1 _: L

/ D- G- L) E5 @4 a+ R! I七、高性能计算能力) }# h" `! P4 E0 W, @0 C

4 y. T  V  @3 \% p* i8 j- X% s! l- p% l

( m5 D9 |6 P$ D2 B' }. g  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。
/ t5 g0 Z4 W, [+ Y5 ~
' ~4 `3 r2 n! \$ T2 B$ c/ }9 a  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。: \' D  ~: `' s. U8 f' [
* o+ N- Z+ s% A  v$ h* l$ k

, {1 `. r8 U! k8 [  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。$ p* H/ ?/ b/ R* @6 A' Y
* `) J6 H; D5 \6 J0 B. f8 L+ R

) w1 ~0 W0 b  G+ W% v) x3 n, }
( H& m1 r9 b5 M* w, t八、加密
3 |0 l# s0 E: j) F- U5 ^# b
" m" V1 a0 `& }' G3 m+ |* w4 ~" F
# n: K' X" s. A+ y: A% e) D
  采用加密处理器CRYP,下面是CRYP的结构框图。
7 {: b/ N3 r8 F5 C# Q# R- D0 x' M4 k. M
8 d# }2 I6 @; Q$ o) G% k
  加密算法有AES加解密算法、DES/TDES加解密算法等* Z$ ^2 q( {& R0 L9 n# O, {
' v4 J! }  f8 {& @! |: c
3 s8 V' b; u5 d
九、ART加速2 Q: H: r, U5 N- D

$ k$ Q- Y) ]$ }/ B- @# t

# p9 D/ A. D  p  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。/ `9 C& V+ w5 f4 e- \" _4 a
STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。! G: s! J" N1 F: E) }: G2 g

* b% W0 u0 N& f- A8 D

% Y- |" [  y* w* H& p- ]; \超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。4 j) x: K4 G; F( e* Y0 W

( f# q: n$ k2 q/ j7 I0 t7 }( M2 i. H" k7 K0 x, U  g
  p% d( E. O# V* g2 c
转载自:angengguo7895
' I& e+ k- R# W8 v  c( H: u0 g+ N$ z% g7 {4 {

+ Z3 O! L+ K4 B" ~2 m1 W' i. a8 b6 R如有侵权请联系删除
; }* b9 u6 ^5 I: s5 W% c3 D
1 j2 P. |2 I) B! K2 I3 ], f
/ d% {" `2 y2 e6 o) h0 W3 I9 l+ v0 a
' S. J/ T7 |8 F- D# s* W  {4 e
+ H# v4 R2 X  P1 C
赞 收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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