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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:
" M% D5 T* F8 ~/ N
& e2 t! S: I! C2 B, {

: A& _$ Y5 ]# t" T位带操作
3 H) x+ s$ v" S! r2 M; w. I3 c中断  j, b; _; t* t% t, M9 [" ?# S$ B
printf重定向! ]" \/ i/ F. t/ C
随机数发生器RNG
0 H; e6 Z% X$ k/ |) V- a$ VAD/DA
( S$ X. h; J  X2 |' r6 SDMA- W0 x* H  K, \' C# Z( j) Z
高性能计算能力  }* Z1 D& e4 ^! m
加密
( I  P' s$ ^  b4 l/ j" H% PART加速( c1 T/ [' M0 ?( K9 C& A8 v8 Q+ s  X" B

8 B4 u& A" d0 X7 `( U# T$ ^8 o
" w$ @, |7 h: S$ d

) y4 |/ V. j" t* r' S一、位带操作  n0 s& H/ V* H8 k) I
  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。( ]2 A2 o  @; p! `. ]
$ R, b; e+ Z! a! z1 X
. G) G1 B- j3 L
  支持位带操作的两个内存区的范围是:: k3 o; e  H: H3 j: `
              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)
' f+ U2 ]9 _5 k3 e3 S8 g4 R- ]- Q              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB), s' i0 U: e4 V- b9 t# E+ y3 m
: C, N! N$ t% Z# i( ?' I7 s# l0 S) Y* S

/ X6 M; k9 Z2 e0 w$ e      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)# b+ o) n; p0 k9 b4 k7 W7 @

/ M1 j( Q  `8 |% P4 k0 C

/ Z1 H/ \* B; C2 l! w  其中A为位带区地址,n为该字节的第几位。
9 Y4 K( l/ n% e. t" w* x" }& j  ^! H# o0 `4 }0 D1 w
1 ?+ H* x* r& L; a, m2 s, F9 r: ?
       这里再不嫌啰嗦地举一个例子:
" s! W/ d8 g; C4 }' q$ u       1. 在地址 0x20000000 处写入 0x3355AACC: v( _8 [2 [! x0 _9 m* [
       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。/ ^7 |& a: d! b8 `; l
       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。
- S/ N4 E0 [9 w0 ~       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。% e9 b) v, E" _. [4 S+ O, O

. j# i, h% r2 J6 {" v# e
) a! Z0 L9 l9 K- ~
  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。. V8 {+ _, `1 i" h
. c1 m: R: @5 o- o

$ r+ _' @( k( V4 h2 y二、中断
* j) {- a: S% S
0 {) p( z6 N8 T# I- w( O( W
/ f3 O7 Y3 p* t, y2 Y# o5 H
  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。
% p# {. e; R* O& n% ^% F( g( N1 v; S
5 U9 A' J9 H, V6 Z! K
部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。& \5 A# \" v% h5 J

1 o& \4 p. R3 Y# n& y  {- a

9 X9 v( P% f4 i# g1 a+ X- j" z' O  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。
( k* o, P4 H' V" o0 G$ y( G1 n( [, D# n3 v# Y9 S& x. Z
2 `+ B) y4 J+ y7 Z
  注:中断和事件的区别:
4 o' K% y2 g% ]9 q/ @, A1 N" n) ^' U: B  {# m: V  ~/ v

6 F, ~6 M# _0 O  v  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。
. [/ p$ Q+ Q: z4 n, J$ o* Q; D$ \: ^9 d1 I* ~

7 ]) O. k  y7 G+ J
* Q& f8 z* h+ F  P4 X

0 t& I. s6 _+ p三、printf重定向
! u* g/ G5 j' N( Y0 K$ D6 p% X# E* j2 ^% x
0 Z- U1 l8 g/ Y
  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。
# Q5 L  n# Q" k( Z
. Q! `- w/ j' l
! g3 K6 V/ }4 |% c8 u6 t. X
四、随机数发生器RNG* N# y) B* ~4 d8 A& ?; g1 j

% J0 A& _5 M. @3 x

8 P# n. n: [4 f( {5 d2 n  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。
' K: v1 [9 i$ z* ~: O3 m' Y( ^  g" q+ W8 [, `
五、AD/DA( o  h. l1 A5 ?7 ~" r

2 r. l' u8 S$ }* k. }. C
* ?! C( V, f3 p' A0 U' \
  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色
7 ^4 c: _* W2 ~! v, d" l
% j# f. [9 W$ M. ?6 j
1 \& G( ^( `( J* v0 s8 V
      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)2 U' ~3 i; ?3 Z- h/ {" N
$ j# _! m) |1 H. X0 M' }- Z! f
3 A0 V' c9 H- d4 U, G
           STM32F103系列:在56MHz时转换时间为:1μs
' o+ w5 I& |3 l) v$ \2 D& l+ P; X* n1 C* z1 ]
! f0 B: V. |5 k2 |6 z% I
                                         在72MHz时转换时间为:1.17μs
8 K* x9 }5 Y, t. d6 ^2 c* S
- I) c; a0 Z9 L7 U/ k

. K9 U5 s/ ?; p  q, r: Q( W      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))
* G) O3 b6 U% B) B( u. F
& w; [, }/ e8 ~7 i+ T. X: a$ K1 d5 d6 A
: A$ g4 d% g- h6 g. c
      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)
: U1 L0 ?% H- O; v( \0 r* \2 m8 b  Q; }5 U8 K! `/ y
  _3 Q: F! y7 ]3 c7 T
      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)
4 a. P* O1 V' r  K: ^
& u5 N/ a4 c! V: i& t2 Y5 Z( X, @  \

3 T  B1 `  _; l8 x# M      5、双重模式(带2个ADC的设备): 8种转换模式
. L8 D: e& V) u+ J" V4 z9 j/ o7 }3 _

  ~2 O- M2 R% b- V  _      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。. v0 ?4 b% Y' @' v
9 _, L( I/ G9 a9 Z7 J$ I; B

% Y2 t" Y2 N; d6 l' @  S" m5 S  其转换步骤如下:/ I6 s" K5 _- e: V5 V+ B
使能端口时钟和ADC时钟) _# j- Z& g, T
设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等); s2 L. X- A6 \
初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)% D2 h7 s$ T4 C5 F
开启ADC
- d5 F: N  Z7 Q0 P7 ?: D0 |/ U读取ADC转换值& N5 K2 D* B) C6 u* L5 R
! `/ t0 o0 r; ?1 ]
  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。8 B" V! d" h6 }% |

( B" ?; O( a% i

9 \9 \7 B. b5 B7 B7 [, r5 a  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。5 e  `' T& i; K5 W* o
' N4 W- G  I4 k0 D$ y" s5 r
  H0 M( x; B3 j, u! x
  我们来看看STM32之DAC的Resume(简历简介):5 P. _! U0 M/ u
6 {- o. D. @9 n0 |) s, a" _

0 i% R+ `# z5 q6 l' ^2 W   ● 2个DAC转换器:每个转换器对应1个输出通道
9 m6 M! \8 J5 T' `6 o: _0 |, ]+ e$ {9 D, x0 m7 V
" R5 u; B9 B" h1 z" C. P2 i
   ● 8位或者12位单调输出/ \3 S2 v0 w! s' V1 \$ v, F+ S, S

& H! Q! w9 }2 j3 V
/ g* H3 X3 j' u# _- I9 V
   ● 12位模式下数据左对齐或者右对齐; X# ~' ~  R7 w9 ~8 N
- e$ P# v- B7 F$ I2 u* |) k! j
3 u% V; s1 z  w0 A  }
   ● 同步更新功能0 \- i6 L, }8 z; l8 n9 ~/ _

/ |! P, S+ [3 D
* s7 \$ `# k% f, _7 [# u+ C8 a
   ● 噪声波形生成& f2 f! w" {1 Q. M: v) s8 U

! s7 u3 _, y- y! P" h, g
7 |& j- w5 U, m6 v& v
   ● 三角波形生成
5 C; W( b# A7 {9 L! m5 H% ?
+ d6 Y9 ?" l5 k1 \* Y
% C0 r6 [" W, T" A" i
   ● 双DAC通道同时或者分别转换
/ r& y! ]& ]2 q2 K3 r- d* z! o+ C
' V$ s% |% V1 T' w4 ?

2 @" s/ b! D3 z3 L3 y   ● 每个通道都有DMA功能
. P4 b. i( {6 p4 z
" w* X( a; j( @" E( g
7 D) a. B8 E& y/ U
   ● 外部触发转换( B0 v+ j. j: _. _2 y8 L

  b. u) m6 R, d# _) P. T: k  t7 l
5 l0 q6 q% D  V8 w2 x/ x
   ● 输入参考电压VREF+   
/ b+ E; M5 z& l  \% u1 z+ L- }+ J% Z/ v6 `$ `' z  }- d
* y0 i, M6 W3 J
  注:PWM+RC滤波可以模拟DAC的输出方式。
( ^) V3 _% N! r6 R3 _; s( S$ Q, P' `- c( |! {3 l- ]9 W' W9 }
6 g! t/ q# |% X, x% Y! S% d
  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:2 S, z7 U  r3 z) D, r
7 V$ c- S# X* m7 g: u/ ]% K
  ]6 e  R1 ~; p0 y' w% Z7 p' S, \
        在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。$ h- Q8 x7 v! ~) |8 H
% ]: l  l5 s' a  T
$ A4 m- X% `/ X* k9 E# I  T
1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;6 V& D9 \: ]/ I: S& ~
2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。0 R0 q# ^( O3 ]+ W: _4 _' i
所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。: ?* i, K3 T1 p" \: Q2 g
3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。+ w/ G" p2 h/ G# E
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。6 _, x$ D: L, Z0 z* c' z  T

3 w, t7 ?) H3 L8 i1 |2 Q5 k* x
* e; G* m! z$ K6 M/ Z% e! U( e/ u
  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。+ |: w# G0 R6 i( s/ u
" B5 G0 b9 k0 ]7 C
) a8 j. w/ m- I( H& a  K0 G8 I: g
  `. z: C7 C' D6 D* H, e6 O
六、DMA 
5 [* N; R2 D& m+ l8 r: o$ C0 H
1 u8 M, B) K, A* V# _6 }( `
  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。
/ @0 b4 K* x3 g! x7 H4 A' s# O4 i( h* V
9 B9 l6 M# T/ r3 f# \
8 v" A3 `/ q& A: i
       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。( J2 ?0 ~8 k& i  U+ {# S

. L. r& m% V# E% ~& M0 y
$ K- V" t; h( v8 Z; {1 J
      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。
) K3 p% ?0 U. R- x2 ]% Z1 N; w1 Y) }- ^( E$ a/ |, K
七、高性能计算能力( }+ h. f/ y, V4 z7 k% X
# e2 j4 k. ^/ @2 @
, v, y/ C3 R* n( j  J5 Q' u( X: R
  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。
- D1 e! X$ o  H1 F3 m! v2 O# y- r
/ B0 P- ?; _) x  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。
4 z, X$ ^7 o" \
/ s& B/ n# O5 B& V

2 Q4 z6 c5 J/ b2 }, ^- |6 i  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
" F' }: ~0 Z. e, N0 S) c( m
) y/ [/ K: Z( T) T# G
- c4 o* E  n8 O, f
( S2 E* ]0 r) J
八、加密; t' ^* R! g& H9 G

2 j2 k1 K! U0 F- u& c* Q

" |0 S1 r+ |3 e. v  采用加密处理器CRYP,下面是CRYP的结构框图。
5 P% H) @( H) x0 ^* z
1 E8 R3 y+ W- ]! g5 z. q

0 L# B* S( e+ F7 ]9 U2 `  加密算法有AES加解密算法、DES/TDES加解密算法等' w3 p  k! V! a# t! b9 b

9 ]6 i  K8 M9 u6 A% Y% H# V: ]3 J/ E) j) v. j' H+ R0 J
九、ART加速$ V3 F# f4 T. Y" x, r

5 ^  {  \+ u( M; X3 t
0 G# |, G" ~& |5 R# n' ~
  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。
- M  v$ @& D6 K/ XSTM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。
- S/ [$ D( v8 o7 r! P+ g8 @* ^: A( U% O, E2 j  w2 s3 g" X4 [8 p

" W# \4 t' p8 L2 w超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。
. t3 n5 t6 [8 `9 T- x* j
+ s8 Y& Z: |: J6 U9 J# h5 Y7 P+ \9 F* Q8 k6 [+ h0 i* Z

1 A  s% e8 s8 s/ q5 k3 K转载自:angengguo7895
7 e! I5 f0 L& |& v' O0 R* l6 ?' U9 d- Y6 B
, l, ?8 |9 o7 @# M2 |2 y
如有侵权请联系删除  {7 H. ?6 s* t" w1 f* x5 ]2 y! v

0 B8 ?5 X" d, U, t
7 ]8 M4 m& g+ T) W& }5 z- c0 A+ t0 J! {/ [7 Q1 a" }

! G7 o7 [" f+ i7 x2 E) w, S9 h2 H  v9 e8 m4 _
收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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