打印
[STM32F1]

请教一个关于芯片重启的问题

[复制链接]
1813|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lanfe|  楼主 | 2017-4-20 11:56 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有个问题向大家请教一下。我在主循环中调用Reset_Handler,程序启动定时器2可以正常运行,但是我在HardFault_Handler中调用Reset_Handler重启芯片的时候,定时器2没有正常启动。在HardFault的时候有什么特别的地方吗?

调用我自己的Hard_fault程序
HardFault_Handler\
                PROC
                IMPORT  hard_fault_handler_c
                                TST LR, #4
                                ITE EQ
                                MRSEQ R0, MSP
                                MRSNE R0, PSP
                                B        hard_fault_handler_c
                ENDP

处理函数
void hard_fault_handler_c(unsigned int * hardfault_args)
{
        static T_CALL_STACK T_stacked;

        T_stacked.stacked_r0 = ((unsigned long) hardfault_args[0]);
        T_stacked.stacked_r1 = ((unsigned long) hardfault_args[1]);
        T_stacked.stacked_r2 = ((unsigned long) hardfault_args[2]);
        T_stacked.stacked_r3 = ((unsigned long) hardfault_args[3]);
        T_stacked.stacked_r12 = ((unsigned long) hardfault_args[4]);
       
        T_stacked.stacked_lr = ((unsigned long) hardfault_args[5]);        
        T_stacked.stacked_pc = ((unsigned long) hardfault_args[6]);
        T_stacked.stacked_psr = ((unsigned long) hardfault_args[7]);

        T_stacked.SHCSR = (*((volatile unsigned long *)(0xE000ED24)));
        T_stacked.MFSR = (*((volatile unsigned char *)(0xE000ED28)));       
        T_stacked.BFSR = (*((volatile unsigned char *)(0xE000ED29)));       
        T_stacked.UFSR = (*((volatile unsigned short int *)(0xE000ED2A)));
        T_stacked.HFSR = (*((volatile unsigned long *)(0xE000ED2C)));  
        T_stacked.DFSR = (*((volatile unsigned long *)(0xE000ED30)));       
        T_stacked.MMAR = (*((volatile unsigned long *)(0xE000ED34)));       
        T_stacked.BFAR = (*((volatile unsigned long *)(0xE000ED38)));
       
        FlashRecord(&T_stacked);
        while (1) Reset_Handler();
沙发
feelhyq| | 2017-4-20 12:14 | 只看该作者
楼主为什么要用 ResetHandler呢? 万一在调用ResetHandler的时候栈溢出了怎么办? 如果想复位直接用软件复位不是更简单吗?  ResetHandler仅仅值一个函数,并不能初始化所有的硬件

使用特权

评论回复
板凳
lanfe|  楼主 | 2017-4-20 12:33 | 只看该作者
feelhyq 发表于 2017-4-20 12:14
楼主为什么要用 ResetHandler呢? 万一在调用ResetHandler的时候栈溢出了怎么办? 如果想复位直接用软件复 ...

您说的软件复位指的是??

使用特权

评论回复
地板
mmuuss586| | 2017-4-20 12:50 | 只看该作者
lanfe 发表于 2017-4-20 12:33
您说的软件复位指的是??

就是让程序复位

使用特权

评论回复
5
lanfe|  楼主 | 2017-4-20 13:07 | 只看该作者

ResetHandler不就是程序软复位吗?

使用特权

评论回复
6
feelhyq| | 2017-4-20 13:14 | 只看该作者
lanfe 发表于 2017-4-20 12:33
您说的软件复位指的是??

/** \brief  System Reset

    This function initiate a system reset request to reset the MCU.
*/
static __INLINE void NVIC_SystemReset(void)
{
  __DSB();                                                     /* Ensure all outstanding memory accesses included
                                                                  buffered write are completed before reset */
  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 */
}

使用特权

评论回复
7
feelhyq| | 2017-4-20 13:15 | 只看该作者
lanfe 发表于 2017-4-20 12:33
您说的软件复位指的是??

就是复位整个芯片,RAM区无法清空,因为没有掉电

使用特权

评论回复
8
lanfe|  楼主 | 2017-4-20 13:25 | 只看该作者
feelhyq 发表于 2017-4-20 13:15
就是复位整个芯片,RAM区无法清空,因为没有掉电

非常感谢,现在可以正常复位了。

使用特权

评论回复
9
lanfe|  楼主 | 2017-4-20 13:26 | 只看该作者
非常感谢大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

5

帖子

1

粉丝