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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:
+ {  P8 S- V6 A+ S3 g0 s0 {" J4 t. q" c

9 d, S0 B2 N; Q2 x) J位带操作& A9 v' b7 B$ _
中断8 Q! Y7 E6 y2 J- y! B5 |; t
printf重定向
8 e& K2 L" L! f& o$ `随机数发生器RNG
2 K+ E7 P1 c9 y) X2 ]3 SAD/DA. O# @! O* ~4 H# X& o& k" P* o) S6 {' ]1 _
DMA
% c  p* P- S( i. A7 ~/ g' w高性能计算能力
1 C7 E  S* q  L9 k8 n' n加密
! X- o" l: ?. t& z- i/ fART加速
( m0 i( C* h& R. V6 L! i: V) Q) B$ E" z" ]6 ]
1 H6 O3 V+ t5 q, ~0 h
5 W  {: h' m/ c" ^5 P
一、位带操作( t# {: ?1 A3 \# W, L. i. i
  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。+ }. a' ^$ k& d/ S3 K6 T% d
$ w, N$ Z8 w/ f% k
; k0 N# ^+ P# E
  支持位带操作的两个内存区的范围是:" q7 [1 t3 m$ J+ C4 P
              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB); f( f# u( q! G
              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)
+ m0 g7 s# I# _, L6 n: _" ^5 d
5 O/ L, K% i4 o7 `. `
# H2 i# m/ {  t9 Q" h  p
      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)
! @' A+ o$ e9 ?8 c; X* T' w6 s; W
* q- t9 V$ ?6 b8 T
+ V4 d) J9 k4 q( Z6 y) M6 k
  其中A为位带区地址,n为该字节的第几位。3 n- x% C$ o$ z3 U% m4 S

3 H1 X7 Y* K/ p5 R4 _% j
& j4 b3 Y  U8 r: W/ ]4 q
       这里再不嫌啰嗦地举一个例子:
7 r1 |" V1 i& x; p5 d' Y$ s       1. 在地址 0x20000000 处写入 0x3355AACC
- ?- M6 s5 x8 F/ a       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。1 T1 b! a  z* ^. u
       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。
" C, ~+ C2 H7 ^: G       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。2 _) O" p9 v* x* {( C

/ _' {2 e* |! n4 O7 }. l: ?
- z1 }6 a$ S0 H* d
  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。
5 v; K1 [8 F# I5 W) ^1 f  U: S9 K6 \- T/ f) ~+ F  K. _; \

# {. l) f3 y3 R* [/ L二、中断4 ^' q+ j, o: k
% G# }- _# b& d5 H" P% \& C1 F6 e

3 G3 o# e! @9 K  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。
' l0 n7 C/ M8 ^& T9 B" I& F* S6 ^2 W3 x3 ?

- |1 R$ o& m; A部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。- _. ~7 z! L, a) r4 W4 S* H

" D7 x0 b. |! m/ {) Z
. Z& ^/ a) E9 u: t) [, t
  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。) W3 H3 J- O5 Y" K0 U
) t, I0 N" o* n' ^* L4 [
# z2 c# B& d2 D2 F* |5 Y0 d: j
  注:中断和事件的区别:* Z* M4 U5 [0 B* s; |9 u
/ K# g" X' ~9 d/ _

9 a, m! |: h. S$ j  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。- f8 \( K8 {; m3 w! {2 N

) s+ f( _9 W% z9 J- r- E7 [

9 N, H( B0 j; y! ?1 R$ S9 P7 ]+ Q, _% Y' r9 ]+ h' ?' s1 w
$ w7 @* G* u7 ?! ]. [& ?
三、printf重定向
3 J" r- H( x! K
* d0 `& i: l) C$ S% ?. h

( ^2 ]. O( i% z& E( `+ M  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。
, {; T+ f5 b- A  v
& f+ {6 P# w8 ]- N! c% e

/ _8 k$ B; _: U  y6 a四、随机数发生器RNG8 M8 p) W' U& ?  D% f3 @8 e0 ?
/ x' C6 d) u6 ^- S
" O! g) u0 c6 I% G- b1 C5 y/ y
  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。
/ j/ p1 B1 _9 }7 d: U8 H
  f, D" W5 d& o* e1 w7 P( k0 H五、AD/DA
7 z1 t/ D8 e1 T' Z+ B: ]4 O% [$ }* U! N" v, N9 q4 e! ?

# Z, W6 [  V! h2 e+ I+ V  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色) }; \! a, K/ C2 D6 B" C

3 _* b, L3 |4 i0 f

8 N3 i. S8 q7 e0 A  E      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)
2 _! ~- G8 P; V9 R- G( i! [3 c) d" G
" p2 T8 g" b1 n
/ y5 [; D- `0 s- R! e/ v
           STM32F103系列:在56MHz时转换时间为:1μs+ U, ^3 B5 s5 R. P6 d

: ~3 k; d' A/ t  ?7 Z& y* {6 J0 U' r' \
! g0 `# d9 _8 H  N. h0 U0 I
                                         在72MHz时转换时间为:1.17μs& l- E) e/ ^0 O$ V8 i9 W5 C

# ^6 l) i2 G2 U$ T" X% M0 H

3 e6 K5 p1 c' }* E  b      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))- I, P0 M0 i$ p3 ?, d' U# m# ]
9 ^0 r( e" [6 y0 c8 ]/ k
$ s5 G9 r3 n% K2 w
      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)
, v; j. v/ s5 M, o: ^2 m# V$ [9 {1 F" r6 A% X% X+ {1 h% W

3 q5 t3 T) N- i; f- D$ }      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有): {: B, K! \% g* `; I

$ a/ T: S7 Q9 o* S* b  p

$ X: V2 k$ R7 B8 F; i& l, [      5、双重模式(带2个ADC的设备): 8种转换模式
, r( }1 c. U3 e) Q9 _# X% m2 ~
- j+ O$ y3 @, ], N

5 l. w3 L- Q& {, N1 ~. r      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。! K# ]% k7 f% x% r
9 |$ }# w+ n" F1 W, `- u

: j8 s' r4 W: i- t  其转换步骤如下:: z% v! A& H1 e+ b+ {
使能端口时钟和ADC时钟* \) d) [. V: b3 h, U: B& v
设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等)
4 ?6 F1 Y1 k3 J" j6 F+ S6 O初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)+ ]! y$ B' o$ s, Q9 i) V
开启ADC! u4 K& _0 u9 h- O9 _
读取ADC转换值
2 P. P. g6 h! W$ u/ S9 Z) h4 r
3 R  l) n6 n% h3 q  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。" R. u. ]- c: p5 s4 X

+ A4 `1 ?) N; [: C3 ]2 Y( {' o: o
* M. f4 e0 |9 z. @
  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。+ s- n" C% _4 R+ T

; A" c9 J/ R8 J
1 K; Y8 w1 u8 v9 c
  我们来看看STM32之DAC的Resume(简历简介):* u0 m/ u! \) J) T, j. x- x4 g1 F

4 t" a4 P! d+ Q! n2 N

% w9 U  t  d& S   ● 2个DAC转换器:每个转换器对应1个输出通道
% q7 ]7 S+ Z3 y: K
& M9 u6 ~( U/ Q% ?6 E# o7 i  o
# H, H2 _  j3 C# X- U4 a
   ● 8位或者12位单调输出
! n+ ^" V5 u! [5 L, Z* p, {
# \. J0 I  E, K8 H5 u
8 K+ j# |  n2 @9 l3 C( v
   ● 12位模式下数据左对齐或者右对齐' T8 x* k& s3 s6 b) a
( C' ?' G% I0 W+ o7 C1 @+ P

' }: o( M6 \1 @' J. z   ● 同步更新功能, h$ Y* ^) I$ n3 V: `

7 P! _4 H3 \0 ^; _$ p9 ~

) Y: o" ^# o# R% d* k   ● 噪声波形生成9 H" v  [  ~, M4 P7 N

- J( Z! k' `+ A. f& P

8 h! p* k5 q+ u- J  n; m   ● 三角波形生成+ `4 p6 E% N! x- _" A

3 K  Q% z& b9 Q/ F  U
( f* W$ p* D0 N! L$ T4 M' u
   ● 双DAC通道同时或者分别转换
$ D+ l- }: p/ p7 w6 O! N
: ~- }: l" j7 X7 M- h% f
- A2 Z# j$ U' y# v1 _
   ● 每个通道都有DMA功能
* D# {/ A3 c' R  z0 S2 O3 l9 {9 O) G2 P6 Q
2 j3 Y& P( N+ A# |
   ● 外部触发转换9 C0 f- [' U" r9 A2 Q2 X( a
; ~- z7 |/ O4 J  |- [
* Z! c0 T$ g9 X* S( Y+ X
   ● 输入参考电压VREF+   
8 P* w6 A5 I. D  Y1 [2 F' z0 |7 W: q0 Q* B0 f: Q) s, O" r

4 U$ ^3 ~, @9 ~7 I8 l  注:PWM+RC滤波可以模拟DAC的输出方式。
  ^; m$ b! L1 E& g& i3 F
% M  Y; s1 X/ Z8 [+ ]8 o
, p: u( T) s+ O0 \* V# K! u
  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:
) s" |! W3 W) h7 z8 O9 ?
- r5 G1 y, J2 w" y8 P

  R  P( ]$ W  ^2 v$ X) o+ F        在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。# F/ m( G# {2 Q, B2 \  L

& x% y4 s6 e; O0 V- w' [  V, C

" Y% ~. X' |( M- s8 L6 g% ?1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;
3 q" x8 B" m' u2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。
+ g' A  X% b; I$ w' v! X所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。
$ S) ]& ~/ }& u$ M" e- A7 v% O* Z3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。5 V0 Q. T$ ~3 J$ K# D( l' a
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。
8 ~& k1 j/ n/ Y7 h, H1 R5 R
- F4 E. u5 ^$ |' K4 ?

* f" b! X- H" `5 y5 W  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。* b0 D1 X; f6 S, ~* u

, T( k- {( J, b+ t# s' X

3 }0 v+ ]9 C4 x+ T  I/ h: n; S; H6 u# h2 j  r+ m
六、DMA 
/ ~5 |5 y$ c1 o6 N' F. F& [3 o' r. G2 U/ p% p% x

3 r3 N4 L' r# i6 o* q  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。
2 G& n! i1 Z8 q+ N% E1 z; J
  p0 Z/ E/ V" R7 F- X) m  Q1 R

  @* h/ M% |, x3 k( V       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。
5 x: }0 n. b* A0 _7 _9 c9 M0 E3 T2 N8 k9 e

" D8 v4 }+ L% c' c% z1 u      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。
$ C, V1 X6 I8 }" Z. J9 O
/ K7 a* j5 q0 G5 H* X+ z七、高性能计算能力
4 T5 m0 C' L( k* t  _
& ?) e! X( y7 L. Y' _  _4 a* b8 D
/ L! c+ ^/ }- G0 w
  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。
5 m  W- c! ~2 ?% ~1 y- o* V" h
/ c; z5 ]: M% |2 n  ~  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。0 [4 c9 C8 e8 ?; i) p
0 `8 G  @0 `8 O: M" f0 w2 ~9 C' q0 z

  C3 N( K8 [4 v) O. X' J( \9 D+ }$ {# }  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
: Z* `( z! F% H( r* z5 O! I( B& j& _$ E# f
6 Q- Y! S( g( ?: N, p3 S5 p

# r3 A& ^" A; F# z八、加密
$ L- L, u  n! L# U5 r8 [( e0 D' O
& r8 C2 l: w) e+ y* Y6 V! a, Z

* B" q5 h7 @3 F4 ~( }1 [  采用加密处理器CRYP,下面是CRYP的结构框图。
) s, |( r! ?9 B$ v. A! K
# ^/ j) A* g( V& k8 a

. _; @# B6 {8 J6 e' h  加密算法有AES加解密算法、DES/TDES加解密算法等
/ \$ t2 X' V9 k% G5 ^, Q1 G  b5 R7 C
+ d; \; ^" A6 j0 R5 _! ^. d. }2 U) J  c2 j
九、ART加速3 Z9 g  h, l7 s2 {

$ ]" l3 ?& p, z5 B6 A8 W

, j. P& X, U& R8 D+ _1 x2 B. t) x  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。7 f' n& A; j5 J
STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。
- o) z8 \) e2 j+ p* N8 n# C! @8 M  ?, q0 H0 v1 U

3 y7 u8 a. G) t7 L! d超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。
6 y6 {  k0 X3 a- V3 u
% X9 B& J3 m1 ?8 H/ |
; W" ]7 I% F# |: O
0 o; n6 C$ M: w% B9 D
转载自:angengguo7895
3 Y7 H- `: j- k7 K; ]0 p; {# V4 v' L& h4 N1 @3 s" d' ]
( z2 g+ u% G: x
如有侵权请联系删除+ q9 e: m- ]2 K% V! i: K4 ^4 `+ Y1 ^
5 M+ s$ ^1 V/ t7 h" i5 N1 j6 v

# W0 t) L2 U0 Z
2 H2 a9 A  ]! E2 k0 `  k. S2 s
% q$ ?9 b& D( Z; _5 y4 Q9 K7 H" ^( R
  H; x: m7 K. c6 f! `- e
收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版