![]() |
Energy Micro IEC60355 Library Example Project 1.0 (internal use only!) GCC-Version
Example project demonstrating POST and BIST library functions
|
00001 ;/***************************************************************************/ 00030 .text 00031 00032 .syntax unified 00033 .global ASMCPUregTestPOST 00034 .type ASMCPUregTestPOST , function 00035 00036 .equ testState , 0 00037 .equ testResult , 4 00038 00039 .equ pattern1 , 0xAAAAAAAA 00040 .equ pattern2 , 0xAAAAAAA8 00041 .equ pattern3 , 0x55555555 00042 .equ pattern4 , 0x55555554 00043 .equ pattern5 , 0xA8000000 00044 .equ pattern6 , 0x50000000 00045 .equ pattern7 , 0x000000A0 00046 .equ pattern8 , 0x00000060 00047 00048 .equ TestClear , 0x00000000 00049 .equ TestState_r0 , 0x00000010 00050 .equ TestState_r1r7 , 0x00000020 00051 .equ TestState_r8r12 , 0x00000040 00052 .equ TestStateMSP , 0x00000100 00053 .equ TestStatePSP , 0x00000200 00054 .equ TestStateLR , 0x00000400 00055 .equ TestStateAPSR , 0x00000800 00056 .equ TestStatePRIMASK , 0x00001000 00057 .equ TestStateFAULTMASK , 0x00002000 00058 .equ TestStateBASEPRI , 0x00004000 00059 00060 .equ TestResult_fail , 0 00061 .equ TestResult_pass , 1 00062 00063 ;/* CPU register test */ 00064 .thumb 00065 .thumb_func 00066 ASMCPUregTestPOST: 00067 ;/* push registers to stack (atomic instruction) */ 00068 push {r0-r12,r14} 00069 mov r12, lr 00070 cmp r12, lr 00071 bne.w Test_CPU_SFR_fail 00072 00073 ;/* clear IEC60335_CPUregTestPOST */ 00074 ldr r0, =TestClear 00075 ldr r8, =TestState_r0 00076 ldr r9, =IEC60335_CPUregTestPOST 00077 str r8, [r9,#testState] 00078 str r0, [r9,#testResult] 00079 00080 ;/* registers r0-r7 tests */ 00081 Test_r0: 00082 ;/* register r0 test: 00083 ; * r0 is tested first by immediate instructions 00084 ; * r0 is tested first to keep it free for the following tests */ 00085 ;/* cmp instruction to compare with immediate values 00086 ; * byte test requires shift to the LSB */ 00087 00088 ;/* r0[31:24] */ 00089 movw r0, #0x0000 00090 movt r0, #0xAA00 00091 lsr r0, r0, #24 00092 cmp r0, #0xAA 00093 bne.w Test_r0_Exit 00094 ;/* r0[23:16] */ 00095 movw r0, #0x0000 00096 movt r0, #0x00AA 00097 lsr r0, r0, #16 00098 cmp r0, #0xAA 00099 bne.w Test_r0_Exit 00100 ;/* r0[15:8] */ 00101 movw r0, #0xAA00 00102 lsr r0, r0, #8 00103 cmp r0, #0xAA 00104 bne.w Test_r0_Exit 00105 ;/* r0[7:0] */ 00106 movw r0, #0x00AA 00107 cmp r0, #0xAA 00108 bne.w Test_r0_Exit 00109 00110 ;/* use inverse pattern */ 00111 ;/* r0[31:24] */ 00112 movw r0, #0x0000 00113 movt r0, #0x5500 00114 lsr r0, r0, #24 00115 cmp r0, #0x55 00116 bne.w Test_r0_Exit 00117 ;/* test r0[23:16] */ 00118 movw r0, #0x0000 00119 movt r0, #0x0055 00120 lsr r0, r0, #16 00121 cmp r0, #0x55 00122 bne.w Test_r0_Exit 00123 ;/* test r0[15:8] */ 00124 movw r0, #0x5500 00125 lsr r0, r0, #8 00126 cmp r0, #0x55 00127 bne.w Test_r0_Exit 00128 ;/* test r0[7:0] */ 00129 movw r0, #0x0055 00130 cmp r0, #0x55 00131 bne.w Test_r0_Exit 00132 00133 ;/* mark r0 as passed by calling next test */ 00134 Test_r0_pass: 00135 ;/* continue with result */ 00136 b Test_r1_r7 00137 00138 Test_r1_r7: 00139 ;/* register r1-r7 test: 00140 ; * step 1: 00141 ; * each registers will be written with pattern1 = 0xAAAA.AAAA 00142 ; * each register will be compared to r0 for the test. 00143 ; * step 2: 00144 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the 00145 ; * register and compared to r0 */ 00146 00147 ;/* clear IEC60335_CPUregTestPOST */ 00148 ldr r8, =TestState_r1r7 00149 ldr r7, [r9] 00150 orr r8, r8, r7 00151 str r8, [r9,#testState] 00152 00153 ;/* load pattern1 to r0 */ 00154 ldr r0, =pattern1 00155 ;/* load pattern1 to r1-r7 */ 00156 mov r1, r0 00157 mov r2, r0 00158 mov r3, r0 00159 mov r4, r0 00160 mov r5, r0 00161 mov r6, r0 00162 mov r7, r0 00163 ;/* test pattern1 */ 00164 cmp r1, r0 00165 bne.w Test_r1_r7_Exit 00166 cmp r2, r0 00167 bne.w Test_r1_r7_Exit 00168 cmp r3, r0 00169 bne.w Test_r1_r7_Exit 00170 cmp r4, r0 00171 bne.w Test_r1_r7_Exit 00172 cmp r5, r0 00173 bne.w Test_r1_r7_Exit 00174 cmp r6, r0 00175 bne.w Test_r1_r7_Exit 00176 cmp r7, r0 00177 bne.w Test_r1_r7_Exit 00178 00179 ;/* load pattern3 to r0 */ 00180 ldr r0, =pattern3 00181 ;/* load pattern3 to r1-r7 */ 00182 mov r1, r0 00183 mov r2, r0 00184 mov r3, r0 00185 mov r4, r0 00186 mov r5, r0 00187 mov r6, r0 00188 mov r7, r0 00189 ;/* test pattern3 */ 00190 cmp r1, r0 00191 bne.w Test_r1_r7_Exit 00192 cmp r2, r0 00193 bne.w Test_r1_r7_Exit 00194 cmp r3, r0 00195 bne.w Test_r1_r7_Exit 00196 cmp r4, r0 00197 bne.w Test_r1_r7_Exit 00198 cmp r5, r0 00199 bne.w Test_r1_r7_Exit 00200 cmp r6, r0 00201 bne.w Test_r1_r7_Exit 00202 cmp r7, r0 00203 bne.w Test_r1_r7_Exit 00204 00205 Test_r1_r7_pass: 00206 ;/* continue with result */ 00207 b Test_r8_r12 00208 00209 ;/* registers r8-r12 tests */ 00210 Test_r8_r12: 00211 ;/* step 1: 00212 ; * each registers will be written with pattern1 = 0xAAAA.AAAA 00213 ; * each register will be compared to r0 for the test. 00214 ; * step 2: 00215 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the 00216 ; * register and compared to r0 */ 00217 00218 ;/* save LR to r3 */ 00219 mov r3, r12 00220 ;/* load IEC60335_CPUregTestPOST with test state */ 00221 ldr r5, =TestState_r8r12 00222 ldr r6, =IEC60335_CPUregTestPOST 00223 ldr r7, [r6] 00224 orr r5, r5, r7 00225 str r5, [r6,#testState] 00226 00227 ;/* load pattern1 to r0 */ 00228 ldr r0, =pattern1 00229 ;/* load pattern1 to r8-r12 */ 00230 mov r8, r0 00231 mov r9, r0 00232 mov r10, r0 00233 mov r11, r0 00234 mov r12, r0 00235 ;/* test patter1 */ 00236 cmp r8, r0 00237 bne.w Test_r8_r12_Exit 00238 cmp r9, r0 00239 bne.w Test_r8_r12_Exit 00240 cmp r10, r0 00241 bne.w Test_r8_r12_Exit 00242 cmp r11, r0 00243 bne.w Test_r8_r12_Exit 00244 cmp r12, r0 00245 bne.w Test_r8_r12_Exit 00246 00247 ;/* load pattern3 to r0 */ 00248 ldr r0, =pattern3 00249 ;/* load pattern3 to r8-r12 */ 00250 mov r8, r0 00251 mov r9, r0 00252 mov r10, r0 00253 mov r11, r0 00254 mov r12, r0 00255 ;/* test pattenr3 */ 00256 cmp r8, r0 00257 bne.w Test_r8_r12_Exit 00258 cmp r9, r0 00259 bne.w Test_r8_r12_Exit 00260 cmp r10, r0 00261 bne.w Test_r8_r12_Exit 00262 cmp r11, r0 00263 bne.w Test_r8_r12_Exit 00264 cmp r12, r0 00265 bne.w Test_r8_r12_Exit 00266 00267 Test_r8_r12_pass: 00268 ;/* restore LR */ 00269 mov r12, r3 00270 ;/* continue with result */ 00271 b Test_MSP 00272 00273 Test_r8_r12_Exit: 00274 ;/* restore LR */ 00275 mov r12, r3 00276 b Test_CPU_SFR_fail 00277 00278 ;/* MainSP test: */ 00279 Test_MSP: 00280 ;/* step 1: 00281 ; * select the MSP as stack pointer and 00282 ; * use mov command to read/write with different pattern 00283 ; * compare to r0 for the test. 00284 ; * step 2: 00285 ; * use mrs/msr command to read/write with different pattern 00286 ; * register and compared to r0 00287 ; * MSP[1:0] is always read as zero */ 00288 00289 ;/* save the CONTROL register value */ 00290 mrs r3, CONTROL 00291 ;/* load IEC60335_CPUregTestPOST with test state */ 00292 ldr r8, =TestStateMSP 00293 ldr r9, =IEC60335_CPUregTestPOST 00294 ldr r10, [r9] 00295 orr r8, r8, r10 00296 str r8, [r9,#testState] 00297 00298 ;/* set MSP as default stack */ 00299 mov r6, #0x0 00300 msr CONTROL, r6 00301 ;/* save current MSP content */ 00302 mov r4, r13 00303 00304 ;/* verify MSP as stack pointer */ 00305 mrs r5, MSP 00306 cmp r4, r5 00307 bne Test_MSP_Exit 00308 00309 ;/* load pattern2 to MSP */ 00310 ldr r0, =pattern2 00311 mov r13, r0 00312 ;/* compare with r0 */ 00313 cmp r13, r0 00314 bne Test_MSP_Exit 00315 00316 ;/* load pattern4 to MSP */ 00317 ldr r0, =pattern4 00318 mov r13, r0 00319 ;/* compare with r0 */ 00320 cmp r13, r0 00321 bne Test_MSP_Exit 00322 00323 ;/* load pattern2 to MSP and read back r1 */ 00324 ldr r0, =pattern2 00325 msr MSP, r0 00326 mrs r1, MSP 00327 ;/* compare r1 with r0 (indirect) */ 00328 cmp r1, r0 00329 bne Test_MSP_Exit 00330 00331 ;/* load pattern4 to MSP and read back r1 */ 00332 ldr r0, =pattern4 00333 msr MSP, r0 00334 mrs r1, MSP 00335 ;/* compare r1 with r0 (indirect) */ 00336 cmp r1, r0 00337 bne Test_MSP_Exit 00338 00339 Test_MSP_pass: 00340 ;/* restore MSP and CONTROL */ 00341 mov r13, r4 00342 msr CONTROL, r3 00343 ;/* continue with result */ 00344 b Test_PSP 00345 00346 Test_MSP_Exit: 00347 ;/* restore MSP and CONTROL */ 00348 mov r13, r4 00349 msr CONTROL, r3 00350 b Test_CPU_SFR_fail 00351 00352 ;/* PSP register test: */ 00353 Test_PSP: 00354 ;/* step 1: 00355 ; * select the PSP as stack pointer and 00356 ; * use mov command to read/write with different pattern 00357 ; * compare to r0 for the test. 00358 ; * step 2: 00359 ; * use mrs/msr command to read/write with different pattern 00360 ; * register and compared to r0 00361 ; * PSP[1:0] is always read as zero */ 00362 00363 ;/* save the CONTROL register value */ 00364 mrs r3, CONTROL 00365 00366 ;/* load IEC60335_CPUregTestPOST with test state */ 00367 ldr r8, =TestStatePSP 00368 ldr r10, [r9] 00369 orr r8, r8, r10 00370 str r8, [r9,#testState] 00371 00372 ;/* set PSP as default stack */ 00373 mov r6, #0x02 00374 msr CONTROL, r6 00375 ;/* save current PSP content */ 00376 mrs r4, PSP 00377 00378 ;/* verify PSP as stack pointer */ 00379 mrs r5, PSP 00380 cmp r4, r5 00381 bne Test_PSP_Exit 00382 ;/* Step1 */ 00383 ;/* load pattern2 to PSP */ 00384 ldr r0, =pattern2 00385 mov r13, r0 00386 ;/* compare with r0 */ 00387 cmp r13, r0 00388 bne Test_PSP_Exit 00389 00390 ;/* load pattern4 to PSP */ 00391 ldr r0, =pattern4 00392 mov r13, r0 00393 ;/* compare with r0 */ 00394 cmp r13, r0 00395 bne Test_PSP_Exit 00396 00397 ;/* Step2 */ 00398 ;/* load pattern2 to PSP and read back r1 */ 00399 ldr r0, =pattern2 00400 msr PSP, r0 00401 mrs r1, PSP 00402 ;/* compare r1 with r0 (indirect) */ 00403 cmp r1, r0 00404 bne Test_PSP_Exit 00405 00406 ;/* load pattern4 to PSP and read back r1 */ 00407 ldr r0, =pattern4 00408 msr PSP, r0 00409 mrs r1, PSP 00410 ;/* compare r1 with r0 (indirect) */ 00411 cmp r1, r0 00412 bne Test_PSP_Exit 00413 00414 Test_PSP_pass: 00415 ;/* restore CONTROL and PSP */ 00416 msr PSP, r4 00417 msr CONTROL, r3 00418 ;/* continue with result */ 00419 b Test_LR 00420 00421 Test_PSP_Exit: 00422 ;/* restore CONTROL and PSP */ 00423 msr PSP, r4 00424 msr CONTROL, r3 00425 b Test_CPU_SFR_fail 00426 00427 ;/* LR register test: */ 00428 Test_LR: 00429 ;/* step 1: 00430 ; * LR registers will be written with pattern1 = 0xAAAA.AAAA 00431 ; * and will be compared to r0 for the test. 00432 ; * step 2: 00433 ; * the inverse pattern pattern3 = 0x5555.5555 is written to the 00434 ; * register and compared to r0 */ 00435 00436 ;/* save the LR register content */ 00437 mov r3, r14 00438 00439 ;/* load IEC60335_CPUregTestPOST with test state */ 00440 ldr r8, =TestStateLR 00441 ldr r10, [r9] 00442 orr r8, r8, r10 00443 str r8, [r9,#testState] 00444 00445 ;/* load pattern1 to LR */ 00446 ldr r0, =pattern1 00447 mov r14, r0 00448 ;/* compare with r0 */ 00449 cmp r14, r0 00450 bne Test_LR_Exit 00451 00452 ;/* load pattern3 to LR */ 00453 ldr r0, =pattern3 00454 mov r14, r0 00455 ;/* compare with r0 */ 00456 cmp r14, r0 00457 bne Test_LR_Exit 00458 00459 Test_LR_pass: 00460 ;/* restore LR register */ 00461 mov r14, r3 00462 ;/* continue with result */ 00463 b Test_APSR 00464 00465 Test_LR_Exit: 00466 ;/* restore LR register and branch to eror condition */ 00467 mov r14, r3 00468 b Test_CPU_SFR_fail 00469 00470 ;/* APSR register test: */ 00471 Test_APSR: 00472 ;/* step 1: 00473 ; * APSR registers will be written with pattern5 = 0xA800.0000 00474 ; * and will be compared to r0 for the test. 00475 ; * step 2: 00476 ; * the inverse pattern pattern6 = 0x5000.0000 is written to the 00477 ; * register and read back to r1 and compared to r0 00478 ; * IPSR and EPSR are read-only */ 00479 00480 ;/* save the APSR register content */ 00481 mrs r3, APSR 00482 00483 ;/* load IEC60335_CPUregTestPOST with test state */ 00484 ldr r8, =TestStateAPSR 00485 ldr r10, [r9] 00486 orr r8, r8, r10 00487 str r8, [r9,#testState] 00488 00489 ;/* load pattern5 to APSR */ 00490 ldr r0, =pattern5 00491 msr APSR, r0 00492 ;/* read and compare with r0 */ 00493 mrs r1, APSR 00494 cmp r1, r0 00495 bne Test_APSR_Exit 00496 00497 ;/* load pattern6 to APSR */ 00498 ldr r0, =pattern6 00499 msr APSR, r0 00500 ;/* read and compare with r0 */ 00501 mrs r1, APSR 00502 cmp r1, r0 00503 bne Test_APSR_Exit 00504 00505 Test_APSR_pass: 00506 ;/* restore APSR register */ 00507 msr APSR, r3 00508 ;/* continue with result */ 00509 b Test_PRIMASK 00510 00511 Test_APSR_Exit: 00512 ;/* restore APSR register and branch to eror condition */ 00513 msr APSR, r3 00514 b Test_CPU_SFR_fail 00515 00516 00517 ;/* PRIMASK register test: */ 00518 Test_PRIMASK: 00519 ;/* step 1: 00520 ; * PRIMASK registers [:0] will be written with 0x0000.0000 00521 ; * and will be compared to r0 for the test. 00522 ; * step 2: 00523 ; * the inverse pattern 0x0000.0001 is written to the 00524 ; * register and read back to r1 and compared to r0 */ 00525 00526 ;/* save the PRIMASK register content */ 00527 mrs r3, PRIMASK 00528 00529 ;/* load IEC60335_CPUregTestPOST with test state */ 00530 ldr r8, =TestStatePRIMASK 00531 ldr r10, [r9] 00532 orr r8, r8, r10 00533 str r8, [r9,#testState] 00534 00535 ;/* load pattern to PRIMASK */ 00536 mov r0, #0 00537 msr PRIMASK, r0 00538 ;/* read and compare with r0 */ 00539 mrs r1, PRIMASK 00540 cmp r1, r0 00541 bne Test_PRIMASK_Exit 00542 00543 ;/* load pattern to PRIMASK */ 00544 mov r0, #1 00545 msr PRIMASK, r0 00546 ;/* read and compare with r0 */ 00547 mrs r1, PRIMASK 00548 cmp r1, r0 00549 bne Test_PRIMASK_Exit 00550 00551 Test_PRIMASK_pass: 00552 ;/* restore PRIMASK register */ 00553 msr PRIMASK, r3 00554 ;/* continue with result */ 00555 b Test_FAULTMASK 00556 00557 Test_PRIMASK_Exit: 00558 ;/* restore PRIMASK register */ 00559 msr PRIMASK, r3 00560 b Test_CPU_SFR_fail 00561 00562 ;/* FAULTMASK register test: */ 00563 Test_FAULTMASK: 00564 ;/* step 1: 00565 ; * FAULTMASK registers [:0] will be written with 0x0000.0000 00566 ; * and will be compared to r0 for the test. 00567 ; * step 2: 00568 ; * the inverse pattern 0x0000.0001 is written to the 00569 ; * register and read back to r1 and compared to r0 */ 00570 00571 ;/* save the FAULTMASK register content */ 00572 mrs r3, FAULTMASK 00573 00574 ;/* load IEC60335_CPUregTestPOST with test state */ 00575 ldr r8, =TestStateFAULTMASK 00576 ldr r10, [r9] 00577 orr r8, r8, r10 00578 str r8, [r9,#testState] 00579 00580 ;/* load pattern to FAULTMASK */ 00581 mov r0, #0 00582 msr FAULTMASK, r0 00583 ;/* read and compare with r0 */ 00584 mrs r1, FAULTMASK 00585 cmp r1, r0 00586 bne Test_FAULTMASK_Exit 00587 00588 ;/* load pattern to FAULTMASK */ 00589 mov r0, #1 00590 msr FAULTMASK, r0 00591 ;/* read and compare with r0 */ 00592 mrs r1, FAULTMASK 00593 cmp r1, r0 00594 bne Test_FAULTMASK_Exit 00595 00596 Test_FAULTMASK_pass: 00597 ;/* restore FAULTMASK register */ 00598 msr FAULTMASK, r3 00599 ;/* continue with result */ 00600 b Test_BASEPRI 00601 00602 Test_FAULTMASK_Exit: 00603 ;/* restore FAULTMASK register */ 00604 msr FAULTMASK, r3 00605 b Test_CPU_SFR_fail 00606 00607 ;/* BASEPRI register test: */ 00608 Test_BASEPRI: 00609 ;/* step 1: 00610 ; * BASEPRI registers [7:0] will be written with pattern7 = 0x0000.00A0 00611 ; * and will be compared to r0 for the test. 00612 ; * step 2: 00613 ; * the inverse pattern pattern8 = 0x0000.0055 is written to the 00614 ; * register and read back to r1 and compared to r0 00615 ; * BASEPRI[4:0] are read as 0 */ 00616 00617 ;/* save the BASEPRI register content */ 00618 mrs r3, BASEPRI 00619 00620 ;/* load IEC60335_CPUregTestPOST with test state */ 00621 ldr r8, =TestStateBASEPRI 00622 ldr r10, [r9] 00623 orr r8, r8, r10 00624 str r8, [r9,#testState] 00625 00626 ;/* load pattern7 to BASEPRI */ 00627 ldr r0, =pattern7 00628 msr BASEPRI, r0 00629 ;/* read and compare with r0 */ 00630 mrs r1, BASEPRI 00631 cmp r1, r0 00632 bne Test_BASEPRI_Exit 00633 00634 ;/* load pattern8 to BASEPRI */ 00635 ldr r0, =pattern8 00636 msr BASEPRI, r0 00637 ;/* read and compare with r0 */ 00638 mrs r1, BASEPRI 00639 cmp r1, r0 00640 bne Test_BASEPRI_Exit 00641 00642 Test_BASEPRI_pass: 00643 ;/* restore BASEPRI register */ 00644 msr BASEPRI, r3 00645 ;/* load IEC60335_CPUregTestPOST with pass result */ 00646 ldr r0, =TestResult_pass 00647 str r0, [r9,#testResult] 00648 ;/* continue with result */ 00649 b Test_CPU_SFR_Exit 00650 00651 Test_BASEPRI_Exit: 00652 ; /* Restore the BASEPRI */ 00653 msr BASEPRI, r3 00654 b Test_CPU_SFR_fail 00655 00656 Test_r0_Exit: 00657 Test_r1_r7_Exit: 00658 Test_CPU_SFR_fail: 00659 ;/* returns a positiv test result */ 00660 ldr r0, =TestResult_fail 00661 str r0, [r9,#testResult] 00662 00663 Test_CPU_SFR_Exit: 00664 ;/* pop the stack back to registers (atomic instruction) */ 00665 pop {r0-r12,r14} 00666 ;/* branch with exchange back */ 00667 bx lr 00668 ;/* end of CPU SFR registers tests */ 00669 .end