STM32硬件关键设计精华集锦
如何保证ADC精度之STM32的ADC
共有最多3个ADC模块,最多21个ADC输入通道
特性
12位分辨率
自校准
转换结束,注入转换结束和发生模拟看门狗事件时产生中断
带内嵌数据一致的数据对齐
非常丰富的操作模式
双重模式(带2个或以上ADC的器件)
ADC转换时间:
1μs:ADC时钟为14MHz时达到最快
14个时钟周期,转换周期可调:14、20、26、41、54、68、84、252
ADC供电要求:2.4V~3.6V
ADC输入范围:VREF-≤VIN≤VREF+
规则通道转换期间有DMA请求产生
模拟看门狗
ADC输入通道映射
STM32的双ADC操作模式
ADC的误差种类
(1) 理想ADC转换曲线
(2) 实际ADC转换曲线
(3) 实际ADC两终点连线
ET 总误差:实际ADC转换曲线与理想曲线间的最 大偏离
EO 偏移误差:实际转换曲 线上第一次跃迁与理想 曲线中第一次跃迁之差
EG 增益误差:实际转换曲 线上最后一次跃迁与理 想曲线中最后一次跃迁 之差
ED 微分线性误差:实际转 换曲线上步距与理想步 距(1LSB)之差
EL 积分线性误差:实际转 换曲线与终点曲线间最 大偏离
消除影响ADC精度的因素(1)
1、ADC模块自身的误差
积分线性误差(ILE)和微分线性误差(DLE)依赖于ADC模块的设计,校准它们是困难的。进行多次转换再做平均可以减小它们的影响。偏移和增益误差可以简单地使用ADC模块的自校准功能补偿。
2、电源噪声,尤其是开关电源(SMPS)的高频噪声
线性稳压器具有较好的输出。强烈建议在整流输出端连接滤波电容。如果使用开关型电源,建议使用一个线性稳压器为模拟部分供电。建议在电源线和地 线之间连接具有良好高频特性的电容,即在靠近电源一端应放置一个0.1μF和一个1~10μF的电容。每一对VDD和VSS管脚都需要使用单独的去藕电 容。VDDA管脚必须连接到2个外部的去藕电容器(10nF瓷介电容+1μF的钽电容或瓷介电容)对于100脚和144脚封装的产品,可以在VREF+上 连接一个外部的ADC的参考输入电压,从而改善对输入低电压的精度。
消除影响ADC精度的因素(2)
消除影响ADC精度的因素(3)
1、电源输出不稳,随负载变化
ADC模块使用VREF+或VDDA作为模拟参考,数字数值的输出是这个参考电压与模拟输入信号的比值,VREF+必须在各种负载情况下保持稳定。可以使用诸如LM236作为VREF+的参考电压,这是一个2.5V的电压参考二极管
2、模拟输入信号的噪声
平均值方法:适合处理不频繁变化的模拟输入信号,增加一个外部滤波器消除高频噪声。
3、将最大的信号幅度与ADC动态范围匹配
选择参考电压(仅适合于具有VREF+引脚的产品),使用一个外部的前级放大器。
4、I/O引脚间的串扰(临近数字信号的翻转)
模拟信号线的周围布置地线产生屏蔽,能有效地减小串扰干扰噪声。
消除影响ADC精度的因素(4)
VDD与VDDA的处理
供电引脚
STM32共有7种封装规格,共有多组VDD/VSS引脚,以及一组VDDA/VSSA引脚。
尽管所有VDD和所有VSS在内部相连,在芯片外部仍然需要连接上所有的VDD和VSS。因为导线较细,内部连接负载能力较差,抗干扰的能力也较差,如果漏接VDD或VSS,容易造成内部线路损坏,同时抗干扰能力下降。
VDD与VSS的去藕电容
每对VDD与VSS都必须在尽可能靠近芯片处分别放置一个10nF~100nF的高频瓷介电容。在靠近VDD3和VSS3的地方放置一个4.7μF~10μF的钽电容或瓷介电容。
VDD与VDDA的关系
VDDA为所有的模拟电路部分供电,包括:
ADC模块,复位电路,PVD(可编程电压监测器),PLL,上电复位(POR)和掉电复位(PDR)模块,控制VBAT切换的开关等。即使不 使用ADC功能,也需要连接VDDA,强烈建议VDD和VDDA使用同一个电源供电。VDD与VDDA之间的电压差不能超过300mV,VDD与VDDA 应该同时上电或调电。
供电方案
如何达到最优功耗水准
低功耗模式
I/O引脚的处理
1、如果需要减小I/O端口的电流消耗,可以根据具体情况配置I/O端口的状态:
输入端口????配置为浮空输入,带外部上拉的输出端口????配置为推挽输出并输出’1’,,带外部下拉的输出端口????配置为推挽输出并输出’0’。
2、未用的内部外设:
保持为关闭和默认的复位状态:
不要进行重映射,复位寄存器RCC_APB1RSTR和RCC_APB2RSTR。关闭对应的时钟,时钟使能寄存器:RCC_AHBENR、RCC_APB2ENR和RCC_APB1ENR。
进入SLEEP模式的省电操作
1、为了降低系统功耗,进入SLEEP模式时,执行如下操作流程:
关闭无需等待中断或事件的外设时钟;设置进入机制(Sleep-Now或Sleep-on-Exit);设置系统进入SLEEP模式。
2、退出睡眠模式的方式:
WFI(等待中断),可由任一外设中断触发,WFE(等待事件),可由任一外设事件触发。
进入STOP省电模式的操作
为了降低系统功耗,进入STOP模式的操作流程:
关闭设置为普通IO功能的GPIO口时钟;
关闭已开启时钟的外设的使能位(尤其是ADC、DAC、USB等带模拟模块的外设);
关闭已开启时钟的外设的时钟;
关闭预取缓冲区,并将Flash等待周期置为0;
设置PWR_CR中LPDS位选择电压调节器的模式:
正常模式:电压调节器处于正常供电状态;
低功耗模式:可降低电压调节器自身的功耗,
将MCU从STOP模式唤醒的时间有所增加;
设置系统进入STOP模式。
退出STOP省电模式的操作
1、退出停止模式:
以WFI进入时:任意外部中断线的中断;
以WFE进入时:任意外部中断线的事件;
不包括PVD和USB唤醒事件。
2、从STOP模式恢复后,时钟的配置返回到复位时的状态(系统时钟为HSI),用户程序必须重新配置整个时钟系统,包括PLL。
如何获得高精度的RTC
STM32使用Pierce振荡器,原理图及重要参数如下:
三个步骤选择一个合适的LSE
第一步:增益裕量(Gainmargin)计算
选择一个晶振(参考MCU的数据手册确定晶振的频率)
计算晶振的增益裕量(Gainmargin)并检查其是否大于5:
如果Gainmargin《 5,说明这不是一个合适的晶振,应当再挑选一个低ESR值和低CL值的晶振,重新第一步。如果Gainmargin》 5,进行第二步。
第二步:外部负载电容的计算
计算CL1和CL2的值,并检查标定为该计算值的电容是否能在市场上获得。如果能找到容值为计算值的电容,则晶振可以在期望的频率正常起振。然后转到第三步。
如果找不到容值为计算值的电容:
该应用对频率要求很高,你可使用一个可变电容并将其调整到计算值,然后转到第三步。如果对频率的要求不是特别苛刻,选择市场上能获得的电容中容值距计算值最近的电容。
第三步:驱动级别及外部电阻的计算
计算驱动级别DL并检查其是否大于DLcrystal:
如果DL《 DLcrystal,没必要使用外部电阻,祝贺你,你找到了合适的晶振。如果DL》 DLcrystal,你应该计算RExt 使其确保DL《 DLcrystal 并据此重新计算Gainmargin。如果Gainmargin》 5,祝贺你,你找到了合适的晶振。如果Gainmargin《 5,你别无选择,再重新挑选另外一个晶振吧。然后重新回到第一步。
ST推荐的LSE型号
对于STM32™的LSE部分,推荐使用CL《7pF的晶振(过大的CL会导致过大的gmcrit,从而无法保证足够的增益裕量)。
RTC是一个计数器,对输入时钟分频、计数、比较
RTC的校准
设置BKP_RTCCR寄存器,每220(1048576)个时钟周期中,减去相应周期数,每个单位能实现0.954(1000000/220) ppm的精度校准,BKP_RTCCR寄存器取值范围0-127,时钟可以调慢0 -121 ppm。
对于32,768Hz晶振,可补偿频偏范围为:32,768Hz 《 fLSE《 32,772Hz ????调慢,设置RTC预分频寄存器RTC_PRLH / RTC_PRLL。
例如:由预设值32768调整为32766,再设置BKP_RTCCR寄存器,此时,对于32,768Hz晶振,可补偿频偏范围:
复位电路
外部复位信号低脉冲至少保持300ns,系统复位信号不影响备份区域的工作,NRST复位引脚是CMOS工艺的开漏电路。在产生内部复位信号时,NRST引脚会输出一个低电平。
SWJ调试电路
SWJ电路设计及注意事项
调试烧录失败的常见原因
1、目标芯片没有正确连接,不能正常工作:
解决方法:确保目标板的最小系统正确连接,芯片能正常工作:VDD、VDDA及VSS 、VDDS已全部正确连接,复位电路能够可靠复位,各复位源不互相影响。
2、芯片内原先烧录的代码影响了新的调试操作:
芯片内原先烧录的代码出错,芯片上电运行,进入未定义状态,不能进入调试模式。芯片内原先烧录的代码启动了某些外设,或者将SWJ引脚配置为普通I/O口。
解决方法:选择芯片的BOOT0/BOOT1引脚从RAM启动,或先擦除芯片内代码。
3、芯片已被读/写保护:
调试工具不能读写芯片内置的Flash。
解决方法:先使用调试工具解除芯片的读/写保护。
STM32硬件电路设计注意事项
STM32的基本系统主要涉及下面几个部分:
1、电源
1)、无论是否使用模拟部分和AD部分,MCU外围出去VCC和GND,VDDA、VSSA、Vref(如果封装有该引脚)都必需要连接,不可悬空;
2)、对于每组对应的VDD和GND都应至少放置一个104的陶瓷电容用于滤波,并接该电容应放置尽量靠近MCU;
2、复位、启动选择
1)、Boot引脚与JTAG无关。其仅是用于MCU启动后,判断执行代码的起始地址;
2)、在电路设计上可能Boot引脚不会使用,但要求一定要外部连接电阻到地或电源,切不可悬空;
3、调试接口
4、ADC
1)、ADC是有工作电压的,且与MCU的工作电压不完全相同。MCU工作电压可以到2.0V~3.6V,但ADC模块工作的电压在2.4V~3.6V。设计电路时需要注意。
5、时钟
1)、STM32上电默认是使用内部高速RC时钟(HSI)启动运行,如果做外部时钟(HSE)切换,外部时钟是不会运行的。因此,判断最小系统是否工作用示波器检查OSC是否有时钟信号,是错误的方法;
2)、RTC时钟要求使用的32.768振荡器的寄生电容是6pF,这个电容区别于振荡器外部接的负载电容;
5、GPIO
1)、IO推动LED时,建议尽量考虑使用灌电流的方式。
2)、在Stop等低功耗模式下,为了更省电,通常情况下建议GPIO配置为带上拉的输出模式,输出电平由外部电路决定;
6、FSMC
1)、对应100pin或144pin,FSMC的功能与I2C是存在冲突的,如果FSMC时钟打开,I2C 1的硬件模式无法工作。这在STM32F10xxx的勘误表中是有描述的。
ST官方推荐的几大主流开发板的原理图,在画电路的时候可以做为参考依据:
1、IAR
1)、STM32F103RBT6
2)、STM32F103ZET6
2、MDK
1)、STM32F103RBT6
2)、STM32F103ZET6
3、Raisonance
1)、STM32F103RBT6
2)、STM32F103VET6
4、ST官方的板
1)、STM3210E-LK
2)、STM3210B-EVAL
3)、STM3210E-EVAL
4)、STM3210C-EVAL