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

基于stm32内部功能经验分享

[复制链接]
攻城狮Melo 发布时间:2023-5-10 18:44
本文将提到以下内容:" z2 f6 m' a) O9 {3 j8 o1 u

+ g8 H" E% g: _  N" K, D) R

6 D4 F0 e. q4 F7 b9 R+ ?8 A4 E- Y位带操作
7 M, Z* F* D$ }/ |中断6 y. q7 W8 O$ A* X6 J4 `8 D  F
printf重定向
' p! t0 K! n5 M7 w随机数发生器RNG
6 G* P# b7 [, d! L. D% j: E7 GAD/DA5 [7 P  H5 y) p$ _
DMA
7 P+ x$ j: n+ U  P7 x8 c8 C高性能计算能力
2 ?1 R6 z5 l" K: g" y, u; i加密
. ^- _& F6 m) SART加速7 v1 W( {0 m. r8 K! w9 r
3 w+ K+ C; m& w9 G& N. {
7 u6 ^0 E: T+ w1 U

% }* H, P( o& o. S4 P+ H0 z: W- H/ T一、位带操作  {: ^: Y2 M5 V' E- v
  在学习51单片机的时候就使用过位操作,通过关键字sbit对单片机IO口进行位定义。但是stm32没有这样的关键字,而是通过访问位带别名区来实现,即将每个比特位膨胀成一个32位字,通过位带别名区指针指向位带区内容。: D! n7 _7 M! [. r0 \4 I4 f0 R

9 W) x% x  |9 u1 s, M- C! [
) I1 r& w- m" m
  支持位带操作的两个内存区的范围是:) i, G& Y6 S9 Q% E
              0x2000_0000‐0x200F_FFFF(SRAM 区中的最低 1MB)) }1 K# ^/ B7 C0 ^4 S
              0x4000_0000‐0x400F_FFFF(片上外设区中的最低 1MB)
/ c3 g- r( {( Y; e+ Q9 n+ |7 z8 {) A' D

( ^: e  N- x! R. j: F% i      位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)# [" D: ]! m6 [2 M
. a" w, [; h3 m+ a2 X2 l' T

9 ~, `+ |6 j# r4 U6 @  其中A为位带区地址,n为该字节的第几位。
4 N$ z0 W; ?7 y$ C, E( E7 `( V$ j: h  }3 V7 ]! s/ T; q/ Q
4 j- [8 j! V: h) s8 }- V
       这里再不嫌啰嗦地举一个例子:
7 _. \; \2 M8 Z4 D- x       1. 在地址 0x20000000 处写入 0x3355AACC
' z% M# R9 O/ ]/ I       2. 读取地址0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为 1。
1 n8 Z! ]! `# t& y       3. 往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作(原子的),把比特2 清 0。
) J8 E) \4 v$ @* X8 o& c       4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。
) u% F: D! W0 r. h4 h, O8 ?  e' r9 G( v$ `
  A$ a2 ?4 q# A6 U" ^6 O1 n
  注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。0 ^7 {- W5 r  g& V( @( H

% J0 t& a- a' k, y8 L) f' f2 g+ h
% M* W- C  R2 {& J/ d! K# |4 {二、中断3 V/ r7 w  ], ^5 F4 W, o' Y

3 ]  X) e# E3 f7 @/ P/ J- P7 H

3 \! F5 q6 a; p' o$ X5 N- y. H4 d  中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。& o' n& J, u5 @' J- E  D1 F
0 n6 F/ N5 `" ~3 ^) b$ }

9 L6 P8 x7 E" B部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。
& y1 U9 F  f/ r0 F- @! J! t$ h& E4 D+ g* T+ r1 Q

( g5 t2 J- t& Q( x+ v  stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。
9 A3 W( e+ z1 Q8 D7 M) X: j) U, [2 Q! m' x2 o9 @0 D7 Q4 ?

! o2 [+ e' W- n3 ]( A7 X; M  注:中断和事件的区别:- h8 m) o; ~8 Q$ x' }8 w7 P4 \0 J0 u
0 ^3 ?6 V4 q+ z2 j# H, G
$ Y8 L) x; O  E
  可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。: C2 k9 J5 q6 D! S( o& Y
" `$ b% O/ X9 A. f, g
( [: k. {6 c# J+ B* N  _6 j
5 o* k& }$ c' O4 C, Y: J2 j

# D! K+ H+ q# g三、printf重定向  O9 `. k- N" v' \
5 b; p/ g, a( N9 g6 r

' R4 [  k( p( y$ Z/ o$ w1 }  我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。, C, l2 U# H0 b) r
4 E9 U7 ^8 n0 m: r" E

6 h4 M+ N9 \4 M* A" l3 O: m/ F四、随机数发生器RNG
( G& u, ]+ V  u4 G1 m! p7 x  d* M. W3 e; e% t
  g" |  u; U4 @' g
  STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。
& a5 t# z' T$ ^2 F, y6 V2 \# x) Q: L! }7 G
五、AD/DA/ k( Y( j) d$ Y' E
6 f4 g0 }5 q! y0 a) R' y; Q

9 `- b- {- V4 u; t. c, k  STM32的ADC模块,请允许我用如此通俗的语言:普通话  来介绍STM32ADC模块的特色0 D- A' L3 Z6 L' U. r' ~) i
3 a7 U: a6 j. t2 K
/ y1 ~2 Y# Z4 W1 L9 R
      1、1MHz转换速率、12位转换结果(12位、记住这个12位哈、因为2^12=4096 ,也请记住4096哈)8 T) i2 d: p* e& a

$ |1 \) u4 f" M

$ ]% Z( p4 ]  b! d6 \           STM32F103系列:在56MHz时转换时间为:1μs
4 b! B) J% ~9 o" E9 ?; n  F3 T) M* X
: R  c! t4 j& h3 a% O; D% f
; ]2 \6 U2 q' V6 A" Z, q
                                         在72MHz时转换时间为:1.17μs
' ?/ F- m6 ~) N! A4 @0 O
1 p- g; V4 n4 Y5 _

, h% T  V, c3 o- i7 Q      2、转换范围:0~3.3V  (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3))+ J/ `4 I! b3 D

% V3 `4 |7 u% l
8 ^/ i" m( T3 _
      3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀)
5 e& B% u' V3 f  e& @
5 ~  |. Z  V& ^( K: s+ y# b# l
) {* l8 s, {/ ?* @
      4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有)) @) w( Y8 j: j; H" g. n; V
7 D; h% ?4 y+ E8 f. v

$ c2 k% ^& u6 w$ T% R9 J      5、双重模式(带2个ADC的设备): 8种转换模式: a  v( N" W& B0 r# ]
9 e; Z8 c' _% `: y% m$ s

+ i* l/ W$ s9 O. a- ?0 y      6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。
5 W( {0 Y, Z/ N8 s% M& @5 B0 g. F9 u: M2 r

! Y( M8 y) L% A% ^) N5 W& X  其转换步骤如下:
4 d. I& y/ I  t- E2 O+ X使能端口时钟和ADC时钟5 i& D' V! C* Y% ^
设置ADC通道控制器CCR(ADC模式(独立、双重、三重)、输入时钟分频等)
, N$ q. c# ^$ X) j; R& E初始化ADC(分辨率、转换模式(单次、连续)、数据对齐方式等)+ H1 f& o- l* a: t4 v1 Z8 w
开启ADC) ^  f; v9 Z0 v) n: e& l" V# g
读取ADC转换值' d8 F5 Y/ {- O/ ?* A* S

6 ?) h6 S4 L0 R* T  测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。$ P. z3 K" E  D# D
; q7 L+ `8 j) V" C* d: D& d0 E) \& V

; ^% {7 }& f; I+ a  或者把交流信号经(电压跟随器 +  全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用ADC进行测量。4 ?: W- B) ]( V) R- \

" w8 w9 l- |7 K2 o( f

, Z9 l8 z, ~$ h: m) y& z  我们来看看STM32之DAC的Resume(简历简介):
* w/ ]% Q8 i+ s8 B9 [9 o  }0 i* s, P; Y' s" |5 S

% }( @+ W" o0 M* \  D3 b( G/ C, E   ● 2个DAC转换器:每个转换器对应1个输出通道) u0 w2 ?2 k, i4 p" m
2 Z7 X5 d4 d- U' w

* s0 N' O4 z1 z) l1 M, Z   ● 8位或者12位单调输出
4 b* w, [( [0 j7 ?6 B" B& L5 e, Z: G
$ A) P2 z" q* [4 H
   ● 12位模式下数据左对齐或者右对齐; Z3 t# ]3 I3 z8 n& j

2 U3 }  C* ~0 [& p9 K, L

7 j9 j2 ?# v3 }0 w5 D! l3 P; ]4 A   ● 同步更新功能: x4 c/ n5 J7 r

; F4 W6 P4 C, U7 E: m' V
8 ^; q. P) O6 e. n' c8 b, U8 O
   ● 噪声波形生成
+ t" G5 }/ F- _$ P- D( O
) ~. r& f: \* Z, D8 u
# W8 e5 `5 k8 o7 \8 v7 H( X
   ● 三角波形生成
( d2 M3 E' n8 F2 T: H# N  ]2 P: l% f" h- F
3 `+ ~5 i+ [" M  S, A- ]
   ● 双DAC通道同时或者分别转换
; Y0 O. Q$ D+ p  t% T- X- Q3 A# a

# `5 T2 K' A- b   ● 每个通道都有DMA功能9 y: ?* |. }, s) j5 B

0 P  J& E) I/ h$ F0 b3 g  u% R

2 [1 s# [, m& X5 b; S, F   ● 外部触发转换
3 ~: f- G/ R. H+ }" ^
- x( l7 o9 u5 o# ?" ?3 ]
- O: a5 w9 E3 D2 K5 h4 g& n
   ● 输入参考电压VREF+   / r; s( f2 d* }6 K( P  E
) h. r8 F$ w, @6 N9 [9 L; B1 y
0 f  ^/ F( N; _0 p6 }$ I
  注:PWM+RC滤波可以模拟DAC的输出方式。
: R* e5 I" H8 c" G% u: g% e% `7 f) ~+ T' j# Z/ b

! V7 k+ u; c& [( Z& s3 A) y, h- \  在对DAC的输出频率要求不是太高的情况下,我们一般可以采用PWM+二阶RC滤波来模拟DAC,进行输出。PWM的占空比来模拟幅值,二阶RC低通滤波电路用来截止谐波(一般只考虑基波即可),通过直流,具体详情如下:' Y; x. x6 W; `3 j, o
  S2 h+ s" y' O+ V4 j

3 D; L! W" F0 e* ^0 @0 i+ @        在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。2 g4 }7 |) [4 G) P& @

# S' N0 [& f/ e6 q
( `/ c6 y+ i/ f2 R" A+ T  |7 E
1、PWM频率为328.125Khz,那么一次谐波频率就是328.125Khz;  X9 a) E( _0 d! d' F/ F' j
2、1阶RC滤波,幅频特性为:-10lg[1+(f/fp)^2];fp为截止频率。
% ~% x, H, C$ T" K所以对一阶滤波来说,要达到-44dB的衰减,必须-10lg[1+(f/fp)^2]=-44; 得到f/fp=158.486,即fp=328.125/158.486=2.07Khz。
+ E& L& ?. f  r; J/ ~3、2阶RC滤波,幅频特性为:-20lg[1+(f/fp)^2];fp为截止频率。8 p) t; U9 m8 W% Q0 q* D: e
所以对二阶滤波来说,要达到-44dB的衰减,必须-20lg[1+(f/fp)^2]=-44; 得到f/fp=12.549,即fp=328.125/12.549=26.14Khz。
$ G& t, u% X; u1 |( E, N$ f
* B" r- f( o+ Y, M

" f7 k$ s: j: @& _& I0 n* E8 j( u' A  得到截止频率以后,我们可以紧接着求出R、C的值。如下图所示,R35*C68=R36*C69,fp=1/2πRC。
& {2 K9 G" V( d7 ]  h  _% F; w5 |+ Y1 a6 v  b: Z

: w" u2 O3 Q6 L! B
( H( l: L6 z) C8 l9 T0 U六、DMA 
& X9 q' g" I/ ?
. N( r7 b! U' }# \9 u( o& ~$ x

" J) B2 y2 w7 q, n  DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。
% o5 F6 l3 [& h1 b( }0 a( B8 Q0 ?/ W
" I9 E& D/ S: l! N4 Z$ b) c

3 K/ L8 E/ ?: t  ^6 K$ K( p       STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。' o- c8 o% |' H, m& u9 e

8 A5 k; Z) G( O% ~: N& X& [# ]/ i9 S; r
8 s; L7 n+ }) J- N+ ~0 V6 }! g
      DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。
( [0 N! Z  t6 l3 i$ F# a' V" I6 w- x9 \3 z+ R/ f, ?
七、高性能计算能力
  L$ Z1 u3 [8 v3 q- }
# N" T. T( @+ m# Z

. n- P5 J7 I1 f1 i4 Z! K  如下图所示,stm32F4自带DSP处理器,我们可以采用DSP库函数进行浮点运算等计算问题。
& ?8 E* m7 Z' ?( t% R$ a8 W( _! r5 D5 J9 E
  我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。
4 L! V% o$ N4 c, R- d2 F( H6 ?9 |: H. w1 \) k3 u0 r

5 p4 B' m2 v# t/ ?# W  k! q  现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。
9 A2 X% \; Z$ z; D+ S7 o5 v7 H. E- z: N% T) m
/ V, Q* ]& A! y9 I0 f# D4 s( N2 n, x

) B% a/ ~% y, y/ V/ f八、加密
& }2 V0 X; W, T0 L" x( V
9 o# E# ~9 w0 _% }( U. _% G9 _" H

; N1 J" @3 t5 A# E! ]- ?  采用加密处理器CRYP,下面是CRYP的结构框图。
- i$ I# y) _& n+ K( Z$ k" U8 U
  [" r+ r+ u& J% _
, ~/ ?8 K1 B+ R, I
  加密算法有AES加解密算法、DES/TDES加解密算法等; ]3 K" \1 W9 K$ ?& o2 i. ?" K, ^8 m

) d. I8 a0 }9 s
- g# f5 v$ ^+ C# k+ s九、ART加速
4 d% l& i# ]1 M- q' Q5 x+ X; h3 A- Q$ i. k$ L6 k$ l$ L& K4 q

- w3 u& G9 k0 B4 c3 e  由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。$ a: J3 f* `+ y+ W+ F
STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。
% I# o  W6 B+ W( g8 Z8 k6 W; @) w* [2 g5 \8 }$ F7 q

1 I3 @6 P8 H* M1 D超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。4 m2 A/ Q( l* Z0 `/ ]" D

# F0 V9 V- P: z+ [1 u# @: x  {
% }- _3 N. A  B/ i6 Y

! x. s5 c5 s1 m7 N4 L0 Q' Z' g转载自:angengguo78952 f0 I6 @( S" j( L2 T: X

0 U0 V5 x) Y+ }1 b. P) Y$ y: j
9 e8 d2 U# }1 m. V$ B* s9 v
如有侵权请联系删除
7 [8 Q+ z4 A, X1 L, _" D5 w& k2 ^
; V% F$ ^6 S) [- F! N0 W$ q; d3 e7 H$ u! O
# f3 ~% Z4 }& i* t/ X  ~
0 ]* s3 c3 a3 a. J" _9 s
2 h6 ^; g! ]' Z
赞 收藏 评论0 发布时间:2023-5-10 18:44

举报

0个回答

所属标签

相似技术帖

官网相关资源

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