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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:- `) F3 I) R+ A! N5 r
9 g$ h6 Z6 u& r
( x. g! N$ R2 V( V
位带操作' p$ r3 g2 z8 b( |
中断
* U- S( M4 o$ ?; {printf重定向
$ m# ?% N8 z# G4 P随机数发生器RNG8 m) b2 l& b" @( d
AD/DA
2 y+ p& E5 e0 b- \8 pDMA
" Z; n) O: y) A: a高性能计算能力
4 T* o0 P/ F7 u) U7 ?5 Q$ l加密
+ e- B0 d3 o: q5 f: iART加速& a( V. q3 N/ Z/ R3 P2 I  S

8 ?. \1 `( [  B* Y
- n' t0 Y' l' j/ C7 h' {7 l

) K$ F. j' n, Q1 B4 {一、位带操作
3 p- b' ~  d; @" v  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。
0 b. t& n4 ]. d( }0 B% N  N
8 B8 @6 M1 z+ h0 W
! `* t: J4 }5 M# |6 F% W
  支持位带操作的两个内存区的范围是:! p7 M& t# f. s) J0 }
              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)# @% ]* x" R: O( G. \. \. q
              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)6 R; R+ t2 K: M, g8 z$ Z3 d& l
& ?# M2 I, f) G8 m
3 f! v1 G% C- a% w
      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)1 S* E( k+ F" L. E7 z) }
  K( @6 y8 f; W5 Z4 c1 l

0 T8 ?; r1 N, u; @4 _3 E! D  其中A为位带区地址,n为该字节的第几位。
& x" s4 O  K) v4 B" v
# u4 U1 l- {, c  q7 \8 u; q# }5 t
3 X: ]3 b  F) H
       这里再不嫌啰嗦地举一个例子:2 L& @& y7 v) u6 @
       1. 在地址 0x20000000 处写入 0x3355AACC/ z+ r+ z- Y/ B1 i$ @% @
       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。
& F% p, m  u2 L9 N% }       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。; l* g, m" G% O) U' q
       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。
* ]  E1 L" P# F( L* d; `9 k; B" e8 o, _( {& P2 q$ [4 z

& p9 Y6 s. U% x# `. O. e4 e  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。
  U. \; k9 i* @7 D. m2 m
" A7 u% o4 a6 D/ j- e/ \
7 t; x7 `6 W" X二、中断0 h6 J, d% @/ q& X) {. h. F

. j3 L9 M  k+ v6 T, M, `

6 }# l7 V$ L# M/ b8 P  n, [7 h; L  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。/ T; z# Q1 J; W: }- A! N* e+ Z
0 g& U9 Y8 T2 L* y' |
( R: p: f* h" l! o9 U& u+ r
部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。6 v2 E! D7 L4 A4 d6 t& d! }

1 K, a/ S& m3 E- c8 f* g
, ?) @2 n$ P6 x9 D" b4 Y5 j
  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。
9 D1 ?. B- [% j. X6 V) ]
, a) I: s. o' P
- A9 o* n, ]) d! E$ o
  注:中断和事件的区别:
, p. l: F$ d1 Q0 O; }
  E- m3 U2 p- b- c9 ^  R# Y! z0 s$ X

$ U# o& J6 p8 f' i( a  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。
- o2 U8 k, e9 T
( R" O; o) o3 Z; P! \
# h7 T5 J$ ?2 \6 j0 d! H
9 r' S$ X: b8 W  A- k1 y! [, J/ {

! I! j, h& U  ]3 Y4 ^( K三、printf重定向8 L" `3 b0 _6 P
) Q, q1 M7 F8 L0 z' O

+ J  |( i1 G" u: C& y  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。% _$ K( y+ D3 S' ^, p" f; h5 z

" W2 C& `5 y; z& A- H' U/ O

# l' B  \+ I" S1 z" c9 K7 d; o四、随机数发生器RNG
  c; w0 F9 l4 [+ K2 m% Q  k0 H7 r* @+ H! R

0 }$ Z; G' U* V. o  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。
/ M6 c9 J. h( z& p. y( F, U$ ~& ]* _! S# t+ J5 `2 i+ m' j9 P8 h2 v
五、AD/DA- P1 d2 {. o. ^* Z) m; b
# E9 G( q0 f3 T3 O* o0 u
- `7 V. U6 P8 u* X6 [, V5 C  M+ y
  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色: y. I+ R. F1 c0 {+ F
; }+ n, R" ~; s8 C( j' I
5 N4 B- y- G9 ^* `' L
      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)
) i! C- A+ M( c  Z5 [: H4 K1 c5 M
- U/ U7 M! L+ x! X
           STM32F103系列:在56MHz时转换时间为:1μs( C9 U3 {4 j+ P- b+ {( e; E8 J

& u. E7 d2 Q# T" c" E

6 E+ r* Q+ H: `/ x                                         在72MHz时转换时间为:1.17μs7 V0 z4 E2 a" z9 f

& ~& x) Q: ^% a! m3 `9 D5 J/ V
1 J- K# y3 Z6 H2 S! y6 y5 T% ?
      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))% s( e! C( |: U; ~0 u2 D* J
8 G- k/ E! Z6 h$ Z# h" z. h0 w; H
; ?* r' L- \' K
      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)! {/ I- ?, T, X2 {- f

- R2 H; K9 i& K; w8 ~/ I+ u
3 P" [' x& g" \8 E: r3 t
      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)& p: |; N3 |2 X

# p/ ?2 E( t0 a
$ ]- c9 M, y, {6 Z: j, K$ |# ?
      5、双重模式(带2个ADC的设备): 8种转换模式  c0 ^5 L+ ?- |+ e. D! K( l

' _" Y& j4 \" H3 n

( q9 {8 P* j$ z      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。
6 q% i/ G. I6 D. y& i( [6 Q6 l+ [1 c( o6 c
1 F8 D2 q+ ]$ s+ g& z, r
  其转换步骤如下:  y6 J! N/ I; o) n6 u# s& o+ s
使能端口时钟和ADC时钟+ Z0 Y0 D# F+ C1 c
设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等)
% \, D2 K8 P7 t9 L初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)4 a4 y" _1 {) L! \! d  Z
开启ADC. U: M& z  N  b, ~9 K1 m
读取ADC转换值6 s7 v0 I* F5 F  q  X

0 O9 O2 d; h) _( X+ ^* `* H( {; H  d  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。
/ Q/ |& X# s' M; H  ^: h* x% k* M; l* k3 v- I5 f6 U

0 N. T- r! U4 m& H7 E1 t0 p! R# V  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。
( Q/ \) H7 \/ ^* B8 w9 Z0 X0 z- H8 _8 [1 w- h
; a: }* F6 T+ z8 B! a4 ]
  我们来看看STM32之DAC的Resume(简历简介):+ P0 c8 m5 P& ~9 t, d
1 [9 }/ d3 c4 {2 G3 s
  R$ l, f6 A) ]. S9 t& L' y
   ● 2个DAC转换器:每个转换器对应1个输出通道( @# ]7 c7 P4 i: T6 |6 c
' |. q4 O' l/ V! q
6 ^0 U8 X1 z$ J5 c8 n2 w
   ● 8位或者12位单调输出
, x$ G7 N' `: ^) A8 O" y
, v  [2 X/ u6 _
5 L9 d. p. g' C/ ]0 _
   ● 12位模式下数据左对齐或者右对齐1 H. H. I: ~: f6 X  X: P# O3 f: `

7 u6 Y7 |  c7 m+ m

: Q9 D" m2 v: G8 P   ● 同步更新功能1 P. L9 G1 y% X+ V% P! x
- e/ N- G( O  E. i2 y
; |. G3 }1 C" {9 G
   ● 噪声波形生成$ H7 q" m/ x8 Q# I1 U( J: d
' n" M& \3 w$ v7 o

4 ~' B) L! W  z   ● 三角波形生成
5 W; n# a' Q; ^/ o! A& ^& b
1 t0 t2 `' ?) a# R7 S0 e: U  r

/ s  Y3 V) R( ^) d1 n8 C5 [   ● 双DAC通道同时或者分别转换8 C  K& U0 d- b9 K% B

3 {) G! Y1 s# Z2 q$ _, r

: {# A% r( \: j$ ~   ● 每个通道都有DMA功能. a' g. e! {, j7 m; a6 O0 ~

# u6 x9 @$ T  h; U* R! B4 @
  F  C+ m$ u" ]) x
   ● 外部触发转换) c5 L2 l6 @+ K" k
4 B' T) p, L3 I
+ P/ @* D$ J  o" n: o' V
   ● 输入参考电压VREF+   
. u3 s6 Y$ y* C3 v2 }& B
6 q, N! K% |. a* n/ y7 A) L, h

2 }8 o8 r* c& V6 x$ R/ e1 @7 O  注:PWM+RC滤波可以模拟DAC的输出方式。
* c5 y! v, o8 @: l( W8 ?) a; |; }/ N8 s% D+ ?9 a9 g

& S+ u$ V4 H* b3 f  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:
: x; ]$ g  k. L/ t
8 e' L7 u" v" B

4 @0 a$ n/ [9 B. q) t% M5 o; v# k4 b        在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。; n% u% t9 G5 P) `% l$ I" q

" T' m( _5 D9 F, E! ?! J

0 H. Q4 d6 l9 J8 E# N: F8 \/ q1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;7 j5 ?; N1 e( D, p( P* p& r7 l
2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。
0 |2 Y6 S( O3 N7 j- m所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。
6 y7 y' a  I" J* H: G! a3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。  f/ ]$ u7 g" o
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。1 H' n" T, c, Y
) l" Q* Z+ d/ q2 _$ g8 u9 a' t
) W5 V& g( x2 N/ c
  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。
4 M  z$ z: G) @0 n( J. _  E. Y  @! k1 E1 E( L: v7 P* p
- ]* W3 E2 V+ N5 n

9 ~1 ~7 K0 x0 F+ n  _六、DMA 
' Z3 K7 e( ?3 x' N/ k! T3 A
  P; |* k1 A' [; O

2 p. P  P& t" Y+ N8 ~8 E  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。( V* `2 S. e: o' g% G4 k

* m6 r- E; U1 p% d6 A! L0 U+ a& ~
& ~1 {+ o: Q8 W. `  Z* j
       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。. [( T" e; Q2 n7 i/ p# `

, m* Q2 B+ h! W$ ]

1 A7 k$ @% k2 t" u5 w      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。
! Q: `( s* y4 b4 c6 S# ]9 W/ j1 s9 O1 T9 C# K! e. i
七、高性能计算能力  I- \) W( s* L$ F
2 D+ }. `+ \7 O: N9 B& E
- \& x# W  A* f+ J( ?, y  a
  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。
: ~9 H4 B$ z2 G" _8 e
8 u( f0 Y. Y; w9 a4 q5 u6 }  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。
- w6 P; D1 ?" O8 a% l8 |' `3 Z# E6 F
# m. Z: b, ^* J& |
  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
2 k% w2 N, i$ `; w7 W' Y6 ^- w- q4 q( Q9 a$ w2 \9 q; Z

7 r/ e" Z* X9 c3 C6 w: x% O0 B1 I8 X- v6 T3 O! M
八、加密( M/ Y$ c" w, }9 }- s3 z: T) v
$ {  d3 H. f6 v% _' L
* N5 N1 B6 ^8 h$ G. x
  采用加密处理器CRYP,下面是CRYP的结构框图。9 W( j+ S2 [$ y4 n* w
, G* Q  ^. g# W& A
# B/ l% H+ A" J; r6 `& d, s
  加密算法有AES加解密算法、DES/TDES加解密算法等
! z/ \, ~$ u/ D) T
3 E# B/ J; e3 T: n
' C- B! N# ]1 o: q九、ART加速
) J5 [& U2 b: n3 D# ^: P: O4 h' Z" \% Z6 {& r: `

9 d7 B2 J3 c$ X* U- u* B3 W' k7 C  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。1 f! i7 x+ i# Y% v' E
STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。, M- W( j3 _8 M
5 y3 j6 u3 Q. s* k( S1 g1 D7 _

" A- d! Z, Y; i超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。# a' f5 L9 q( r$ c8 I: l& L0 u/ g

! Y3 d7 D" l0 V! `1 S% N. ^
; K4 E# x& o) H4 t

9 c% h; Q2 g6 g转载自:angengguo7895
6 I4 h# @; Z$ X
3 E4 W8 F  F& J2 s5 ]

  l& r* X( j5 w, j如有侵权请联系删除
* R4 E3 I+ K1 R6 B8 E6 B4 i: ], @& w( U9 L7 N: k) t
2 `" ?6 X, Z/ a
. U, n# Z3 b) J' V* e
# p: _7 T! y& f9 M* V$ J
* S9 U5 M5 {! Z, k; C
收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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