关于STM32软件复位代码编写

发布者:beup001最新更新时间:2017-09-11 来源: eefocus关键字:STM32  软件复位  代码编写 手机看文章 扫描二维码
随时随地手机看文章

对于STM32来说软件复位有两种方式:

 

1)采用官方自带的软件库

 

  在官方软件库的stm32f10x_nvic.c 文件里 直接提供了 系统复位的函数

 

/*******************************************************************************
* Function Name  : NVIC_GenerateSystemReset
* Description    : Generates a system reset.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_GenerateSystemReset(void)
{
  SCB->AIRCR = AIRCR_VECTKEY_MASK | (u32)0x04;
}

 

但是不是直接调用这个函数就OK了?

 

在Cortex-M3权威指南中有这么一句话

 

这里有一个要注意的问题:从SYSRESETREQ 被置为有效,到复位发生器执行复位命令,
往往会有一个延时。在此延时期间,处理器仍然可以响应中断请求。但我们的本意往往是要
让此次执行到此为止,不要再做任何其它事情了。所以,最好在发出复位请求前,先把
FAULTMASK 置位。

 

所以最好在将FAULTMASK 置位才万无一失。

 

同样官方stm32f10x_nvic.c 文件里也直接提供了该函数

 

/*******************************************************************************
* Function Name  : NVIC_SETFAULTMASK
* Description    : Enables the FAULTMASK priority: Raises the execution priority to -1.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void NVIC_SETFAULTMASK(void)
{
  __SETFAULTMASK();
}

 

所以要系统复位 只要 调用这两个函数就OK了

NVIC_SETFAULTMASK();

GenerateSystemReset();

 

2)自己编写相应汇编代码

 

其实道理是一样的,我当初是没有看到官方的函数所以自己编的,实际你看官方函数里面其实就是调用的cortexm3_macro.s同样的代码 呵呵。

 

我的代码:

 

/*******************************************************************************
* Function Name  : SystemReset
* Description    : Configures the port pin connected to the push button. GPIO_D_4
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
__asm void SystemReset(void)
{
 MOV R0, #1           //; 
 MSR FAULTMASK, R0    //; 清除FAULTMASK 禁止一切中断产生
 LDR R0, =0xE000ED0C  //;
 LDR R1, =0x05FA0004  //; 
 STR R1, [R0]         //; 系统软件复位   

 
deadloop
    B deadloop        //; 死循环使程序运行不到下面的代码
}

 

然后用的时候在C程序里直接调用该函数就行了。

 

SystemReset();

在MDK环境下,包含汇编的代码嵌入到C代码中时,编写、调用与C函数一样

在misc.c中定义了上面的函数;

在misc.h中声明了函数:void SystemReset(void);

在main.c中调用函数:SystemReset();

补充:

MDK和IAR通用的软件复位代码:

#if defined ( __CC_ARM   ) /*------------------RealView Compiler -----------------*/ 
__asm void GenerateSystemReset(void) 

 MOV R0, #1           //;  
 MSR FAULTMASK, R0    //; FAULTMASK 禁止一切中断产生 
 LDR R0, =0xE000ED0C  //; 
 LDR R1, =0x05FA0004  //;  
 STR R1, [R0]         //;    
  
deadloop 
    B deadloop        //;  

#elif (defined (__ICCARM__)) /*------------------ ICC Compiler -------------------*/ 
//#pragma diag_suppress=Pe940 
void GenerateSystemReset(void) 

  __ASM("MOV R0, #1"); 
  __ASM("MSR FAULTMASK, R0"); 
  SCB->AIRCR = 0x05FA0004; 
  for(;;); 
}

上面的代码,程序在FLASH中跑时可以复位,在RAM中调试不成功,原因可能是板子上的boot比较松,导致RAM启动选择有问题

 

由上面可以看出,IAR下嵌入汇编不是简单的asm("...");,如asm("LDR R0, =0xE000ED0C  ");就会报错


关键字:STM32  软件复位  代码编写 引用地址:关于STM32软件复位代码编写

上一篇:STm32 使用 stm32cube GPIO 点亮 led 的
下一篇:STM32F0xx IAP实现之中断向量表重定义

推荐阅读最新更新时间:2024-03-16 15:36

stm32在中断函数里执行初始化函数
最近用了stm32f030c8t6,要求做低功耗: 1、关闭外设时钟并把管脚都配置成模拟输入后,大概满足要求了,然后进入stop模式。 2、接着由外部中断唤醒,唤醒后重新初始化所有的外设,继续运行。 但是唤醒后程序一直停在延时函数的地方,原来是systick中断函数不能执行了。找了好久才想起来,我的唤醒初始化函数是在外部中断函数中执行的,初始化函数中用了延时函数,延时需要执行systick中断函数,中断函数执行不完,systick自然不能执行中断函数,所以一直停着不动了。
[单片机]
stm32之看门口介绍
今天在学习mpu6050的时候,发现程序出现了看门狗的程序,其实这个在学习51的时候就应该了解的,但是我并没有去了解。导致现在学习32,其实就是在补之前的51。 首先,我想把文章最后一句放到开始写出来:总结一下,就个人观点来说,看门狗并不是特别需要的,是否需要在程序中加看门狗模块就具体的程序实现而定。 好了,下面就介绍一下何为看门狗。 stm32自带两个看门狗模块,独立看门狗IWDG和窗口看门狗WWDG。主要作用是——可用来检测和解决由软件错误引起的故障;当计数器达到给定的超时值时,触发一个中断(仅适用于窗口型看门狗)或产生系统复位。 具体的实现步骤:开启看门狗,设置减计数的初始值,当计数值达到超时值时,产生MCU复位
[单片机]
STM32 CPU ID,Unique ID,Flash size register的定义
注意,CPU ID和Unique ID对ST来讲是不同的定义,CPU ID是CortexM3自带的,复位值是一致的,在PM0056.pdf中有定义说明。 Unique ID是每个芯片的不同ID,在RM0008.PDF中定义,像F103就在30.2节中定义。 Flash size register是芯片的Flash大小,在RM0008.PDF中定义,像F103就在30.1中定义。 可以推理,如果知道了Flash大小,就可以根据手册来推出Page的大小了,所以就不要找page size register了,没有这个专门的寄存器。 要注意的是,L15x系列的地址基址和F103不一样,要参考对应的手册。
[单片机]
关于STM32的待机唤醒功能
本文我们来学习下STM32的待机唤醒功能。要实现的功能是:系统运行时 D1 指示灯闪烁,5 秒后进入待机模式,D1 指示灯熄灭,同时串口 printf输出相关提示信息,可通过 K_UP 按键实现唤醒。学习本内容可以参考《STM32F10x中文参考手册》-4 电源控制器(PWR)章节。 STM32 低功耗模式介绍 很多单片机具有低功耗模式,比如 MSP430、STM8L等。我们的STM32也不例外,相关文章:STM32低功耗模式。默认情况下,系统复位或上电复位后,微控制器进入运行模式。在运行模式下,HCLK 为 CPU 提供时钟,并执行程序代码。当 CPU 不需继续运行(例如等待外部事件)时,可以利用多种低功耗模式来节省功耗。用
[单片机]
关于<font color='red'>STM32</font>的待机唤醒功能
STM32的实时时钟RTC编程详解
在STM32里,一个CPU已经足够,不需要像DS1302这样的实时时钟芯片。实际上,RTC就只一个定时器而已,掉电之后所有信息都会丢失,因此我们需要找一个地方来存储这些信息,于是就找到了备份寄存器。因为它掉电后仍然可以通过纽扣电池供电,所以能时刻保存这些数据。 STM32的RTC模块 RTC模块之所以具有实时时钟功能,是因为它内部维持了一个独立的定时器,通过配置,可以让它准确地每秒钟中断一次。 1.1 RTC的组成 RTC由两个部分组成:APB1接口部分以及RTC核心部分。 STM32所有的外设默认时钟无效,使用某个外设时,再开启时钟,用这样的方式来降低功耗。 这里的RTC,APB1 接口由APB1总线时钟来驱动。为
[单片机]
基于STM32的数据采集与监控系统的远程监控终端设计方案
  引言   数据采集与监控系统是以计算机为基础的分布式控制系统与电力自动化监控系统,广泛应用于电力、冶金、石油、化工等诸多领域。数据采集与监控系统依靠其数量庞大的远程终端单元收集各终端站点信息和执行控制策略。远程终端单元的性能、成本、可靠性对整个系统而言举足轻重。数据采集与监控系统如图1所示。   对于终端站点现场环境恶劣或站点广泛分散的系统,要求站点长期无人值守,如电信公司的电话光纤网络交接设备、高速公路机电设备等。如何保证终端站点的信息高效、可靠地上传,并能对中心系统的命令及时响应,成为目前广泛研究的热点问题。参考文献提出了一种基于GPRS无线传输的无人值守低功耗远程终端的设计方案;参考文献设计了基于MODBUS
[单片机]
基于<font color='red'>STM32</font>的数据采集与监控系统的远程监控终端设计方案
CAN总线学习笔记|CAN盒测试STM32的CAN中断接收
CAN基础知识介绍文中介绍了CAN协议相关的基础知识,以及STM32F4芯片的CAN控制器相关知识,下面将通过实例,利用STM32CubeMX图形化配置工具,并配合CAN盒,来实现CAN通讯的中断收发测试 1. STM32CubeMX配置 CAN是挂载在APB1总线上,设置PCLK1时钟频率到最大45MHz 激活CAN1,配置位时序参数,其他基本参数以及工作模式(此处设置为Normal普通模式) CAN波特率的计算公式:只需要知道BS1和BS2的设置,以及APB1的时钟频率,就可以方便的计算出波特率。比如设置TS1=8、TS2=6和BRP=6,在APB1频率为45Mhz的条件下,即可得到CAN通信的波特率=45000/6
[单片机]
CAN总线学习笔记|CAN盒测试<font color='red'>STM32</font>的CAN中断接收
基于STM32的传感器接口模块的设计
0 引言     物联网将会是未来很长一段时间内IT产业的发展趋势,一个完整的物联网系统的构成或产业链的划分,目前业界比较统一的观点基本都认为应该包括三个层面:末端设备或子系统、通信连接系统、以及管理和应用系统。即Device-设备、Connect-连接和Manage-管理。由于数字整合的需求日益增长,对作为感知层核心组成元素的传感器数据融合提出了更高要求。如何将传感器连入网络成为一个尤其重要的问题。     传感器通过接口模块接入到相应网络。传感器通过信号接口连接到接口模块,节点以相应的适配模块接收和处理传感器输出信号,并将传感器原始数据转换为网络用户可以识别的信息,最后通过网络通信接口连接到上位机或者任何网络。     传
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
随便看看
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved