首页 论坛 原厂专区 ST MCU STM8S207C8 class B库的自检程序调用汇编返回异常

发帖 回复

[求助] STM8S207C8 class B库的自检程序调用汇编返回异常
2004 查看
16 回复
 楼主 | 发布于 2018-09-07 | 只看楼主
分享到:
由于代理商没有提供技术支持,在应用STM8S207C8设计的产品需要用到自检程序,在调用官方提供的class B库时,调用到有汇编的自检程序时,出现无法返回的异常!具体描述问题如下:

IDE编译器平台:IAR  3.10.4
芯片:STM8S207C8
应用此款单片机在产品设计当中需要过UL1998认证,从官网提供的class B函数库用来做自检程序中碰到问题:
1.
当程序调用到如下函数时,不能返回:
/*--------------------------------------------------------------------------*/

  /*------------------- CPU registers and Flags Self Test --------------------*/

  /*--------------------------------------------------------------------------*/

  /* WARNING: all registers destroyed when exiting this function */

 

  /* Initializes counter for control flow monitoring */

  CtrlFlowCnt = CPU_POR_CALLER;

  CtrlFlowCntInv = 0xFFFFu;

 

  #ifdef STL_INCL_POR_CPU

    if (STL_StartUpCPUTest() != CPUTEST_SUCCESS)    ////标注的红色函数调用后不能返回

    {

      fail_safe_assert( 0x00u, "Start-up CPU Test Failure\n\r");

    }

    else  /* Test OK */

    {

      /* If else statement is not executed, it will be detected by control flow monitoring */

      CtrlFlowCntInv -= CPU_POR_CALLER;

      #ifdef STL_VERBOSE_POR

        printf("\n\rStart-up CPU Test OK\n\r");

      #endif /* STL_VERBOSE_POR */

    }

  #endif /* STL_INCL_POR_CPU */

 

STL_StartUpCPUTest()为汇编语言编定的函数,程序运行到ret语句,报硬fault: ILLOPF置位。

 

2.当程序调用到如下函数时,不能返回:
#ifdef STL_INCL_POR_RAM

    #if defined (EVAL_BOARD_CONTROL)

      BSP_LED_On(LED_VLM);

    #endif /* EVAL_BOARD_CONTROL */

   

    /* WARNING: All the stack space is zero-initialized when exiting from this routine */

    if (STL_FullRamMarchC() != FULL_RAM_OK)      ////标注的红色函数调用后不能返回

    {

      fail_safe_assert( 0x03u, "RAM Test Failure");

    }

    #ifdef STL_VERBOSE_POR

      printf("Full RAM Test OK\n\r");

    #endif /* STL_VERBOSE_POR */

 

    /* Note, control flow variables are cleared inside the RAM test routine and  */

    /* re-initialized before return to check correct passing of the test */

 

    #if defined (EVAL_BOARD_CONTROL)

      BSP_LED_Off(LED_VLM);

    #endif /* EVAL_BOARD_CONTROL */

       

  #else /* test is not included */

    CtrlFlowCnt = 0u;     /* reinit control flow variables */

    CtrlFlowCntInv = 0xFFFFu; 

  #endif /* STL_INCL_POR_RAM */

 

问题点:其它用C编写的自检函数,调用后无异常,此两处需要调用到的这两个用汇编语言编写的自检函数无论如何均不能返回。感觉只要是调用汇编编写的自检函数,都无法ret!因为产品要做认证时需要用到自检程序,希望STFAE能提供协助,万分感谢!

(0 ) (0 )
回复 举报

楼主 | 回复于 2018-09-07 沙发

if (STL_StartUpCPUTest() != CPUTEST_SUCCESS)   

运行到  STL_StartUpCPUTest() 程序无法返回, STL_StartUpCPUTest()是汇编代码

 if (STL_FullRamMarchC() != FULL_RAM_OK)      
运行到  STL_FullRamMarchC() 程序无法返回, STL_StartUpCPUTest()是汇编代码

(0 )
评论 (0) 举报

回复于 2018-09-07 2#

STL_StartUpCPUTes函数里写的什么内容呢?

查了下这个函数不是ST的自带函数好像


(0 )
评论 (1) 举报

回复于 2018-09-07 3#

也可以发邮件给:

mcu.china@st.com

并抄送给我:zhm@digiic.com
(0 )
评论 (0) 举报

楼主 | 回复于 2018-09-07 4#

   name    StartUpCPUTestcode
    public  STL_StartUpCPUTest
    extern  CtrlFlowCnt
    extern  CtrlFlowCntInv
    extern  FailSafe
    section .text:code

STL_StartUpCPUTest:
    LDW X,CtrlFlowCnt
    ADDW    X,#3        ; CtrlFlowCnt += CPU_INIT_CALLEE
    LDW CtrlFlowCnt,x
    ; If X is not functional, corruption will be detected later
;
    ; Check flags of code condition register
    CLR   A               ; Set Z(ero) Flag
    JRNE  ErrorCPU        ; Fails if Z=0
    LD    A,#1            ; Reset Z Flag
    JREQ  ErrorCPU        ; Fails if Z=1
;   
    SUB   A,#2            ; Set N(egative) Flag (A=0xFF)
    JRPL  ErrorCPU        ; Fails if N=0
    ADD   A,#2            ; Reset N and set C Flags (Res=0x101)
    JRMI  ErrorCPU        ; Fails if N=1
;
    RCF                   ; Reset C(arry) Flag
    JRC   ErrorCPU        ; Fails if C=1
    SCF                   ; Set C(arry) Flag
    JRNC  ErrorCPU        ; Fails if C=0
;
    ADD   A,#0FH          ; Set H(alf) carry Flag (A=0x10)
    JRNH  ErrorCPU        ; Fails if H=0
    ADD   A,#0FH          ; Reset H(alf) carry Flag (A=0x1F)
    JRH   ErrorCPU        ; Fails if H=1
;
    LD    A,#80H
    ADD   A,#80H          ; Set V (oVerflow) Flag (Res=0x100)
    JRNV  ErrorCPU        ; Fails if V=0
    RVF                   ; Reset V Flag
    JRV   ErrorCPU        ; Fails if V=1
;
    SIM                   ; Set interrupt mask
    JRNM  ErrorCPU        ; Fails if I0=0
    RIM                   ; Reset I0 bit
    JRNM  skip            ; If I0=O, skip next instruction
  
ErrorCPU:
    LDW   X,#0            ; Error Code if spurious return
    JP    FailSafe
  
skip:
    SIM                 ; Set I0 bit (mask interrupts)
;   
    ; Check CPU register: A, X, Y
    LD    A,#0AAH
    CP    A, #0AAH
    JRNE  ErrorCPU
    LD    A,#55H
    CP    A,#55H
    JRNE  ErrorCPU
    LD    A,#11H
;   
    LDW   X,#0AAAAH
    CPW   X,#0AAAAH
    JRNE  ErrorCPU
    LDW   X,#5555H
    CPW   X,#5555H
    JRNE  ErrorCPU
    LDW   X,#1234H
;
    LDW   Y,#0AAAAH
    CPW   Y,#0AAAAH
    JRNE  ErrorCPU
    LDW   Y,#5555H
    CPW   Y,#5555H
    JRNE  ErrorCPU
    LDW   Y,#5678H
;   
    ; Verify ramp pattern
    CP    A,#11H
    JRNE  ErrorCPU
    CPW   X,#1234H
    JRNE  ErrorCPU
    CPW   Y,#5678H
    JRNE  ErrorCPU
;   
    ; Check Stack pointer
    LDW   Y,SP            ; Save current stack pointer in Y
    LDW   X,#5555H
    LDW   SP,X
    LDW   X,SP
    CPW   X,#5555H
    JRNE  ErrorCPU
    LDW   X,#0AAAAH
    LDW   SP,X
    LDW   X,SP
    CPW   X,#0AAAAH
    JRNE  ErrorCPU
    LDW   SP,Y            ; Restore stack pointer
;
Exit:
    LDW   X,CtrlFlowCntInv
    SUBW  X,#3            ; CtrlFlowCntInv -= CPU_INIT_CALLEE
    LDW   CtrlFlowCntInv,X
    LD    A,#1            ; Returns success
    RET
;
    END
(0 )
评论 (0) 举报

楼主 | 回复于 2018-09-07 5#

邮件已发出,请查收!谢谢
(0 )
评论 (0) 举报

回复于 2018-09-07 6#

    1、应该是你这个函数哪里问题,STL_StartUpCPUTest(),执行里面的指令RET出错;
                RET指令本身没有问题,应该是你这个函数其它语句问题导致的硬件出错;
                比如硬件初始化哪里的设置问题,堆栈溢出等都可能会引起;
                注释掉这个函数里面的一句句,分别测试哪句引起,注意排查      
(0 )
评论 (1) 举报

回复于 2018-09-07 7#

多谢分享!!!
(0 )
评论 (0) 举报

楼主 | 回复于 2018-09-10 8#

难道有用户在用这个片子做认证时,没有碰到过类似的问题?


(0 )
评论 (0) 举报

回复于 2018-09-10 9#

汇编看不懂呀。。。
(0 )
评论 (0) 举报

回复于 2018-09-12 10#

汇编……
(0 )
评论 (0) 举报
发表回复
0/3000





举报

请选择举报类别

  • 广告垃圾
  • 违规内容
  • 恶意灌水
  • 重复发帖

全部板块

返回顶部