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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:
* L: Y  I2 p& Z6 y1 f* s( N- p) F+ c6 `# X

0 q6 [+ |/ ~! O! E位带操作
4 L8 B: y& H, d! G) @中断1 g. ~! M: r3 M% B& u: F5 r8 l
printf重定向
& }6 P( M9 C# g5 @( A! @随机数发生器RNG
" Z, o5 W- R+ L3 GAD/DA
$ j+ [: g( Z2 s. C6 X5 H' lDMA
* b. @6 _0 _7 `* u* |$ y( {高性能计算能力
8 t' D9 ]/ X& |# V加密
7 o( n# a8 e6 V0 w$ Y- ?ART加速
9 O. r  ]/ \: Y+ g' ~; Q1 \% d! v0 k0 u, p6 J; V: V9 E
% f4 E7 B; d- q
! M7 L) S" Y* l5 \, Y
一、位带操作
. r$ o0 H* f* K8 p9 h9 y$ ]  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。
9 c5 a, Q$ [, n2 h0 ~: z
1 G7 s7 t6 p. m; ~; J0 Q  s

; G3 r9 Y3 @2 I# k% q  支持位带操作的两个内存区的范围是:: q  V* c: ?! I4 G  L5 R
              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)9 S" A$ V( D' F: t9 y3 j
              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)' q' A0 E) @! @0 T

( @9 q; l" t" ~, o: }
* ]* Z8 c' b  q: ^2 `4 G, h0 e
      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)3 k, ]: `) v. K! K+ w1 {0 f
2 Z9 r6 I3 |- ^, ?4 a7 m. m, `- I: S
9 M2 @6 z2 R  E9 a" S9 Y; u
  其中A为位带区地址,n为该字节的第几位。* Z/ \" }( M; F& i. x7 @

% p# z" q' n# N: ?
/ k# m# g0 H& I6 ?
       这里再不嫌啰嗦地举一个例子:5 `8 f8 u9 J! r& a/ k
       1. 在地址 0x20000000 处写入 0x3355AACC; m6 |% i6 o6 ^0 z' B
       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。0 ?' A* y9 f; c
       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。
6 ^' [* K2 |, {7 m       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。
. [% x/ _% z3 @! B1 o: m- J
1 t( t8 L6 Y# D  K
9 C+ ~1 F4 S" |- }) }3 g! B1 H
  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。
' b% }& ]9 c  E" @& m3 T) S
2 o* D3 k1 Q' A2 F: a/ ^% ~: M; |
二、中断9 o  u- S3 i7 N2 o: t( l

; R/ f: N/ u; X! ], ?

0 J3 Q0 n) V8 _, V1 |9 }  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。
" I; c* W$ L! |. A5 U7 Z; h2 U3 X. j" G

, Q8 D. K# ?8 }! y; p+ J# h部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。
8 L& s7 J3 q. s( p
% C3 x6 o" O# l9 v# c7 C
1 s6 {) f) h$ s" t. z5 Q% R
  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。4 p9 M* @$ {8 B& ]: A
5 Q) Z$ x3 }# P" T( S4 i2 S- N
$ a* E6 H. R; H6 p
  注:中断和事件的区别:3 P" ^! g5 z( X; n$ q7 Y7 [( Q- l" m

+ s. O2 Q* q. E( j
/ N3 p2 R9 n$ n' d: \) \
  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。7 e" p/ N1 r- P, r* x

0 ^9 @' s7 i$ [: [0 A
; Q+ U0 I( G2 r2 o2 \+ q7 A7 T4 A
* T8 q2 J  e) ?6 @& Z. |4 G

( J9 b+ F3 c" A- C三、printf重定向: m  e, ?  O3 Q8 q  W, c( C3 l

, e1 a8 f6 i3 Q
) |$ ]. E2 h$ W7 a( e
  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。
6 o/ B% k. d  B1 ]$ d. _
/ X% Q9 O" O0 T
! X3 q  F1 K  C7 W
四、随机数发生器RNG; B: ?* J  {+ o

1 |2 y' k+ {; u3 r( c

; K& g' q! p$ l$ C2 u, W  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。( c4 ?. Q# W, |( ?
. L5 S0 B4 X+ E) `. N4 R
五、AD/DA4 X1 c# r9 s- A9 B
/ j- u' w7 b. K2 C7 {( Z
" V' k  k0 {& z) }- S7 w" j( X- @4 Z7 j
  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色
+ m- E- L8 Q/ ]2 h; F& f# U% a
! |7 b7 ~. ], l- Q) Y( L* R- I

5 ?( Y8 `% `+ N2 v, s. h      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)
2 J' Y0 A/ P  G0 Y) @* J6 j% N. V# r- R0 X! `

: X( _0 a/ z% }+ r0 K0 G5 c# s' p           STM32F103系列:在56MHz时转换时间为:1μs
) x1 |$ E2 V4 B: q& e
4 m; l, v3 U# q$ B( V
" Y9 |7 A' X6 X% o5 {
                                         在72MHz时转换时间为:1.17μs
3 J, ~' A9 S6 c! `; j" g6 P% a1 Q. m9 M" d9 Q+ T0 z" R
: r: C) ]  a% O# t
      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))( K' s1 z( ]$ k5 Y' N
/ Q8 p- q! Y$ L& c* }% L: H

& `( f, ~( P, s9 M      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)5 {# L# j0 H) Z- p5 |3 {
; |) ^8 H  ~* l! u5 T

1 A* S6 z# p- z4 a3 _/ Q      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)
# z' u9 {( t; h$ g, ?5 P! t& B0 N) p0 V: R- V0 r3 _* ~, U, M
0 Z) j: S/ O$ m9 c
      5、双重模式(带2个ADC的设备): 8种转换模式3 w. l8 F! ]8 N5 ~: F$ S9 }  m

* F5 [7 Y3 X, u8 x: D5 Z3 Q" u

" y+ y3 N2 p' ~! `      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。
" @+ r, t7 j" A$ A1 X1 ?& D0 i% S8 W; J$ X8 l- d2 y
; E* r  |9 D7 g" u7 D) {: K2 Z
  其转换步骤如下:9 G) S5 n; w4 p7 Q) l
使能端口时钟和ADC时钟
/ k7 F: R) J" o& F9 v设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等)7 K7 i. B, O- U/ `+ q& v5 Q  {) q
初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)7 D0 E3 u$ ^/ m0 E2 H* z
开启ADC3 N" b* L! `; [& {1 ?
读取ADC转换值
5 Q4 `5 n; b4 L* i
3 @+ _: {& s* n/ n  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。4 [& z' x* s. z) {8 j
: X: i! ]+ F, p# e( o2 [+ y, m) i. Y. E

9 V& R1 H; I# E* V. l0 v" G; P  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。
& j" J, O0 m7 l$ V. e4 j
8 |( \2 V+ a! v; q8 z  c

) Q( w: U9 o- q7 [, u  我们来看看STM32之DAC的Resume(简历简介):9 [2 `9 \( u. @" E1 F
) G+ j7 X  X% v5 n
& O8 k# [! F( V- Q& S7 R
   ● 2个DAC转换器:每个转换器对应1个输出通道
- P% c" d9 Y, b* C
' H% j8 b; [: {9 {
( M$ ~* J# ]# ^/ ]" H0 q* Z
   ● 8位或者12位单调输出
$ d  U* C( [6 ^) ]7 ~' B
; Z# g2 Y, f" c9 \" a  P
# L: w6 o! I# c+ s  W3 k* S$ i
   ● 12位模式下数据左对齐或者右对齐: M( k2 }. }$ Q9 ^

& `5 p) r* c: ]. H' y
7 ]8 Y8 M9 Q% d7 j, O1 @# j: Q
   ● 同步更新功能
( C* a* p4 @# \3 Y$ X. M" w; i  a: X2 x5 _; H. c2 s
9 T; l; }! [6 d- X; F( a) ~, O
   ● 噪声波形生成
$ j" U# _3 A/ \9 `3 B
+ m% f: d, P5 l! S8 ^# d( r, @
6 C$ E6 E  \+ H' K) F
   ● 三角波形生成+ X% N- c( K8 V% s  n9 U
, ?* m0 _; j" o# ~
( Z3 [5 F. h6 ~* P4 o) g% e
   ● 双DAC通道同时或者分别转换  \# z! S/ o0 z8 w* O
9 ^; _% {' ~+ {8 P

. a4 f: l# w: t# w+ S) Y; I2 q% `   ● 每个通道都有DMA功能! X( w. y8 S0 q/ W# q5 t
/ {6 Q3 t8 Y: m( y, h1 K, d
' h9 a! A4 h" O3 m" Z
   ● 外部触发转换
( `" @. l$ t6 _& q7 r  Y, H3 B0 e; m& L0 ]6 `" `' K  x5 w  E
" q) d8 u, b8 n! z1 G
   ● 输入参考电压VREF+   
) _$ y0 L4 d3 H; t: P2 u# w, @: L$ E. I
& K, M# E) l: v
  注:PWM+RC滤波可以模拟DAC的输出方式。; S- Q9 X1 G3 U3 L% U" ~
# G( ^1 L( ~: Q" x# S$ U6 c, }

* s. a3 m4 [2 |" D4 f  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:- p0 U$ [, N; s2 T: H% k/ {! z
# t6 _6 @% @5 ]4 o
) v4 C: V3 h- X) {: \: I9 B5 u
        在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。5 d+ I7 S6 @8 Y1 b

, t) J1 T8 s2 U4 h# J4 i1 Y

. B2 N" u3 q3 k- o1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;
+ K2 Q3 |; ~: }0 `4 V% B2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。
$ O  o% K0 Y+ j. C所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。. E' B  A# Z' E- d, ?
3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。5 k; G2 O/ X8 ]
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。
! b8 F( j% w1 ^3 E) Q' a2 t: P
- k* t: L- A" T7 a  E9 {/ I5 {( o0 o
6 m1 A5 w4 F) n& w; C; R5 g
  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。: g/ d9 M4 Q) Q6 _1 _
- `( I+ S. z3 R: I5 G$ A
9 r. t- s& p3 W' D6 U
) Y1 S+ ~- H* X3 U/ b: \+ e/ o7 n
六、DMA 
! J5 \0 I; J7 B3 Z0 `- ]# T5 z& V! ?! I$ @2 I6 d7 y
9 k- O6 l! X+ r9 c& F( I
  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。
, }+ l  L- n6 P5 x/ `1 I, X0 U
: ^9 E' r3 U9 ?6 H( c. M

8 L5 A2 O2 g6 r" Q, M0 Q( p* `/ A' P( l       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。2 U# L% w9 p; a

; ?* L) _; N1 R2 P' {  t9 k
/ k6 d. V1 W) Q! k' d% i
      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。
3 ^& Q) p9 _- [7 Q. X" X
; n  {# |* U7 a- y- F$ P" {7 {$ Z七、高性能计算能力/ P, m( t4 p6 Q" A0 }

0 b! {( n1 C/ g& Q- e) j
8 i% S3 s3 b+ o, i- S
  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。) |1 S" `: o! l' x

: q/ a! Q5 k# G  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。
, w$ N5 x8 {" A' q  Q
! v2 G7 r! s6 I$ F& j9 W) W$ [
% x4 T8 H3 i0 ^& L3 k: I
  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
& W* a& c4 T# b4 O" |: p1 ]6 g4 Y% a$ b: e4 k
1 D& v1 M2 i: W6 H
6 r3 q! }1 W. M4 N9 B
八、加密
: V. L6 ?% q5 J) r
& u1 \/ V$ r5 k. C$ I

7 N( D( g0 n, C6 P  A% I  采用加密处理器CRYP,下面是CRYP的结构框图。
% S& c7 A* {" E+ k( [* y; s3 @. ]$ O7 ^4 y5 Y" P' u

. Q  C$ A+ ?2 l, L# P  加密算法有AES加解密算法、DES/TDES加解密算法等
% P" t* }; H. K' [1 V2 U3 A4 D
/ k2 ]2 t9 d: ^" N; |7 l" t) Z3 c" u8 I& A  o
九、ART加速& T7 s  ]5 n1 }/ `; {" s# |
% \; D+ k1 @5 G4 O( o! g! h3 U' h
) m, u8 Y* ^! M. q3 }4 ?% L
  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。1 S, K# Z: {& ~! U# c
STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。
* K' @% [# W* P; X
* w9 N( T; O: _" v
2 p" }, Z8 a* M9 A; a" e
超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。
3 P8 r, S/ \4 q% G. f- P. S( |3 p* m. R. N% {% m& U( a0 Z
0 W4 {3 x9 l3 s) g% w2 i% v
6 D7 Q6 F' a- D5 A0 m( a
转载自:angengguo7895
6 }- w" T, M6 \1 y( d; k5 s) [, @  z! ^- D" p. d. {3 L1 l

1 g: f% u) w+ s5 N" D7 n如有侵权请联系删除! v1 h) V5 l$ x# j% z

3 g- |: R( c7 q' k
) h6 r; E: m, W0 e9 G' k
7 H  ]/ X* w9 ^6 |3 S# ~" Y  c+ F3 ]  T

9 w  c1 _% V. s
赞 收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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