在基于微控制器的电子系统中,强壮的软件设计是提高 EMC 性能的主要因素。必须尽量在项目设计阶段的早期考虑 EMC 干扰导致的问题。EMC 导向的软件提高了应用的安全性和可靠性。强化 EMC 性能的软件的实施成本低,可提高最终的抗扰性能,并节约硬件和开发成本。用户应考虑到模拟或数字数据受到的 EMC 干扰,就像任何其它应用参数一样。
EMC 干扰导致的问题示例:
微控制器无响应
程序计数器失控
执行意外指令
地址指向错误
子程序执行错误
寄生复位和 / 或寄生中断
IP 配置损坏
I/O 失灵
软件故障的后果示例:
产品意外响应
上下文丢失
进程中的意外分支
中断丢失
数据完整性缺失
输入值误读
01使用看门狗或时间控制
为了确保 MCU 能够从软件失控故障中恢复,看门狗是最有效的可用工具。它的原理非常简单:它是一个在计数结束时产生 MCU复位的定时器。一旦看门狗启动,防止看门狗复位控制器的唯一方式就是在程序中周期性更新计数器。
但是为了使看门狗发挥它的最大潜力,用户必须在软件中的恰当位置插入使能和喂狗指令。
下图演示了错误的看门狗使用方式:
需要执行下列规则:
复位之后尽快启用看门狗,或者开启硬狗选项 (如果有)。
切勿在中断服务函数中或在代码中没有超时保护的任何本地环路中刷新看门狗。 根据不同程序的持续时间,包括中断程序,对两个刷新指令之间的间隔时间进行优化是非常重要的。
看门狗还有一种小用途,即可以使用它来复位 MCU,但这也意味着程序上下文的丢失,以及应用数据完整性的丢失。复位之后,除了启用看门狗外,在一些 MCU 上,你可以使用复位标志来区分上电或低电压复位或看门狗复位。
正确使用看门狗的实例如下图:
02保护闲置程序存储区域
在大多数应用中,程序存储空间并没有完全被用户代码占满。为了更强的安全性,如果你不想产生复位,可以使用代码填满闲置存储位置,这样会强制看门狗复位或者跳向已知的程序位置。
即使程序计数器损坏,并且跳向闲置存储位置,这都将确保 MCU 恢复和返回到正常操作。在这个闲置区域,还可以跳转到恢复故障安全子程序,通过该子程序可恢复正常运行。
带有 ARM Cortex-M 内核的 STM32 微控制器使用故障异常,当系统遭受 EMC 干扰时,它可以捕获可能发生的非法存储访问和非法编程行为。未定义的指令操作代码可以用来填充STM32 微控制器的闲置存储,在程序计数器失控的情况下,提高故障异常使用率,使得故障安全程序从错误中恢复。
03输入过滤和比较
最佳做法是在验证状态和继续编程执行之前,由程序对输入引脚稳定性进行几次检查,以避免由输入电路的外部噪声造成的不想要的尖峰响应。这是一个简单的对关键输入滤波的方法,不需要额外的成本。
04闲置中断向量管理
为了避免意外中断事件导致的问题 (无论是什么来源),建议在相应的向量中加入一个有效的中断程序地址,以管理所有可能的中断来源。在下面的示例中,未使用的中断向量指向故障管理程序标签,该标签中填充了简单的 “ 从中断返回 ” 指令06
05平均模数转换器结果
如果你在执行 A/D 转换操作,你可以重复多次转换,将结果存储在 RAM 中,然后取平均值(或者选择最多出现的值),以在任何可能的噪声错误的情况下获取准确的结果。
06冗余数据存储和交换
由于极端条件下的电磁干扰,所有存储在内部或外部存储器的数据都可能损坏。高级的预防技术包括将双倍互补值存储在非临近存储区域、存储和检查奇偶校验位或 ECC,它们可帮助识别和 / 或修正数据损坏。 关注本公众号,在后台回复【STM32】可以获取更多相关设计的参考电路。
关键字:STM32 MCU EMC
引用地址:
基于STM32 MCU应用的EMC指南之软件篇
推荐阅读最新更新时间:2024-11-08 18:25
stm8s单片机内部定时器2使用
stm8s的中文手册里面写TIM2 16位向上计数是错误的。 stm8s定时易于使用,首先设定定时器的时钟频率,知道了定时器的时钟周期T,那么定时时间Tn就确定了,即 Tn = T * ARR(自动装载数据)。 程序如下: 1、单片机时钟设定: //fmaster=fcpu=2MHz CLK_ECKR=0x00; CLK_ICKR=0x01; CLK_CMSR=0xe1; CLK_SWR=0xe1; CLK_CKDIVR=0x18; 2、定时器TIM2初始化 //定时器2初始化fmaster/分频=2M/2=1M,1us计数一次,50us 中断一次 void TIM2_Init(void) { _a
[单片机]
STC89C52单片机外部中断0和外部中断1的应用
/////////////////////////////////////////////////////////////////////// 实现功能: 测试外部中断0和外部中断1下降沿触发,因为实验板上的K3键与外部 中断0的引脚相连,K4与单片机的外部中断1相连,本实验要完成的测 试结果是,按下K3键时,即外部中断0触发,实验板上所以数码管上的 数加1,而按K4按下时,即外部中断1触发,数码管上的数值减1 实验板型号:BS-XYD-C52 实验名称: 外部中断0和外部中断1的应用 编写人: 谢应东 编写日期: 2012-4-27 ///////////
[单片机]
mcu音乐程序的设计与实验
利用单片机(或单板机)奏乐大概是无线电爱好者感兴趣的问题之一。本文从单片机的基本发间实验出发,谈谈音乐程序的设计原理,并给出具体实例,以供参考。 1. 单片机的基本发音实验 我们知道,声音的频谱范围约在几十到几千赫兹,若能利用程序来控制单处机某个口线的 高 电平或低电平,则在该口线上就能产生一定频率的矩形波,接上喇叭就能发出一定频率的声音,若再利用延时程序控制 高 低 电平的持续时间,就能改变输出频率,从而改变音调。 例如,要产生200HZ的音频信号,按图1接入喇叭(若属临时实验,也可将喇叭直接接在P1口线上),实验程序为: 其中子程序DEL为延时子程序,当R3为1时,延时时间约为20us,R3中存放延时常数,对200HZ音
[单片机]
MCS-51系列单片机位置位复位指令(4条)
布尔处理功能是MCS-51系列单片机的一个重要特征,这是出于实际应用需要而设置的。布尔变量也即开关变量,它是以位(bit)为单位进行操作的。 在物理结构上,MCS-51单片机有一个布尔处理机,它以进位标志做为累加位,以内部RAM可寻址的128个为存储位。 既然有布尔处理机功能,所以也就有相应的布尔操作 指令 集,下面我们分别谈论。 . 位置位复位指令(4条) 这些指令对CY及可寻址位进行置位或复位操作,共有四条指令。 CLR C ; 0→CY,清CY CLR bit ; 0→bit,清某一位 SETB C ; 1→CY,置位CY SETB bit ; 1→bit,置位某一位
[单片机]
STM32蜂鸣器pwm控制频率播放音乐
通过修改输出的pwm波的频率来达到不同的音频 单片机源程序如下: #include stm32f10x.h #include led.h #include delay.h #include sys.h #include timer.h #define proport 10000 //Tclk/(psc+1)=72000000/(7199+1) #define L1 ((proport/131)-1)//低调 do 的周期根据Tout= ((arr+1)*(psc+1))/Tclk推出arr值就是本句define定义的值,Tout为音调频率131Hz的倒数,Tclk=72MHz #define L2
[单片机]
单片机学习记录——LED点阵
硬件连接 如图,16*16的点阵,分为16个POS引脚和16个NEG引脚。其中16个NEG引脚接了74HC595(U16、U17)的并行输出端。我们通过排线把74HC595(U4、U5)的输出端接到J17、J18,使之连到16个POS引脚。所以,点阵的所有32个引脚接了4片74HC595的输出端。4片74HC595又级联起来。相当于只有一个串行输入端P3.4。 74HC595原理分析 https://blog.csdn.net/huangyangquan/article/details/78332246 总结:只需控制SER、SCLK、RCLK就能控制点阵的显示。 软件设计 /************
[单片机]
STM32自定义printf实现多串口互用
STM32 串口使用频繁的朋友可能知道一个问题,库自带的 USART_SendData 函数一次只能发送 1 Byte 字符 如果我们要输出一个带格式、带参数的串口数据就只能通过 sprintf 打印到一个临时数组,然后再使用一个for循环调用USART_SendData一个字符一个字符的输出,过程非常麻烦! 姜斌是一个非常怕麻烦的人所以这种方法无疑让我发疯!后来在原子(OpenEDV)那里购买了开发板拿到了例程。里面重定向了printf函数作为串口输出函数,有了这个函数之后就能够很轻松的参数输出,但问题就在这里我们串口1 串口2 都要带参数输出怎么办? 本次实验:自定义printf函数 实验数据来源: 配置usart
[单片机]