打印

STM32 带IAP程序时, STOP唤醒后出错的问题, 重新理清一下.

[复制链接]
6823|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jgphu|  楼主 | 2012-2-7 09:37 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 jgphu 于 2012-2-21 15:20 编辑

1. 首先说明, 我的APP程序进入STOP模式和从STOP模式唤醒是没有问题的(如果STM32只烧录APP程序时).

2. 其次说明, 当我的BOOT部分程序和APP部分程序都烧录到芯片后, 成功的从BOOT代码跳转到APP代码, 并且在APP代码运行时, 定时器中断/串口发送中断/CAN通信接收中断正常.(未进入STOP低功耗模式)

3. 问题是: 当我的芯片有BOOT部分程序和APP部分程序时, 进入STOP低功耗模式前, 将CAN模式停止, CAN RX设置为外部中断. 进入STOP低功耗模式, 然后通过CAN RX上的电平沿的变化就芯片唤醒, 唤醒后外部晶振起振, 但程序没有正常运行.

4. 两部分代码堆栈都是默认的;

define symbol __ICFEDIT_size_cstack__ = 0x200;
define symbol __ICFEDIT_size_heap__   = 0x000;



我的BOOT部分程序  中断向量起始为0X8000000
我的AP部分程序       中断向量起始为0X8010000

现在要烧两部分程序到STM32中, 包括BOOT和AP两部分. 有这两部分时, 只要进入到STOP模式, 外部中断退不出来STOP模式, 后来又用STANDBY模式也退不出来. 但是当用到WWDG的时候, 有外部中断的时候会引起WWDG复位.(因为有WWDG复位是不是可以说明STM32已退出STOP模式)

PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);
沙发
香水城| | 2012-2-7 10:27 | 只看该作者
有BOOT和AP两部分时,是在哪里进入到STOP模式的?

使用特权

评论回复
板凳
jgphu|  楼主 | 2012-2-7 10:31 | 只看该作者
BOOT部分只是一个STM32升级用的, 主要工作是与另一个ARM数据通信,然后烧写MCU.  如果没有升级则直接跳到APP部分, 现在就是直接跳到APP部分.

APP部分的程序 进的STOP程序.

使用特权

评论回复
地板
jgphu|  楼主 | 2012-2-7 10:32 | 只看该作者
顺便问一下, 能否在这种 HALT模式下 在线仿真?

使用特权

评论回复
5
jgphu|  楼主 | 2012-2-7 10:39 | 只看该作者
因为不能仿真, 也不知道问题出在哪里, 我想是不是进了FAULT 中断出不来了.

使用特权

评论回复
6
jgphu|  楼主 | 2012-2-7 10:41 | 只看该作者
为什么不带BOOT时候又没有问题呢?

使用特权

评论回复
7
jgphu|  楼主 | 2012-2-7 10:54 | 只看该作者
晕,  重新把芯片擦一下, 又烧录上又可以退出STOP模式了. 这回正常了.

使用特权

评论回复
8
jgphu|  楼主 | 2012-2-7 11:13 | 只看该作者
有时还是不行.不稳定啊

使用特权

评论回复
9
香水城| | 2012-2-7 11:25 | 只看该作者
怀疑你的中断向量设置可能有问题。

使用特权

评论回复
10
jgphu|  楼主 | 2012-2-7 11:35 | 只看该作者
我用示波器测试, 发现STOP模式后, 有外部中断时, 晶振已起振, 说明已经唤醒. 但程序运行非正常.

使用特权

评论回复
11
jgphu|  楼主 | 2012-2-7 11:42 | 只看该作者
如果中断向量设置有问题, 那要是不行就应该总是不行, 现在的情况是没有出现问题的时候, 定时器, 串口, CAN中断都正常.

使用特权

评论回复
12
香水城| | 2012-2-7 13:34 | 只看该作者
可以试试输出一些信息,看看唤醒之后程序跑到哪里去了。

也可以试试这段,看看能不能通过调试找到问题:

STM32_Low_Power_Debug_Mode.GIF (16.4 KB )

STM32_Low_Power_Debug_Mode.GIF

使用特权

评论回复
13
jgphu|  楼主 | 2012-2-8 11:07 | 只看该作者
更改了一下代码: DBGMCU->CR |= DBGMCU_CR_DBG_STOP; //新增加的 PWR_EnterSTOPMode(PWR_Regulator_ON, PWR_STOPEntry_WFI);

在线仿真是发现退出STOP后, 进入定时器初始化时, 程序总会跳入0x800262a这个地址执行. 但也会跳出来, 但时间比较长, 不像初始化其它外设时间短.

未命名.JPG (250.83 KB )

未命名.JPG

使用特权

评论回复
14
jgphu|  楼主 | 2012-2-8 11:19 | 只看该作者
发现是不是 0x800262a  是不是要进SP啊.

现在的程序是AP程序. 地址从0x8010000开始的.  SP地址是不是和BOOT部分是一样的?

未命名.JPG (36.29 KB )

未命名.JPG

使用特权

评论回复
15
jgphu|  楼主 | 2012-2-8 11:53 | 只看该作者
APP程序生成的MAP.

"A1":  place at 0x08010000 { ro section .intvec };
"P2":  place in [from 0x080100ec to 0x0801ffff] { ro };
"P3":  place in [from 0x20000000 to 0x20004fff] { rw, block CSTACK, block HEAP };

  Section            Kind        Address    Size  Object
  -------            ----        -------    ----  ------
"A1":                                      0x130
  .intvec            const    0x08010000   0x130  app_vect_v5.o [1]
                            - 0x08010130   0x130

"P2":                                     0x3814
  .text              ro code  0x08010130  0x12a0  bsp_iebus.o [1]
  .text              ro code  0x080113d0   0x348  bsp_uart.o [1]
  .text              ro code  0x08011718   0x5d4  stm32f10x_tim.o [1]
  .text              ro code  0x08011cec   0x242  stm32f10x_usart.o [1]
  .text              ro code  0x08011f2e    0x2e  copy_init3.o [4]
  .text              ro code  0x08011f5c   0x178  stm32f10x_rcc.o [1]
  .text              ro code  0x080120d4   0x408  bsp_can.o [1]
  .text              ro code  0x080124dc   0x3a4  stm32f10x_can.o [1]
  .text              ro code  0x08012880   0x2d4  app_vect_v5.o [1]
  .text              ro code  0x08012b54    0x20  stm32f10x_wwdg.o [1]
  .text              ro code  0x08012b74    0xec  stm32f10x_exti.o [1]
  .text              ro code  0x08012c60   0x2a8  bsp_gpio.o [1]
  .text              ro code  0x08012f08   0x1a8  stm32f10x_gpio.o [1]
  .text              ro code  0x080130b0   0x274  bsp_time.o [1]
  .text              ro code  0x08013324   0x164  system_stm32f10x.o [1]
  .text              ro code  0x08013488   0x148  bsp.o [1]
  .text              ro code  0x080135d0    0x98  misc.o [1]
  .text              ro code  0x08013668    0xe8  app.o [1]
  .text              ro code  0x08013750    0x50  stm32f10x_pwr.o [1]
  .text              ro code  0x080137a0    0x2c  data_init3.o [4]
  .text              ro code  0x080137cc    0x22  zero_init3.o [4]
  .iar.init_table    const    0x080137f0    0x24  - Linker created -
  .text              ro code  0x08013814    0x16  cmain.o [4]
  .text              ro code  0x0801382a     0x4  low_level_init.o [3]
  .text              ro code  0x0801382e     0x8  exit.o [3]
  .text              ro code  0x08013838     0xa  cexit.o [4]
  .text              ro code  0x08013844    0x14  exit.o [5]
  .text              ro code  0x08013858     0xc  cstartup_M.o [4]
  Initializer bytes  ro data  0x08013864    0xe0  <for P3 s0>
                            - 0x08013944  0x3814

"P3", part 1 of 3:                          0xe0
  P3 s0                       0x20000000    0xe0  <Init block>
    .data            inited   0x20000000    0x10  bsp_iebus.o [1]
    .data            inited   0x20000010    0x10  bsp_iebus.o [1]
    .data            inited   0x20000020    0x10  bsp_iebus.o [1]
    .data            inited   0x20000030    0x10  stm32f10x_rcc.o [1]
    .data            inited   0x20000040     0xc  bsp_iebus.o [1]
    .data            inited   0x2000004c     0xc  bsp_iebus.o [1]
    .data            inited   0x20000058     0x8  app.o [1]
    .data            inited   0x20000060     0x8  bsp_iebus.o [1]
    .data            inited   0x20000068     0x8  bsp_iebus.o [1]
    .data            inited   0x20000070     0x8  bsp_iebus.o [1]
    .data            inited   0x20000078     0x8  bsp_iebus.o [1]
    .data            inited   0x20000080     0x8  bsp_iebus.o [1]
    .data            inited   0x20000088     0x8  bsp_iebus.o [1]
    .data            inited   0x20000090     0x8  bsp_iebus.o [1]
    .data            inited   0x20000098     0x8  bsp_uart.o [1]
    .data            inited   0x200000a0     0x8  bsp_uart.o [1]
    .data            inited   0x200000a8     0x8  bsp_uart.o [1]
    .data            inited   0x200000b0     0x8  bsp_uart.o [1]
    .data            inited   0x200000b8     0x8  bsp_uart.o [1]
    .data            inited   0x200000c0     0x8  bsp_uart.o [1]
    .data            inited   0x200000c8     0x4  bsp_iebus.o [1]
    .data            inited   0x200000cc     0x4  stm32f10x_rcc.o [1]
    .data            inited   0x200000d0     0x4  system_stm32f10x.o [1]
    .data            inited   0x200000d4     0x2  app.o [1]
    .data            inited   0x200000d6     0x2  bsp_iebus.o [1]
    .data            inited   0x200000d8     0x2  bsp_iebus.o [1]
    .data            inited   0x200000da     0x2  bsp_iebus.o [1]
    .data            inited   0x200000dc     0x2  bsp_iebus.o [1]
    .data            inited   0x200000de     0x1  bsp_iebus.o [1]
    .data            inited   0x200000df     0x1  bsp_iebus.o [1]
                            - 0x200000e0    0xe0

"P3", part 2 of 3:                        0x3548
  .bss               zero     0x200000e0  0x1ef0  bsp_iebus.o [1]
  .bss               zero     0x20001fd0  0x14a0  bsp_iebus.o [1]
  .bss               zero     0x20003470    0x80  bsp_uart.o [1]
  .bss               zero     0x200034f0    0x80  bsp_uart.o [1]
  .bss               zero     0x20003570    0x14  bsp_can.o [1]
  .bss               zero     0x20003584    0x10  bsp_can.o [1]
  .bss               zero     0x20003594    0x10  bsp_time.o [1]
  .bss               zero     0x200035a4    0x10  bsp_uart.o [1]
  .bss               zero     0x200035b4     0xc  bsp_can.o [1]
  .bss               zero     0x200035c0     0xc  bsp_time.o [1]
  .bss               zero     0x200035cc     0xc  bsp_time.o [1]
  .bss               zero     0x200035d8     0x8  bsp_gpio.o [1]
  .bss               zero     0x200035e0     0x4  bsp_gpio.o [1]
  .bss               zero     0x200035e4     0x4  bsp_iebus.o [1]
  .bss               zero     0x200035e8     0x4  bsp_iebus.o [1]
  .bss               zero     0x200035ec     0x4  bsp_iebus.o [1]
  .bss               zero     0x200035f0     0x2  app_vect_v5.o [1]
  .bss               zero     0x200035f2     0x2  app_vect_v5.o [1]
  .bss               zero     0x200035f4     0x2  bsp_iebus.o [1]
  .bss               zero     0x200035f6     0x2  bsp_iebus.o [1]
  .bss               zero     0x200035f8     0x2  bsp_iebus.o [1]
  .bss               zero     0x200035fa     0x2  bsp_iebus.o [1]
  .bss               zero     0x200035fc     0x2  bsp_iebus.o [1]
  .bss               zero     0x200035fe     0x2  bsp_uart.o [1]
  .bss               zero     0x20003600     0x2  bsp_uart.o [1]
  .bss               zero     0x20003602     0x2  bsp_uart.o [1]
  .bss               zero     0x20003604     0x2  bsp_uart.o [1]
  .bss               zero     0x20003606     0x2  bsp_uart.o [1]
  .bss               zero     0x20003608     0x1  app_vect_v5.o [1]
  .bss               zero     0x20003609     0x1  app_vect_v5.o [1]
  .bss               zero     0x2000360a     0x1  app_vect_v5.o [1]
  .bss               zero     0x2000360b     0x1  app_vect_v5.o [1]
  .bss               zero     0x2000360c     0x1  bsp_can.o [1]
  .bss               zero     0x2000360d     0x1  bsp_can.o [1]
  .bss               zero     0x2000360e     0x1  bsp_can.o [1]
  .bss               zero     0x2000360f     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003610     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003611     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003612     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003613     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003614     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003615     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003616     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003617     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003618     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003619     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361a     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361b     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361c     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361d     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361e     0x1  bsp_iebus.o [1]
  .bss               zero     0x2000361f     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003620     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003621     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003622     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003623     0x1  bsp_iebus.o [1]
  .bss               zero     0x20003624     0x1  bsp_uart.o [1]
  .bss               zero     0x20003625     0x1  bsp_uart.o [1]
                            - 0x20003626  0x3546

"P3", part 3 of 3:                         0x200
  CSTACK                      0x20003628   0x200  <Block>
    CSTACK           uninit   0x20003628   0x200  <Block tail>
                            - 0x20003828   0x200


*******************************************************************************
*** INIT TABLE
***

          Address     Size
          -------     ----
Zero (__iar_zero_init3)
    1 destination range, total size 0x3546:
          0x200000e0  0x3546

Copy (__iar_copy_init3)
    1 source range, total size 0xe0:
          0x08013864    0xe0
    1 destination range, total size 0xe0:
          0x20000000    0xe0


*******************************************************************************

使用特权

评论回复
16
香水城| | 2012-2-8 11:54 | 只看该作者
按照14楼的提示,请检查一下从BOOT程序进入AP程序后,是否正确地重新设置了堆栈指针?

要知道不同的2个项目,初始堆栈指针通常是不一样的。

使用特权

评论回复
17
jgphu|  楼主 | 2012-2-8 11:55 | 只看该作者
BOOT 程序生成的MAP

*******************************************************************************
*** PLACEMENT SUMMARY
***

"A1":  place at 0x08000000 { ro section .intvec };
"P2":  place in [from 0x08000000 to 0x0800ffff] { ro };
"P3":  place in [from 0x20000000 to 0x20004fff] { rw, block CSTACK, block HEAP };

  Section             Kind        Address    Size  Object
  -------             ----        -------    ----  ------
"A1":                                       0x130
  .intvec             const    0x08000000   0x130  app_vect_v5.o [1]
                             - 0x08000130   0x130

"P2":                                      0x45b4
  .text               ro code  0x08000130  0x12ec  dlmalloc.o [3]
  .text               ro code  0x0800141c     0xa  abort.o [3]
  .text               ro code  0x08001426    0x2e  copy_init3.o [5]
  .text               ro code  0x08001454    0x28  xgetmemchunk.o [3]
  .text               ro code  0x0800147c    0xb4  xsyslock.o [3]
  .text               ro code  0x08001530    0x14  exit.o [6]
  .text               ro code  0x08001544     0x4  xmtx2.o [3]
  .text               ro code  0x08001548     0x8  xmtx.o [3]
  .text               ro code  0x08001550  0x1076  xprintffull.o [3]
  .text               ro code  0x080025c6    0x20  xmbtowc.o [3]
  .text               ro code  0x080025e6    0x22  zero_init3.o [5]
  .text               ro code  0x08002608    0x16  strchr.o [5]
  .text               ro code  0x0800261e     0xe  app_vect_v5.o [1]
  .text               ro code  0x0800262c    0x58  memchr.o [5]
  .text               ro code  0x08002684    0x36  strlen.o [5]
  .text               ro code  0x080026ba     0xa  xmbcurmax.o [3]
  .text               ro code  0x080026c4    0x1a  xwctomb.o [3]
  .text               ro code  0x080026e0    0x70  ABImemcpy.o [5]
  .text               ro code  0x08002750   0x12e  I64DivMod.o [5]
  .text               ro code  0x08002880    0x44  xdnorm.o [4]
  .text               ro code  0x080028c4    0x2e  DblCmpLe.o [4]
  .text               ro code  0x080028f4    0x2e  DblCmpGe.o [4]
  .text               ro code  0x08002924   0x118  xdscale.o [4]
  .text               ro code  0x08002a3c    0x56  DblToI32.o [4]
  .text               ro code  0x08002a94    0x2e  I32ToDbl.o [4]
  .text               ro code  0x08002ac4   0x17e  DblSub.o [4]
  .text               ro code  0x08002c44   0x1a2  DblMul.o [4]
  .text               ro code  0x08002de8   0x246  DblDiv.o [4]
  .text               ro code  0x08003030    0x6c  localeconv.o [3]
  .text               ro code  0x0800309c     0xe  div.o [3]
  .text               ro code  0x080030ac    0x14  setlocale.o [3]
  .text               ro code  0x080030c0    0x5c  xencoding_sb.o [3]
  .text               ro code  0x0800311c     0x2  I64DivZer.o [5]
  .text               ro code  0x08003120    0xe6  DblAdd.o [4]
  .text               ro code  0x08003206     0x2  xtls.o [3]
  .text               ro code  0x08003208   0x7c8  app.o [1]
  .text               ro code  0x080039d0   0x164  system_stm32f10x.o [1]
  .text               ro code  0x08003b34    0x44  bsp.o [1]
  .text               ro code  0x08003b78    0x24  printf.o [3]
  .text               ro code  0x08003b9c   0x190  stm32f10x_rcc.o [1]
  .text               ro code  0x08003d2c   0x118  stm32f10x_usart.o [1]
  .text               ro code  0x08003e44    0xc4  bsp_time.o [1]
  .text               ro code  0x08003f08   0x10c  stm32f10x_tim.o [1]
  .text               ro code  0x08004014    0xa8  bsp_uart.o [1]
  .text               ro code  0x080040bc   0x17c  stm32f10x_flash.o [1]
  .text               ro code  0x08004238     0x8  core_cm3.o [1]
  .text               ro code  0x08004240   0x1f8  bsp_gpio.o [1]
  .text               ro code  0x08004438   0x154  stm32f10x_gpio.o [1]
  .text               ro code  0x0800458c    0x2c  data_init3.o [5]
  .iar.init_table     const    0x080045b8    0x24  - Linker created -
  .text               ro code  0x080045dc    0x16  cmain.o [5]
  .text               ro code  0x080045f2     0x4  low_level_init.o [3]
  .text               ro code  0x080045f6     0x8  exit.o [3]
  .text               ro code  0x08004600     0xe  cexit.o [5]
  .text               ro code  0x0800460e    0x16  xprout.o [3]
  .text               ro code  0x08004624     0xc  putchar.o [3]
  .text               ro code  0x08004630     0xc  cstartup_M.o [5]
  .text               ro code  0x0800463c     0x0  cstart_clearlocks.o [5]
  Initializer bytes   ro data  0x0800463c    0xa8  <for P3 s0>
                             - 0x080046e4  0x45b4

"P3", part 1 of 3:                           0xa8
  P3 s0                        0x20000000    0xa8  <Init block>
    __DLIB_PERTHREAD  inited   0x20000000    0x50  localeconv.o [3]
    .data             inited   0x20000050    0x40  xfiles.o [3]
    .data             inited   0x20000090    0x10  stm32f10x_rcc.o [1]
    .data             inited   0x200000a0     0x4  stm32f10x_rcc.o [1]
    .data             inited   0x200000a4     0x4  system_stm32f10x.o [1]
                             - 0x200000a8    0xa8

"P3", part 2 of 3:                          0x370
  .bss                zero     0x200000a8   0x1d4  dlmalloc.o [3]
  __DLIB_PERTHREAD    zero     0x2000027c    0x74  setlocale.o [3]
  .bss                zero     0x200002f0    0x50  xfiles.o [3]
  .bss                zero     0x20000340    0x38  xsyslock.o [3]
  .bss                zero     0x20000378    0x2c  app.o [1]
  .bss                zero     0x200003a4    0x2c  bsp_uart.o [1]
  .bss                zero     0x200003d0    0x18  dlmalloc.o [3]
  .bss                zero     0x200003e8    0x10  bsp_uart.o [1]
  .bss                zero     0x200003f8     0xc  bsp_time.o [1]
  .bss                zero     0x20000404     0x4  app.o [1]
  .bss                zero     0x20000408     0x4  app.o [1]
  .bss                zero     0x2000040c     0x4  bsp_gpio.o [1]
  .bss                zero     0x20000410     0x4  xgetmemchunk.o [3]
  .bss                zero     0x20000414     0x2  app.o [1]
                             - 0x20000416   0x36e

"P3", part 3 of 3:                          0x200
  CSTACK                       0x20000418   0x200  <Block>
    CSTACK            uninit   0x20000418   0x200  <Block tail>
  HEAP                         0x20000618     0x0  <Block>
                             - 0x20000618   0x200


*******************************************************************************
*** INIT TABLE
***

          Address     Size
          -------     ----
Zero (__iar_zero_init3)
    1 destination range, total size 0x36e:
          0x200000a8  0x36e

Copy (__iar_copy_init3)
    1 source range, total size 0xa8:
          0x0800463c   0xa8
    1 destination range, total size 0xa8:
          0x20000000   0xa8


*******************************************************************************
*** MODULE SUMMARY

使用特权

评论回复
18
香水城| | 2012-2-8 12:15 | 只看该作者
不要贴这么长的代码,你自己看看比较一下"P3", part 3 of 3这部分就好了。

使用特权

评论回复
19
jgphu|  楼主 | 2012-2-8 12:42 | 只看该作者
请问如何正确地重新设置了堆栈指针? 这部分我没有处理.

现在是两个部分程序FLASH有分区.  但RAM是重叠的. 堆栈是在RAM里分好的.还要重新设置什么吗?

使用特权

评论回复
20
香水城| | 2012-2-8 14:36 | 只看该作者
已经基本断定是堆栈指针的设置问题。

至于怎么正确地重新设置堆栈指针,LZ可以参考编译器自带的启动文件,我不太清楚。

使用特权

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

本版积分规则

7

主题

642

帖子

2

粉丝