|
本文将提到以下内容: 位带操作 中断 j, b; _; t* t% t, M9 [" ?# S$ B printf重定向! ]" \/ i/ F. t/ C 随机数发生器RNG AD/DA DMA- W0 x* H K, \' C# Z( j) Z 高性能计算能力 }* Z1 D& e4 ^! m 加密 ART加速( c1 T/ [' M0 ?( K9 C& A8 v8 Q+ s X" B " w$ @, |7 h: S$ d 一、位带操作 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) 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 位带别名区地址=(A&0xF0000000)+0x2000000+(A&0xFFFFF)<<5+(n≤2)# b+ o) n; p0 k9 b4 k7 W7 @ 其中A为位带区地址,n为该字节的第几位。 * x" }& j ^! H# o0 `4 }0 D1 w 1 ?+ H* x* r& L; a, m2 s, F9 r: ? 这里再不嫌啰嗦地举一个例子: 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。 4. 现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。% e9 b) v, E" _. [4 S+ O, O ) a! Z0 L9 l9 K- ~ 注:如果用到位带操作,可以把各个引脚进行位带宏定义,封装在一个头文件里,方便使用引脚。. V8 {+ _, `1 i" h . c1 m: R: @5 o- o 二、中断 / f3 O7 Y3 p* t, y2 Y# o5 H 中断其实就是当CPU执行程序时,由于发生了某种随机的事件(外部或内部),引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中段子程序)。下面是中断的示意图。 & n% ^% F( g( N1 v; S 5 U9 A' J9 H, V6 Z! K 部分中断可屏蔽,部分中断不可屏蔽,每个中断通道都具备自己的中断优先级控制字,分别控制抢占优先级和响应优先级。只有当抢占优先级相同时,响应优先级高低决定哪个中断被处理(响应式优先级的高低没法中断正在执行的中断程序)。& \5 A# \" v% h5 J stm32中的NVIC(嵌套向量中断控制器)属于内核的一个外设,控制着芯片的中断相关功能。 $ y( G1 n( [, D# n3 v# Y9 S& x. Z 2 `+ B) y4 J+ y7 Z 注:中断和事件的区别: 1 N" n) ^' U: B {# m: V ~/ v 可以这样简单的认为,事件机制提供了一个完全有硬件自动完成的触发到产生结果的通道,不要软件的参与,降低了CPU的负荷,节省了中断资源,提高了响应速度(硬件总快于软件),是利用硬件来提升CPU芯片处理事件能力的一个有效方法。 , J$ o* Q; D$ \: ^9 d1 I* ~ 三、printf重定向 $ D6 p% X# E* j2 ^% x 0 Z- U1 l8 g/ Y 我们知道C语言中printf函数默认输出设备是显示器,如果要实现在串口或者LCD上显示,必须重定义标准库函数里调用与输出设备相关的函数。一般是在fputc函数里把输出对象改为指向串口或者LCD,这一过程叫做重定向。 ! g3 K6 V/ }4 |% c8 u6 t. X 四、随机数发生器RNG* N# y) B* ~4 d8 A& ?; g1 j STM32F4芯片内部含有一个硬件随机数发生器(RNG),RNG处理器是一个以连续模拟噪声为基础的随机数发生器,提供了一个32位的随机数。使能后,需要检查标志位,判断其是否稳定,稳定后才能使用。 3 m' Y( ^ g" q+ W8 [, ` 五、AD/DA( o h. l1 A5 ?7 ~" r * ?! C( V, f3 p' A0 U' \ STM32的ADC模块,请允许我用如此通俗的语言:普通话 来介绍STM32ADC模块的特色 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 2 D& l+ P; X* n1 C* z1 ] ! f0 B: V. |5 k2 |6 z% I 在72MHz时转换时间为:1.17μs 2、转换范围:0~3.3V (3.3v---->当你需要将采集的数据用电压来显示的话:设你采集的数据为:x[0~4095],此时的计算公式就为:(x / 4096) * 3.3)) : A$ g4 d% g- h6 g. c 3、ADC供电要求:2.4V~3.6 V(可千万别接到 5V 的石榴裙子底下呀) 2 m8 b Q; }5 U8 K! `/ y _3 Q: F! y7 ]3 c7 T 4、ADC输入范围:VREF-≤ VIN ≤VREF+ (VREF+和VREF-只有LQFP100封装才有) 5、双重模式(带2个ADC的设备): 8种转换模式 " V4 z9 j/ o7 }3 _ 6、最多有18个通道:16个外部通道,2个内部通道:连接到温度传感器和内部参考电压(VREFINT = 1.2V)。通道可以分为规则通道和注入通道,其中规则通道组最多有16路,是一种规规矩矩的通道,具有DMA功能,而注入通道组最多有4路,转换过程中可以中断,还可以在规则通道转换过程中插队。. v0 ?4 b% Y' @' v 9 _, L( I/ G9 a9 Z7 J$ I; B 其转换步骤如下:/ 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 读取ADC转换值& N5 K2 D* B) C6 u* L5 R ! `/ t0 o0 r; ?1 ] 测交流电信号要把交流电分压到5V 以内,再把负半周提升到零点以上,用运放做一个加法器(有专用交流电检测用的高精度运放,好像是MCP的),把零点抬高到2.5V,这样最低点也大于零,最高点不超过5V ,再用单片机在交流电一周期内采40个点,存入内存,计算出各离散值的均方根就是交流电的有效值。8 B" V! d" h6 }% | 或者把交流信号经(电压跟随器 + 全波整流 ),将负半周期信号反转到正半轴,得到半波交流信号,再用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" _ ● 2个DAC转换器:每个转换器对应1个输出通道 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 / 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 ~/ _ * s7 \$ `# k% f, _7 [# u+ C8 a ● 噪声波形生成& f2 f! w" {1 Q. M: v) s8 U 7 |& j- w5 U, m6 v& v ● 三角波形生成 % C0 r6 [" W, T" A" i ● 双DAC通道同时或者分别转换 ● 每个通道都有DMA功能 7 D) a. B8 E& y/ U ● 外部触发转换( B0 v+ j. j: _. _2 y8 L 5 l0 q6 q% D V8 w2 x/ x ● 输入参考电压VREF+ % Z/ v6 `$ `' z }- d * y0 i, M6 W3 J 注:PWM+RC滤波可以模拟DAC的输出方式。 ( 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 * 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 + l8 r: o$ C0 H 1 u8 M, B) K, A* V# _6 }( ` DMA,全称为:Direct Memory Access,即直接存储器访问。DMA传输方式无需CPU 直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM 与I/O设备开辟一条直接传送数据的通路,能使CPU 的效率大为提高。 8 v" A3 `/ q& A: i STM32F4中 有两个DMA,每个DMA控制器对应8个数据流,每个数据流又对应8个通道,其映射图如下图所示。DMA挂载的时钟为AHB总线,其时钟为72Mhz,所以可以实现高速数据搬运。( J2 ?0 ~8 k& i U+ {# S $ K- V" t; h( v8 Z; {1 J DMA的结构框图如下图所示,可以看出DMA各数据流需要仲裁优先级,且拥有FIFO先进先出缓存区(解决目标地址和原地址数据宽度不一致的情况)。 % 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库函数进行浮点运算等计算问题。 我们平常所使用的CPU为定点CPU,意思是进行整点数值运算的CPU。当遇到形如1.1+1.1的浮点数运算时,定点CPU就遇到大难题了。对于32位单片机,利用Q化处理能发挥他本身的性能,但是精度和速度仍然不会提高很多。 现在设计出了一个新的CPU,叫做FPU,这个芯片专门处理浮点数的运算,这样处理器就将整点数和浮点数分开来处理,整点数交由定点CPU处理而浮点数交由FPU处理。我们见到过TI的DSP,还有STM32F4系列的带有DSP功能的微控制器。前者笔者没有用过,不作评论,而后者如果需要用到FPU的浮点运算功能,必须要进行一些必要的设置。 - c4 o* E n8 O, f ( S2 E* ]0 r) J 八、加密; t' ^* R! g& H9 G 采用加密处理器CRYP,下面是CRYP的结构框图。 加密算法有AES加解密算法、DES/TDES加解密算法等' w3 p k! V! a# t! b9 b / E) j) v. j' H+ R0 J 九、ART加速$ V3 F# f4 T. Y" x, r 0 G# |, G" ~& |5 R# n' ~ 由于生产工艺的限制,当CPU主频显著提高时,Flash的存取速度却只能处于一个较低的水平。 STM32F4有存储器加速器(ART),可以使 CPU 频率高达 168 MHz 时在闪存中以 0 个等待周期执行程序。其秘密在于,STM32内部的Flash我记得是128bit的。这样每次读取时ART会把后面3条指令放到队列里。而Flash等待为5WS的话,每执行4条指令则必须停一次,再继续执行后4条指令。反正是性能跟同频的X86差不多顶个70%的样子(指Dothan处理器,纯逻辑运算)。 * ^: A( U% O, E2 j w2 s3 g" X4 [8 p 超频我最高测过250MHz,还算比较稳定,结果没出错。再高结果就不对了。 7 P+ \9 F* Q8 k6 [+ h0 i* Z 转载自:angengguo7895 ' 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 & }5 z- c0 A+ t0 J! {/ [7 Q1 a" } 7 x2 E) w, S9 h2 H v9 e8 m4 _ |
【STM32H735G-DK 测评】STM32H735G-DK External Loder 编译和测试
Keil-MDK 在线调试设置断点的高级用法
请教下STM32N6570 怎么把分辨率改成320x240并可以全屏显示
【福利三:逢7发帖赢大礼】想要充分利用STM32H743VI片内的RAM空间(但并不顺利)
基于stm32平台上的IC-MU磁绝对值编码器SPI通讯和码盘数据处理
使用STM32 MCU和MPU连接PDM数字麦克风
分享STM32资料-采用 STM32U031R8 MCU 的 STM32 Nucleo-64 开发板,官方资料,数据手册等资料
HRTIM 指南
使用 STM32 的 DWT 单元监控内存
DAC,COMP,HRTIM Fault 功能的使用
微信公众号
手机版