查看: 4068|回复: 7

[求助] LPC1778从BOOT跳转到应用程序SysTick失效

[复制链接]
  • TA的每日心情
    奋斗
    2017-11-29 15:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    19

    帖子

    1

    注册会员

    Rank: 2

    积分
    72
    最后登录
    2023-1-10
    发表于 2019-5-20 23:09:12 | 显示全部楼层 |阅读模式
    做了一个BOOT,启动之后可以通过串口传输应用程序BIN文件,发现一个问题,如果应用程序没有SysTick,正常。如果应用程序里用了SysTick就死掉了。在LPC1758上就没问题。
    在LPC1778上只用不用系统的滴答定时器也可以正常跳转正常跑起来,如果用滴答定时器就死掉了。定时器中断里有调试打印‘a’,可见也没有进入到中断,应该是中断异常向量表那里出错了。

    1. vuint32        g_SysTickCnt = 0;        // 滴答中断的次数

    2. /***********************************************************************************************************************
    3. **--Descriptions : 中断处理
    4. **--2017-12-16 22:15:50
    5. ***********************************************************************************************************************/
    6. void SysTick_Handler(void)
    7. {
    8.         UART0_SendStr("a");
    9.         g_SysTickCnt++;
    10.        
    11.         if (1000 == g_SysTickCnt){
    12.                 g_SysTickCnt = 0;
    13.                 UART0_SendStr("\r\n OK......");
    14.                 }
    15. }

    16. /***********************************************************************************************************************
    17. **--Descriptions : 系统节拍定时器, ms表示多少毫秒中断一次
    18. **--2017-12-11 22:37:59
    19. ***********************************************************************************************************************/
    20. void Init_SysTick(uint32 Xms)
    21. {

    22.         (*(unsigned *)(0xE000E014)) = (SystemCoreClock/1000*Xms)-1;         // STRELOAD 系统定时器重载值寄存器
    23.         (*(unsigned *)(0xE000E018)) = 0x0;                                                                // STCURR        系统定时器当前值寄存器
    24.         (*(unsigned *)(0xE000E010)) = (0x1) | (0x1<<1) | (0x1<<2);                // STCTRL        系统定时器控制和状态寄存器

    25. }

    26. /***********************************************************************************************************************
    27. **--Descriptions : 主函数
    28. **--2019-05-18 20:26:26
    29. ***********************************************************************************************************************/
    30. int main(void)
    31. {

    32.         SystemCoreClockUpdate();
    33.        
    34.         Init_UART_BOOT(TYP_BAUD_57600);
    35.        
    36.         Init_SysTick(1);
    37.        
    38.         while(1){

    39.                 UART0_SendStr("123");
    40.                 DelayOneMs(1000);
    41.                 }

    42. }
    复制代码



    我知道答案 目前已有7人回答
    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

  • TA的每日心情
    郁闷
    2021-8-25 16:50
  • 签到天数: 57 天

    连续签到: 1 天

    [LV.5]常住居民I

    20

    主题

    185

    帖子

    12

    金牌会员

    Rank: 6Rank: 6

    积分
    1288
    最后登录
    2025-5-19
    发表于 2019-5-21 08:34:58 | 显示全部楼层
    跳转之前把systick中断关掉试试看
    签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2019-7-20 09:11
  • 签到天数: 7 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    30

    主题

    104

    帖子

    0

    高级会员

    Rank: 4

    积分
    642
    最后登录
    2019-12-2
    发表于 2019-5-21 09:18:48 | 显示全部楼层
    看中断异常向量表
    哎...今天够累的,签到来了~
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-11-29 15:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    19

    帖子

    1

    注册会员

    Rank: 2

    积分
    72
    最后登录
    2023-1-10
     楼主| 发表于 2019-5-21 10:53:18 | 显示全部楼层
    感谢各位!问题找到了。我试过跳转之前关闭SYSTICK,关闭所有外设,也试过关闭所有中断。都不行!
    后面我发现一个现象:之前我从BOOT跳到应用程序的时候都会区检查应用程序的扇区是否为空,如果不为空就跳转,后面因为应用需求有变,就把这个判断去掉了,然后有一次我忘记烧应用程序,启动了BOOT,按理BOOT此时应该跳到应用程序的地址执行,而那个地址现在实际是空的。那么此时会这么执行呢?结果是又从第0地址运行BOOT。
    然后我有在网上查到有人在应用程序的MAIN函数第一行有谢SCB->VTOR = 0x10000 & 0x1FFFFF80;这句。我加上这句问题就解决了。
    所以又有疑问了,我明明在KEIL里面有改应用程序的片内ROM起始地址为0x10000的,难道没生效?如果没生效那为什么只会影响SYSTICK呢?为什么不用它就没问题呢?
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-11-29 15:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    19

    帖子

    1

    注册会员

    Rank: 2

    积分
    72
    最后登录
    2023-1-10
     楼主| 发表于 2019-5-21 10:54:11 | 显示全部楼层
    不言而喻hgj 发表于 2019-5-21 08:34
    跳转之前把systick中断关掉试试看

    关掉没有用,但是在应用程序MAIN函数最开头加上SCB->VTOR = 0x10000 & 0x1FFFFF80;就好了
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2017-11-29 15:01
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    3

    主题

    19

    帖子

    1

    注册会员

    Rank: 2

    积分
    72
    最后登录
    2023-1-10
     楼主| 发表于 2019-5-21 10:54:45 | 显示全部楼层
    wbeast 发表于 2019-5-21 09:18
    看中断异常向量表

    在运用程序MAIN函数最前面加上SCB->VTOR = 0x10000 & 0x1FFFFF80;就好了
    哎...今天够累的,签到来了1...
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 10:11
  • 签到天数: 1846 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    203

    主题

    3万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    112622
    最后登录
    2025-7-19
    发表于 2019-5-25 13:12:16 | 显示全部楼层
    感谢分享你的解决方案
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    712

    主题

    6371

    帖子

    0

    超级版主

    Rank: 8Rank: 8

    积分
    24879
    最后登录
    2025-7-20
    发表于 2019-6-25 11:30:19 | 显示全部楼层
    乾蒙坤 发表于 2019-5-21 10:53
    感谢各位!问题找到了。我试过跳转之前关闭SYSTICK,关闭所有外设,也试过关闭所有中断。都不行!
    后面我发 ...

    感谢楼主的解决方案分享,修改ROM起始地址,你可以debug看看汇编的地址情况,是否真的修改了。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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

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

    GMT+8, 2025-7-20 20:35 , Processed in 0.104847 second(s), 28 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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