Chinaunix首页 | 论坛 | 博客
  • 博客访问: 682214
  • 博文数量: 113
  • 博客积分: 7070
  • 博客等级: 少将
  • 技术积分: 930
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-02 21:03
文章分类

全部博文(113)

文章存档

2012年(2)

2011年(10)

2010年(19)

2009年(39)

2008年(20)

2007年(23)

我的朋友

分类: 嵌入式

2010-11-09 10:13:59

对于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();


注:现在的官方提供的库里似乎已经没有NVIC_GenerateSystemReset()这个函数了,但是原理还是可以用的

阅读(10395) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~