CM3(STM32) 内核复位与系统复位区别及应用

发布者:书香门第最新更新时间:2023-06-08 来源: elecfans关键字:CM3  STM32  内核复位  系统复位 手机看文章 扫描二维码
随时随地手机看文章

Ⅰ写在前面

某些系统允许复位,但对外设又有特殊要求:某一个IO状态不能因为复位而改变,某一个定时器计数器不能改变等。


例子:我一个A系统通过一个IO控制另一个B系统的电源,而这个IO置高时才开启B系统的电源。

正常工作过程中,B系统只有收到A系统关机命令任务才会进行关机(也就是说不能掉电关机),而A系统在工作过程中有复位的需求。

这个时候如果我使用常规的引脚复位,就会使IO置低,不符合要求,就需要使用到本文说到的内核复位。

Ⅱ关于复位

说到复位,我们都不会陌生,学习时,开发板上基本都有一个复位按键。

复位的种类有很多:上电复位、掉电复位、复位引脚复位、看门狗复位、软件复位等。

上面说的复位按键,也就是对应复位引脚复位;而本文说的内核复位与系统复位是属于软件复位。

Ⅲ内核与系统复位区别

本文说的内核是指处理器内核,拿STM32F1处理器来说,STM32F1的内核就是Cortex-M3内核,而这里的系统就是包含内核和外设整个一起。

内核复位:它会使Cortex-M3进行复位,而不会影响其外设,如GPIO、TIM、USART、SPI等这些寄存器的复位。

系统复位:这个复位会使整个芯片的所有电路都进行复位,我们查看寄存器手册时,会发现某某某寄存器复位值等于多少。

因此,我们常说的复位一般指的就是系统复位。

Ⅳ内核与系统复位应用及代码分析

本文拿CM3(STM32F1)进行举例说明,其他芯片类似。在下一节提供源代码工程供大家参考学习。

本文提供的复位函数分:内核和系统复位、C语言和汇编共四个版本(在一个工程),主要讲解其4个函数。

void NVIC_CoreReset(void);

void NVIC_CoreReset_a(void);

void NVIC_SysReset(void);

void NVIC_SysReset_a(void);

本章节内容可以参照Cotrex-M3权威指南中,Cotrex-M3其他特性章节下的自复位控制(软件复位)。中文版位于第13张,英文版位于第14张。

同时结合core_cm3.h源代码,其中系统复位中的C语言版就是core_cm3.h里面的源代码。

1.NVIC_CoreReset内核复位

CM3 允许由软件触发复位序列,用于特殊的调试或维护目的。在CM3中,有两种方法可以执行自我复位。第一种方法,是通过置位 NVIC 中应用程序中断与复位控制寄存器(AIRCR)的VECTRESET 位(位偏移:0)。

这种复位的作用范围覆盖了整个CM3处理器中,除了调试逻辑之外的所有角落,但是它不会影响到 CM3 处理器外部的任何电路,所以单片机上的各片上外设和其它电路都不受影响。

C语言版函数:

voidNVIC_CoreReset(void)

{

__DSB();

//置位VECTRESET

SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |

(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |

SCB_AIRCR_VECTRESET_Msk);

__DSB();

while(1);

}

汇编版函数:

__asm void NVIC_CoreReset_a(void)

{

LDR R0, =0xE000ED0C

LDR R1, =0x05FA0001 //置位VECTRESET

STR R1, [R0]

deadloop_Core

B deadloop_Core

}

内核主要注意:SCB_AIRCR_VECTRESET_Msk和LDR R1, =0x05FA0001,它是和系统复位唯一的区别。

2.NVIC_SysReset系统复位

系统复位是置位同一个寄存器中的 SYSRESETREQ 位。这种复位则会波及整个芯片上的电路:它会使 CM3 处理器把送往系统复位发生器的请求线置为有效。但是系统复位发生器不是CM3的一部分,而是由芯片厂商实现,因此不同的芯片对此复位的响应也不同。因此,读者需要认真参阅该芯片规格书,明白当发生片内复位时,各外设和功能模块都会回到什么样的初始状态,或者有哪些功能模块不受影响(比如, STM32系列的芯片有后备存储区,该区就被特殊对待)。

大多数情况下,复位发生器在响应 SYSRESETREQ 时,它也会同时把 CM3 处理器的系统复位信号(SYSRESETn)置为有效。通常, SYSRESETREQ 不应复位调试逻辑。

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

C语言版函数:

void NVIC_SysReset(void)

{

__DSB();

SCB->AIRCR = ((0x5FA << SCB_AIRCR_VECTKEY_Pos)      |

(SCB->AIRCR & SCB_AIRCR_PRIGROUP_Msk) |

SCB_AIRCR_SYSRESETREQ_Msk);

__DSB();

while(1);

}

汇编版函数:

__asm void NVIC_SysReset_a(void)

{

LDR R0, =0xE000ED0C

LDR R1, =0x05FA0004

STR R1, [R0]

deadloop_Sys

B deadloop_Sys

}


细心的朋友可能会发现:

内核复位与系统源代码和相近,差异在于SYSRESETREQ和SYSRESETREQ这两位。

C语言版本的代码和core_cm3.h中NVIC_SystemReset函数相似。对的这个函数就是系统复位函数,而我们的内核复位只是简单修改了一下。

3.main函数应用

Main函数中主要以LED1和LED2两个IO来说明。

LED1作为"标志灯": 上电"标志"置为高;

LED2作为指示灯:看从内核启动改变状态没有。

请在main函数中应用不同的配置进行测试:

#if 0 /* 内核复位 */

NVIC_CoreReset();

// NVIC_CoreReset_a();

#else /* 系统复位 */

NVIC_SysReset();

// NVIC_SysReset_a();

#endif


Cotrex-M3权威指南:

http://pan.baidu.com/s/1mhQYa1q

本文讲解的源代码工程(STM32F103ZE(Keil)_Reset):

http://pan.baidu.com/s/1hskScba


关键字:CM3  STM32  内核复位  系统复位 引用地址:CM3(STM32) 内核复位与系统复位区别及应用

上一篇:STM32F1_ WDG看门狗(独立+窗口)
下一篇:STM32复位来源 以及系统和内核复位区别

推荐阅读最新更新时间:2024-11-04 00:43

STM32三种复位形式
STM32F10xxx支持三种复位形式,分别为系统复位、上电复位和备份区域复位。 一、系统复位 系统复位将复位所有寄存器至它们的复位状态。 当发生以下任一事件时,产生一个系统复位: NRST引脚上的低电平(外部复位) 窗口看门狗计数终止(WWDG复位) 独立看门狗计数终止(IWDG复位) 软件复位(SW复位) 低功耗管理复位 可通过查看RCC_CSR控制状态寄存器中的复位状态标志位识别复位事件来源。 软件复位通过将Cortex™-M3中断应用和复位控制寄存器中的SYSRESETREQ位置’1’,可实现软件复位。请参考Cortex™-M3技术参考手册获得进一步信息。低功耗管理复位在以下两种情况下可产生低功耗管理复位: 在进入待机
[单片机]
<font color='red'>STM32</font>三种<font color='red'>复位</font>形式
stm32HAL库版本软件设计基础知识
一、去掉多余的hal库内外设 实际上可以根据工程需要添加,这样可以减少工程编译时间。 必须要的是:rcc时钟/内核/电源/dma 大概率要用的:gpio、usart stm32f4xx_hal.c //最基本的东西 stm32f4xx_hal_cortex.c //内核 stm32f4xx_hal_gpio.c //端口(95%情况要用) stm32f4xx_hal_pwr.c //电源 stm32f4xx_hal_pwr_ex.c stm32f4xx_hal_rcc.c //配置系统时钟和使能外设时钟 stm32f4xx_hal_rcc_rx.c stm32f4xx_hal_usa
[单片机]
stm32HAL库版本软件设计基础知识
STM32实例之I/O控制中的按键实验
键盘是嵌入式重要的设备之一。通过对键盘的操作可以给系统以指令,使得系统知道做什么操作,进行什么处理。就本质而言,系统对键盘的处理就是对I/O口电平的读取和处理。 在本实例中,使用OpenM3V开发板,他通过7个按键分别控制7个I/O口,这里我们通过LED等的点亮与熄灭来表征是否有按键的动作。 在做设计之前我们必须理清楚软件结构和硬件结构(这是做设计必须理清楚的重要点)。从硬件电路来说,当有按键按下时,和按键相连的I/O口为低电平;没有按下键时,和按键相连的I/O口为高电平。在该实验中,使用E端口来读取数据。在读取GPIOE数据后,首先需要把高9位用Temp &= 0x7f屏蔽,只留下先来后到7为工作。然后在依次和各个按键进行对比处
[单片机]
STM32高级定时器死区时间的配置及计算
互补输出和死区插入 死区概念 高级控制定时器(TIM1 和 TIM8)可以输出两路互补信号,并管理输出的关断与接通瞬间。这段时间通常称为死区,用户必须根据与输出相连接的器件及其特性(电平转换器的固有延迟、开关器件产生的延迟…)来调整死区时间 每路输出可以独立选择输出极性(主输出 OCx 或互补输出 OCxN)。可通过对 TIMx_CCER寄存器中的 CCxP 和 CCxNP 位执行写操作来完成极性选择。 TIM1 和 TIM8 断路和死区寄存器 (TIMx_BDTR) 寄存器功能展示 1.明确自己定时器系统时钟 系统时钟— AHB 预分频器 && APB2 预分频器值 得到自己定时器的系统时钟为168M 2.计算tDTS
[单片机]
<font color='red'>STM32</font>高级定时器死区时间的配置及计算
STM32使用寄存器工程模板点亮一个LED灯
1、环境说明 (1)使用的是普中STM32F103开发板 (2)keil 5软件 2、目的 点亮开发板上的LED1灯。 3、步骤 (1)定义一系列寄存器的宏。 #define PERIPH_BASE ((unsigned int)0x40000000) #define APB2PERIPH_BASE (PERIPH_BASE + 0x00010000) #define GPIOC_BASE (APB2PERIPH_BASE + 0x1000) #define GPIOC_CRL *(unsigned int*)(GPIOC_BASE+0x00) #define GPIOC_CRH *(un
[单片机]
<font color='red'>STM32</font>使用寄存器工程模板点亮一个LED灯
STM32ADC多通道DMA传输
ADC多通道采集是在ADC单通道DMA传输的基础上写的,代码如下: volatile u16 adcconverdata ={0,0}; static void ADC_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;//添加PA2的GPIO初始化代码 GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN; GPIO_Init(
[单片机]
外部中断简述
介绍 STM32F103的中断控制器支持19个外部中断/事件请求。 线0~15:对应外部IO口的输入中断。 线16:连接到PVD输出线。 线17:连接到RTC闹钟事件。 线18:连接到USB唤醒事件。 外部IO口的输入中断 总结步骤 第一步:开启AFIO时钟 第二步:设置IO口与中断线的映射关系。 第三步:初始化线上中断,设置触发条件等。 第四步:配置中断分组(NVIC),并使能中断。 第五步:编写中断服务函数。 第六步:清除中断标志位 映射关系。 每个中断都设有状态位,每个中断/事件都有独立的触发和屏蔽设置。 可以看出,STM32供IO口使用的中断线只有16个,但是STM32的IO口却远远不止 16个, GPIO
[单片机]
stm32自收发串口通信程序解读
今天学习了串口通信,在正点原子库函数模板中写了自收发的程序, void my_usart1_init(void) { GPIO_InitTypeDef gpio; //创建GPIO的初始化结构体 USART_InitTypeDef usart;//创建USART的初始化结构体 NVIC_InitTypeDef nvic;//创建NVIC的初始化结构体 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能GPIOA的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1的时钟 gpio
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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