当前位置: 首页 > news >正文

关于stm32的软件复位

使用软件复位的目的:

软件复位并不会擦除存储器中的数据,它只是将处理器恢复到复位状态,即中断使能位被清除,系统寄存器被重置,但RAM和Flash存储器中的数据保持不变。

STM32软件复位(基于库文件V3.5) ,对于STM32来说软件复位有多种方式:    

1)采用官方自带的软件库  
    在官方软件库的 core_cm3.h 文件中 直接提供了 系统复位的函数    

static __INLINE void NVIC_SystemReset(void) { 
SCB->AIRCR  = (
(0x5FA << SCB_AIRCR_VECTKEY_Pos)    |   (SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk)   |  SCB_AIRCR_SYSRESETREQ_Msk);                   /* Keep priority group unchanged */ __DSB();                                                                                       /* Ensure completion of memory access */               while(1);                                                                                        /* wait until reset */} 

 可是不是直接调用这个函数就OK了?    在Cortex-M3权威指南中有这么一句话:     
这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器运行复位命令,  往往会有一个延时。在此延时期间,处理器仍然能够响应中断请求。但我们的本意往往是要  让此次运行到此为止,不要再做不论什么其他事情了。所以,最好在发出复位请求前,先把  FAULTMASK 置位。  
  所以最好在将FAULTMASK 置位才万无一失。相同的官方 core_cm3.h 文件中也直接提供了该函数  

  static __INLINE void __set_FAULTMASK(uint32_t faultMask) { register uint32_t __regFaultMask       __ASM("faultmask");   __regFaultMask = (faultMask & 1);} 

 把上面这两个函数写在一起就能够实现软件复位了

void SoftReset(void) { 
__set_FAULTMASK(1);      // 关闭全部中端 NVIC_SystemReset();// 复位 } 

参考

https://www.cnblogs.com/hrhguanli/p/3815374.htmlicon-default.png?t=N7T8https://www.cnblogs.com/hrhguanli/p/3815374.html

相关文章:

  • spark MLlib (DataFrame-based) 中的聚类算法Bisecting K-Means、K-Means、Gaussian Mixture
  • 美丽的拉萨,神奇的布达拉宫
  • 项目实战系列——WebSocket——websock简介
  • 微服务之远程调用
  • 安装好IDEA后,就能够直接开始跑代码了吗?
  • 助力高考,一组彩色的文字
  • 趣谈网络协议
  • 第七章 Three.js 动画与交互
  • 热门开源项目推荐:技术与地址概览
  • laravel8使用中间件实现xss处理
  • 简单说一下STL中的map容器的特点、底层实现和应用场景【面试】
  • 【云原生】Kubernetes----Rancher助力Kubernetes监控
  • 开发uniapp 小程序时遇到的问题
  • DeepSORT(目标跟踪算法) 卡尔曼滤波 状态向量是如何映射到观测向量(测量向量)的即观测矩阵的构建方式
  • MySQL怎么为表添加描述
  • Google 是如何开发 Web 框架的
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 30秒的PHP代码片段(1)数组 - Array
  • Android组件 - 收藏集 - 掘金
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • JAVA 学习IO流
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java正则表式的使用
  • MyEclipse 8.0 GA 搭建 Struts2 + Spring2 + Hibernate3 (测试)
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • win10下安装mysql5.7
  • 前端每日实战:70# 视频演示如何用纯 CSS 创作一只徘徊的果冻怪兽
  • 前端面试之闭包
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 数据可视化之 Sankey 桑基图的实现
  • 思否第一天
  • 算法---两个栈实现一个队列
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 数据库巡检项
  • #define与typedef区别
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • (0)Nginx 功能特性
  • (6)STL算法之转换
  • (C++17) std算法之执行策略 execution
  • (C语言)fgets与fputs函数详解
  • (四)React组件、useState、组件样式
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • .net后端程序发布到nignx上,通过nginx访问
  • .sh文件怎么运行_创建优化的Go镜像文件以及踩过的坑
  • /bin/bash^M: bad interpreter: No such file or directory
  • @JoinTable会自动删除关联表的数据
  • @RequestParam,@RequestBody和@PathVariable 区别
  • @在php中起什么作用?
  • [ActionScript][AS3]小小笔记
  • [AIGC] 使用Curl进行网络请求的常见用法
  • [Android] Binder 里的 Service 和 Interface 分别是什么
  • [Android]Tool-Systrace
  • [Apio2012]dispatching 左偏树