历史上的今天

今天是:2024年11月16日(星期六)

2019年11月16日 | 通过软件程序消除单片机由外界干扰产生的异常复位的影响

发布者:机械梦想家 来源: eefocus关键字:软件程序  单片机  外界干扰  异常复位 手机看文章 扫描二维码
随时随地手机看文章

前言:


首先简单介绍一下外界干扰对单片机的2点影响:


(1)异常复位


在刚上电或外部复位引脚为复位电平时,单片机系统进入一个预定的状态——复位状态。在复位状态下,控制寄存器的值是确定的,而数据寄存器的值是随机的,程序计数器也被赋予一个确定的值。但多数情况下控制寄存器的初始值并非我们需要的,不确定的数据寄存器的值也是无法使用的,需要初始化把它们设置成一个预期的、确定的且安全的状态。初始化完成后,系统进入待命状态。系统在工作过程中,因来自电源的干扰,也可能执行复位操作,称为异常复位,这时如不采取措施,记录工作过程的数据又会被初始化,从而造成异常停机。


(2)程序跑飞


所谓程序跑飞是程序没按预定的顺序执行。因为单片机执行了不该执行的指令,该指令一旦执行,系统的状态就发生改变且不能自动恢复,这时,系统处于失控制状态。


问题分析:


这里我们主要针对STM8S105系列单片机提出一种软件抗干扰的措施:


存在问题:使用STM8S105单片机控制电机正反转工作时,继电器的吸合和断开会对单片机产生电磁波干扰,使得单片机出现异常复位情况,造成系统停机。通过示波器检测单片机VCC,发现在继电器动作瞬间会对VCC产生较大冲击。


解决方案:


(1)硬件:合理布板;退耦、滤波以及隔离;加屏蔽(针对强电磁干扰下)


(2)软件:由于控制系统是通过计时器和外部端口的状态变化来驱动系统工作的,并通过数据寄存器记录工作过程,如果在异常复位的前后我们能保护记录工作过程的数据不变,在复位后系统就会继续工作,如同没发生过干扰一样。故我们应该将程序运行过程中的数据保存在数据寄存器中记录下当前运行位置。


解决过程:


(1)判断单片机是否产生EMS复位


STM8S105单片机为了避免由电磁干扰造成的对应用程序误写操作或系统挂起,大多数关键寄存器都有一个互补寄存器与之相对应。系统将会自动检测这些关键寄存器与其互补寄存器之间是否匹配。如果不匹配,则产生一个EMS复位,从而使应用程序恢复到正常操作。


如何判断单片机是EMS复位还是其他情况的复位(STM8S系列单片机有9个复位源):


通过IAR开发环境在线调试程序,观察当单片机受干扰复位时,复位状态寄存器(RST_SR)各个位的状态值。当位4置1时说明产生了EMC复位。 

                      

 (2)配置相关数据寄存器用于保存项目程序运行中的数据


STM8S105系列单片机中有最多32K字节Flash和多达1K字节真正的数据EEPROM,可以保证数据在掉电后不丢失。这里我们采用EEPROM存储数据。


数据EEPROM(DATA)区域可用于存储用户具体项目所需的数据。默认情况下,DATA区域是写保护的,这样可以在主程序工作在IAP模式时防止DATA区域被无意地修改。只有使用特定的MASS密钥才能对DATA区域的写保护解锁。


相关程序:


chipeeprom.h头文件:


#ifndef _chipeeprom_h_

#define _chipeeprom_h_

/* 说明:主芯片STM8S105C4T6*/

/* 自定义宏 */

extern void WriteMultiBlockByte(u8 BlockStartAddress,FLASH_MemType_TypeDef


      FLASH_MemType, FLASH_ProgramMode_TypeDefFLASH_ProgMode, uint8_t *Buffer,uint8_t BlockNum);

extern void ReadMultiBlockByte(u8 BlockStartAddress,uint8_t BlockNum,

                        uint8_t ReadBlockByte[]);


chipeeprom.c源文件:


#include "include.h"

/*******************************************************************************

****函数名称:

****函数功能:任意写多个Block字节

****入口参数:

          BlockStartAddress    字节被写入的Block首地址

          FLASH_MemType        FLASH Memory操作类型

          FLASH_ProgMode       FLASH 编程模式

          Buffer               要写进flash eeprom 的字节数组

          BlockNum             要写进flash eeprom 的Block个数

****出口参数:无

****说明:每种型号的EEPROM的大小不一样,调用此函数的时候要注意将要写进的字节数组

         的大小是否超过该型号的EEPROM的地址。

         大容量的EEPROM的型号是STM8S208, STM8S207, STM8S007, STM8AF52Ax, STM8AF62Ax 

         EEPROM的地址是从0x004000到0x0047ff,共2048Byte,每个Block是128Byte,一共16个Block.

         中容量的EEPROM的型号是STM8S105, STM8S005, STM8AF626x

         EEPROM的地址是从0x004000到0x0043ff,共1024Byte,每个Block是128Byte,一共8个Block.

         小容量的EEPROM的型号是STM8S103, STM8S003, STM8S903 

         EEPROM的地址是从0x004000到0x00427f,共1024Byte,每个Block是64Byte,一共10个Block.

********************************************************************************/

void WriteMultiBlockByte(u8 BlockStartAddress,FLASH_MemType_TypeDef FLASH_MemType, 

                FLASH_ProgramMode_TypeDef FLASH_ProgMode, uint8_t *Buffer,uint8_t BlockNum)

{

  uint8_t  BlockNum_Temp;

  /* 解锁 flash data eeprom memory */

  FLASH_Unlock(FLASH_MEMTYPE_DATA);

  /* 等待 Data EEPROM area 解锁标志位置位*/

  while (FLASH_GetFlagStatus(FLASH_FLAG_DUL) == RESET) ;

  for(BlockNum_Temp=BlockStartAddress;BlockNum_Temp  {

      if(BlockNum_Temp>FLASH_DATA_BLOCKS_NUMBER)

         break;

      FLASH_ProgramBlock(BlockNum_Temp, FLASH_MemType, FLASH_ProgMode,Buffer+BlockNum_Temp*FLASH_BLOCK_SIZE);

      FLASH_WaitForLastOperation(FLASH_MemType);

  }

  FLASH_Lock(FLASH_MEMTYPE_DATA);/*操作完要加锁*/

}

/*******************************************************************************

****函数名称:

****函数功能:任意读多个Block字节

****入口参数:

         BlockStartAddress    读Block首地址

         BlockNum                 读多少Block

         ReadBlockByte[]       存放读到字节的数组

****出口参数:无

********************************************************************************/

void ReadMultiBlockByte(u8 BlockStartAddress,uint8_t BlockNum,uint8_t ReadBlockByte[])

{

    uint32_t add, start_add, stop_add;

    start_add = FLASH_DATA_START_PHYSICAL_ADDRESS+(u32)((BlockNum-1)*FLASH_BLOCK_SIZE);

    stop_add = FLASH_DATA_START_PHYSICAL_ADDRESS + (u32)(BlockNum*FLASH_BLOCK_SIZE);

    for (add = start_add; add < stop_add; add++)

        ReadBlockByte[add-FLASH_DATA_START_PHYSICAL_ADDRESS]=FLASH_ReadByte(add);

}


主函数(这里只列举了关于EEPROM读写的相关程序代码)


#include "include.h"


u8 WriteBuffer[FLASH_BLOCK_SIZE];  //设置一个数组用于保存程序运行中的数据

u8 ReadBuffer[FLASH_BLOCK_SIZE];


void main(void)

{


      ......


      WriteMultiBlockByte(0,FLASH_MEMTYPE_DATA,FLASH_PROGRAMMODE_STANDARD,WriteBuffer,1);


      ......


       ReadMultiBlockByte(0,1,ReadBuffer);


}

关键字:软件程序  单片机  外界干扰  异常复位 引用地址:通过软件程序消除单片机由外界干扰产生的异常复位的影响

上一篇:单个按键,实现单击+双击+长按
下一篇:KT1025A关于看门狗或者复位的解决方案

推荐阅读

2018双十一购物狂欢节结束,蚂蚁区块链首次参战,来自上百个国家和地区的商品,都装上了区块链“身份证”,消费者只要打开手机扫一扫,就能看到从海外采购到国内配送等重要环节的全链路信息。同时,京东智臻链区块链服务平台也已有超过12亿条溯源上链数据。  其中,区块链的不可篡改性和可追踪性保证了货物信息实时追踪与产品数据双向安全,提高运输过程...
误码仪是常用的测试高速数字(包括光通信)器件和系统的仪器。 图1是传统误码仪的结构框图。图1 传统误码仪结构框图 传统误码仪由2大部分组成: 1)码型发生器。 包括:时钟源(可以采用内时钟或外时钟),码型产生组件(产生需要的码型格式:PRBS或自定义等格式),信号调理前端(输出电平控制等),时钟信号前端(输出时钟电平控制等...
泰克科技日前推出第二代IsoVuTM光隔离高压探头TIVP系列,大大增强了2016年首次推出的第一代突破性探头的性能。第二代IsoVu探头尺寸更小,使用更简便,电气性能更佳,有效发现普通隔离探头隐藏的快速震荡信号,把隔离探头技术应用扩展到整个功率系统设计市场。 使用传统差分探头几乎不可能在浮地高速率系统上进行准确的测量。由于涉及更高的频率和开关速度...
财联社(上海,编辑 黄君芝)讯,据报道,麻省理工学院(MIT)的工程师报告称,他们制造出了第一批高质量的新型半导体材料薄膜。这一壮举被MIT首席研究员Rafael Jaramillo形容为他的“白鲸”,并有可能影响多个科技领域。此前类似的技术突破曾经带来了计算机、太阳能电池、夜视相机等的出现。Jaramillo指出,这种新半导体材料即所谓的卤化物钙钛矿(chal...

史海拾趣

问答坊 | AI 解惑

基于 TPS62300 高频降压转换器的小型解决方案可实现动态电压管理

源:ti.com.cn 豪华的单片机开发系统498元 可稳定视频输出的: S3C2410 ARM9开发板780元DSP5402学习开发板II200元 暑期大优惠:S3C44B0开发板(标准版)350元 单片机以太网开发板  180元 DSP5402学习开发板II200元 ...…

查看全部问答∨

详解Linux电源管理

1.概述   虽然Linux可以在任何一台386以上的PC上运行,目前大多数人使用的都是新型的,带有各种外设的桌面PC或者笔记本电脑,这样,电源管理功能(PM)就逐渐变得越来越重要。在笔记本电脑上电源管理可以节能,延长电池寿命,而在桌面PC上它 ...…

查看全部问答∨

基于MSP430的新型自报式水文遥测终端机设计(图)

水文遥测系统通常由终端机、中继站和中心站三部分组成。由于终端机是用来直接测量雨量、水位等水文数据,是整个遥测系统信息的来源,故其设计成为整个遥测系统的关键。遥测终端机一般处于河流上游或者湖泊边缘,分布分散,维护起来很不方便,需要长 ...…

查看全部问答∨

ARM基础实验教材 适合初学者 word版 经排版可打印

整理了一天,打印时记得用双面A4,因为是按照双面排版的!     下载了记得顶一下,本人刚注册的号,积分不多,帮忙挣点积分了好下载资料,在此谢过了!!      (本教材中有少部分图片不是很清楚,不过不影响大局 ...…

查看全部问答∨

嵌入式培训咨询

我收到一份站内信,自己对嵌入式不了解,所以来请教各位版友~ 信内容: 你好! 看见你在计算机系的发帖想必是很了解计算机知识的,所以很冒昧地写信,想向你请教一 下嵌入式的问题。 我是南大的一名毕业生,现在一所大学工作,最近有个培训机 ...…

查看全部问答∨

请问EVB的下载地址。找了很久找不到。

求EVB或者EVC的下载地址。POCKET PC(掌上电脑)应用程序开发有用。如熟悉者,并请提供相应的学习网站。谢谢!…

查看全部问答∨

推荐ARM开发板

现在急需推荐一款ARM开发板,要求: 可以做触摸屏;操作系统WinCE——可以自己修改源码;应用于大型系统集成;处理数据采集系统;抗干扰能力强;数据运算速度快;扩展口多。哪位大侠给推荐一下,谢谢:)…

查看全部问答∨

mfc新手问一个问题

在wince下用mfc的dialog类编程,我在resource中加入了菜单,然后通过下面代码加入到dialog的init中,实现了wince下dialog中添加菜单的功能 SHMENUBARINFO   m_menu_bar;         ZeroMemory(&m_menu_bar,  ...…

查看全部问答∨

pos端疑问(请有实际开发经验的同仁帮忙解答) (有分连接)

本人目前所在项目是做一个pos对端服务系统,通过socket负责解析pos传送过来的封包数据。现在pos那端提出他们不支持断点续传功能,也就是假设时间段内发送1000个数据包,有任意一条出错就必须从头再传,基于程序设计逻辑考虑这样肯定是不合适的。pos ...…

查看全部问答∨

DSP 硬件构架 QQ群:47827656

DSP 硬件构架 QQ群:47827656…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
  • ARM裸机篇--按键中断
    先看看GPOI的输入实验:按键电路图:GPF1管教的功能:EINT1要使用GPF1作为EINT1的功能时,只要将GPFCON的3:2位配置成10就可以了!GPF1先配 ...
  • 网上下的--ARM入门笔记
    简单的介绍打今天起菜鸟的ARM笔记算是开张了,也算给我的这些笔记找个存的地方。为什么要发布出来?也许是大家感兴趣的,其实这些笔记之所 ...
  • 学习ARM开发(23)
    三个任务准备与运行结果下来看看创建任务和任运的栈空间怎么样的,以及运行输出。Made in china by UCSDN(caijunsheng)Lichee 1 0 0 ...
  • 学习ARM开发(22)
    关闭中断与打开中断中断是一种高效的对话机制,但有时并不想程序运行的过程中中断运行,比如正在打印东西,但程序突然中断了,又让另外一个 ...
  • 学习ARM开发(21)
    先要声明任务指针,因为后面需要使用。 任务指针 volatile TASK_TCB* volatile g_pCurrentTask = NULL;volatile TASK_TCB* vol ...
  • 学习ARM开发(20)
  • 学习ARM开发(19)
  • 学习ARM开发(14)
  • 学习ARM开发(15)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved