查看: 2896|回复: 3

[求助] Kinetis 如何实现软件复位

[复制链接]

该用户从未签到

7

主题

25

帖子

0

注册会员

Rank: 2

积分
61
最后登录
2018-6-27
发表于 2016-5-31 14:10:42 | 显示全部楼层 |阅读模式
        在Kinetis调试中,我们常常遇到的复位类型包括:外部Reset引脚复位、看门狗复位、低功耗唤醒复位(VLLS3/VLLS2/VLLS1模式wakeup)、外部时钟失锁、MDM_AP调试器复位等,具体是哪种复位类型,往往可以通过RCM_SRS寄存器判断,方便用户进行调试。
        提到软件复位,此处啰嗦几句其使用场合,最先想到的是检测到错误时进行系统复位,其次就是Bootloader更新,往往需要先进行复位,还有其他的一些脑洞大开特殊应用中,比如使用定时器+软复位代替看门狗。直接上代码,如下:
         
        #define NVIC_SystemReset()    {                                               
                                        SCB_AIRCR = SCB_AIRCR_VECTKEY(0x5FA)|         \
                                                    SCB_AIRCR_SYSRESETREQ_MASK;       \
                                        while(1);                                     \
                                      }
        除了上面的代码,如下,在一些代码中添加了两个__DSB()指令,用于保证软复位前后的内存数据和指令操作完成,防止在有些数据还没有来的及更新到目标地址或者目标寄存器前就触发芯片复位,造成用户数据的丢失。
        #define NVIC_SystemReset()    {  
                     __DSB();          /* Ensure all outstanding memory accesses includedbuffered write are completed before reset */
                     SCB_AIRCR  = ((0x5FA << SCB_AIRCR_VECTKEY_SHIFT)      |
                     SCB_AIRCR_SYSRESETREQ_MASK);
                     __DSB();                                                     /* Ensure completion of memory access */
                     while(1);                                                    /* wait until reset */

                     }

我知道答案 目前已有3人回答
回复

使用道具 举报

  • TA的每日心情

    2017-1-16 12:20
  • 签到天数: 16 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    12

    主题

    653

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1667
    最后登录
    2022-5-2
    发表于 2016-5-31 14:23:46 | 显示全部楼层
    多谢分享
    回复

    使用道具 举报

  • TA的每日心情

    2017-1-4 08:05
  • 签到天数: 11 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    85

    主题

    1629

    帖子

    1

    版主

    Rank: 7Rank: 7Rank: 7

    积分
    2569

    优秀版主

    最后登录
    2019-3-28
    发表于 2016-5-31 14:26:42 | 显示全部楼层
    支持一下,学习了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    4

    主题

    22

    帖子

    0

    注册会员

    Rank: 2

    积分
    180
    最后登录
    2019-12-27
    发表于 2016-6-3 08:17:58 | 显示全部楼层

    typedef  void (*pFunction)(void);
    void reboot(void)
    {
            pFunction Jump_To_Application;
            uint32_t JumpAddress;

            JumpAddress = *(volatile uint32_t*) (0x00000004);
            Jump_To_Application = (pFunction) JumpAddress;
            Jump_To_Application();
    }

    这样也可以软件复位,中断向量表的第一个是sp指针,第2个便是  reset中断向量
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 17:36 , Processed in 0.095785 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表