2 This is the default Startup for STR75x devices for the GNU toolchain
4 It has been designed by ST Microelectronics and modified by Raisonance
7 You can use it, modify it, distribute it freely but without any waranty.
14 /*; Depending on Your Application, Disable or Enable the following Defines*/
15 /*; --------------------------------------------------------------------------
16 ; SMI Bank0 configuration
17 ; ----------------------------------------------------------------------------*/
18 .set SMI_Bank0_EN, 0 /*; enable access the SMI Bank0 if 1*/
20 /*; ----------------------------------------------------------------------------
22 ; ----------------------------------------------------------------------------*/
23 .set Remap_SRAM, 0 /* remap SRAM at address 0x00 if 1 */
25 /* ; ----------------------------------------------------------------------------
27 ; ----------------------------------------------------------------------------*/
28 .set EIC_INIT, 1 /*; Configure and Initialize EIC if 1*/
31 ;/* the following are useful for initializing the .data section */
32 .extern _sidata ;/* start address for the initialization values of the .data section. defined in linker script */
33 .extern _sdata ;/* start address for the .data section. defined in linker script */
34 .extern _edata ;/* end address for the .data section. defined in linker script */
36 ;/* the following are useful for initializing the .bss section */
37 .extern _sbss ;/* start address for the .bss section. defined in linker script */
38 .extern _ebss ;/* end address for the .bss section. defined in linker script */
40 ;/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
41 .set Mode_USR, 0x10 ;/* User Mode */
42 .set Mode_FIQ, 0x11 ;/* FIQ Mode */
43 .set Mode_IRQ, 0x12 ;/* IRQ Mode */
44 .set Mode_SVC, 0x13 ;/* Supervisor Mode */
45 .set Mode_ABT, 0x17 ;/* Abort Mode */
46 .set Mode_UNDEF, 0x1B ;/* Undefined Mode */
47 .set Mode_SYS, 0x1F ;/* System Mode */
49 .equ I_Bit, 0x80 ;/* when I bit is set, IRQ is disabled */
50 .equ F_Bit, 0x40 ;/* when F bit is set, FIQ is disabled */
52 /*; --- System memory locations */
54 ;/* init value for the stack pointer. defined in linker script */
57 ;/* Stack Sizes. The default values are in the linker script, but they can be overriden. */
58 .extern _UND_Stack_Init
59 .extern _SVC_Stack_Init
60 .extern _ABT_Stack_Init
61 .extern _FIQ_Stack_Init
62 .extern _IRQ_Stack_Init
63 .extern _USR_Stack_Init
65 .extern _UND_Stack_Size
66 .extern _SVC_Stack_Size
67 .extern _ABT_Stack_Size
68 .extern _FIQ_Stack_Size
69 .extern _IRQ_Stack_Size
70 .extern _USR_Stack_Size
71 .extern vTaskSwitchContext
72 .extern ulCriticalNesting
74 SVC_Stack = _SVC_Stack_Init /*_estack*/ /*; 32 byte SVC stack at*/
77 IRQ_Stack = _IRQ_Stack_Init /*SVC_Stack - 32*/ /*; followed by IRQ stack */
78 USR_Stack = _USR_Stack_Init /*IRQ_Stack-256*/ /*; followed by USR stack */
79 FIQ_Stack = _FIQ_Stack_Init /*USR_Stack-256*/ /*; followed by FIQ stack*/
80 ABT_Stack = _ABT_Stack_Init /*FIQ_Stack-64*/ /*; followed by ABT stack */
81 UNDEF_Stack = _UND_Stack_Init /*ABT_Stack-0*/ /*; followed by UNDEF stack */
83 /*; --- System memory locations*/
86 MRCC_PCLKEN_Addr = 0x60000030 /*; Peripheral Clock Enable register base address*/
89 CFG_GLCONF_Addr = 0x60000010 /*; Global Configuration register base address*/
90 SRAM_mask = 0x0002 /*; to remap RAM at 0x0*/
93 GPIOREMAP0R_Addr = 0xFFFFE420
94 SMI_EN_Mask = 0x00000001
97 SMI_CR1_Addr = 0x90000000
99 /*; --- Stack Addres for each ARM mode*/
100 /*; add FIQ_Stack, ABT_Stack, UNDEF_Stack here if you need them*/
103 /*; --- EIC Registers offsets*/
104 EIC_base_addr = 0xFFFFF800 /*; EIC base address*/
105 ICR_off_addr = 0x00 /*; Interrupt Control register offset*/
106 CICR_off_addr = 0x04 /*; Current Interrupt Channel Register*/
107 CIPR_off_addr = 0x08 /*; Current Interrupt Priority Register offset*/
108 IVR_off_addr = 0x18 /*; Interrupt Vector Register offset*/
109 FIR_off_addr = 0x1C /*; Fast Interrupt Register offset*/
110 IER_off_addr = 0x20 /*; Interrupt Enable Register offset*/
111 IPR_off_addr = 0x40 /*; Interrupt Pending Bit Register offset*/
112 SIR0_off_addr = 0x60 /*; Source Interrupt Register 0*/
114 /***************************************************************************************/
124 LDR PC, Undefined_Addr
126 LDR PC, Prefetch_Addr
128 NOP /*; Reserved vector*/
136 Reset_Addr : .long Reset_Handler
137 Undefined_Addr : .long UndefinedHandler
138 SWI_Addr : .long SWIHandler
139 Prefetch_Addr : .long PrefetchAbortHandler
140 Abort_Addr : .long DataAbortHandler
141 .long 0 /*; Reserved vector*/
142 IRQ_Addr : .long IRQHandler
143 FIQ_Addr : .long FIQHandler
146 /*;*******************************************************************************
147 ; Peripherals IRQ handlers address table
148 ;********************************************************************************/
150 /* execution goes there when an interrupt occurs and there is no associated ISR */
153 ldr PC, __wrongvector_Addr
157 WAKUP_Addr :.long WAKUPIRQHandler
158 TIM2_OC2_Addr :.long TIM2_OC2IRQHandler
159 TIM2_OC1_Addr :.long TIM2_OC1IRQHandler
160 TIM2_IC12_Addr :.long TIM2_IC12IRQHandler
161 TIM2_UP_Addr :.long TIM2_UPIRQHandler
162 TIM1_OC2_Addr :.long TIM1_OC2IRQHandler
163 TIM1_OC1_Addr :.long TIM1_OC1IRQHandler
164 TIM1_IC12_Addr :.long TIM1_IC12IRQHandler
165 TIM1_UP_Addr :.long TIM1_UPIRQHandler
166 TIM0_OC2_Addr :.long TIM0_OC2IRQHandler
167 TIM0_OC1_Addr :.long TIM0_OC1IRQHandler
168 TIM0_IC12_Addr :.long TIM0_IC12IRQHandler
169 TIM0_UP_Addr :.long TIM0_UPIRQHandler
170 PWM_OC123_Addr :.long PWM_OC123IRQHandler
171 PWM_EM_Addr :.long PWM_EMIRQHandler
172 PWM_UP_Addr :.long PWM_UPIRQHandler
173 I2C_Addr :.long I2CIRQHandler
174 SSP1_Addr :.long SSP1IRQHandler
175 SSP0_Addr :.long SSP0IRQHandler
176 UART2_Addr :.long UART2IRQHandler
177 UART1_Addr :.long UART1IRQHandler
178 UART0_Addr :.long vSerialISR
179 CAN_Addr :.long CANIRQHandler
180 USB_LP_Addr :.long USB_LPIRQHandler
181 USB_HP_Addr :.long USB_HPIRQHandler
182 ADC_Addr :.long ADCIRQHandler
183 DMA_Addr :.long DMAIRQHandler
184 EXTIT_Addr :.long EXTITIRQHandler
185 MRCC_Addr :.long MRCCIRQHandler
186 FLASHSMI_Addr :.long FLASHSMIIRQHandler
187 RTC_Addr :.long RTCIRQHandler
188 TB_Addr :.long vPortTickISR
190 /*;*******************************************************************************
192 ;********************************************************************************/
195 /*;*******************************************************************************
196 ;* FreeRTOS.org macros for saving and restoring a task context
197 ;*******************************************************************************/
199 .macro portSAVE_CONTEXT MACRO
201 /* ; Push R0 as we are going to use the register. */
204 /* ; Set R0 to point to the task stack pointer. */
210 /* ; Push the return address onto the stack. */
213 /* ; Now we have saved LR we can use it instead of R0. */
216 /* ; Pop R0 so we can save it onto the system mode stack. */
219 /* ; Push all the system mode registers onto the task stack. */
224 /* ; Push the SPSR onto the task stack. */
228 LDR R0, =ulCriticalNesting
232 /* ; Store the new top of stack for the task. */
233 LDR R1, =pxCurrentTCB
240 .macro portRESTORE_CONTEXT MACRO
242 /* ; Set the LR to the task stack. */
243 LDR R1, =pxCurrentTCB
247 /* ; The critical nesting depth is the first item on the stack.
248 ; Load it into the ulCriticalNesting variable. */
249 LDR R0, =ulCriticalNesting
253 /* ; Get the SPSR from the stack. */
257 /* ; Restore all system mode registers for the task. */
261 /* ; Restore the return address. */
264 /* ; And return - correcting the offset in the LR to obtain the
265 ; correct address. */
272 /*;*******************************************************************************
273 ;* Macro Name : SaveContext
274 ;* Description : This macro used to save the context before entering
275 ; an exception handler.
276 ;* Input : The range of registers to store.
278 ;********************************************************************************/
280 .macro SaveContext $r0,$r12
281 STMFD sp!,{r0-r12,lr} /*; Save The workspace plus the current return*/
282 /*; address lr_ mode into the stack.*/
283 MRS r1,spsr /*; Save the spsr_mode into r1.*/
284 STMFD sp!,{r1} /*; Save spsr.*/
287 /*;*******************************************************************************
288 ;* Macro Name : RestoreContext
289 ;* Description : This macro used to restore the context to return from
290 ; an exception handler and continue the program execution.
291 ;* Input : The range of registers to restore.
293 ;********************************************************************************/
295 .macro RestoreContext $r0,$r12
296 LDMFD sp!,{r1} /*; Restore the saved spsr_mode into r1.*/
297 MSR spsr_cxsf,r1 /*; Restore spsr_mode.*/
298 LDMFD sp!,{r0-r12,pc}^/*; Return to the instruction following...*/
299 /*; ...the exception interrupt.*/
304 /*;*******************************************************************************
305 ;* Function Name : UndefinedHandler
306 ;* Description : This function called when undefined instruction
307 ; exception is entered.
310 ;*********************************************************************************/
313 SaveContext r0,r12 /*; Save the workspace plus the current*/
314 /*; return address lr_ und and spsr_und.*/
315 BL Undefined_Handler/*; Branch to Undefined_Handler*/
316 RestoreContext r0,r12 /*; Return to the instruction following...*/
317 /*; ...the undefined instruction.*/
319 /*;*******************************************************************************
320 ;* Function Name : SWIHandler
321 ;* Description : This function called when SWI instruction executed.
324 ;********************************************************************************/
329 LDR R0, =vTaskSwitchContext
335 /*;*******************************************************************************
336 ;* Function Name : IRQHandler
337 ;* Description : This function called when IRQ exception is entered.
340 ;********************************************************************************/
345 portSAVE_CONTEXT /*; Save the context of the current task. */
347 LDR r0, =EIC_base_addr
348 LDR r1, =IVR_off_addr
349 LDR lr, =ReturnAddress /*; Load the return address. */
350 ADD pc,r0,r1 /*; Branch to the IRQ handler. */
352 LDR r0, =EIC_base_addr
353 LDR r2, [r0, #CICR_off_addr] /*; Get the IRQ channel number. */
356 STR r3,[r0, #IPR_off_addr] /*; Clear the corresponding IPR bit. */
358 portRESTORE_CONTEXT /*; Restore the context of the selected task. */
360 /*;*******************************************************************************
361 ;* Function Name : PrefetchAbortHandler
362 ;* Description : This function called when Prefetch Abort
363 ; exception is entered.
366 ;*********************************************************************************/
368 PrefetchAbortHandler:
370 B PrefetchAbortHandler
372 /*;*******************************************************************************
373 ;* Function Name : DataAbortHandler
374 ;* Description : This function is called when Data Abort
375 ; exception is entered.
378 ;********************************************************************************/
384 /*; ...has generated the data abort exception.*/
386 /*;*******************************************************************************
387 ;* Function Name : FIQHandler
388 ;* Description : This function is called when FIQ
389 ;* exception is entered.
392 ;********************************************************************************/
395 SUB lr,lr,#4 /*; Update the link register.*/
396 SaveContext r0,r7 /*; Save the workspace plus the current*/
397 /*; return address lr_ fiq and spsr_fiq.*/
398 BL FIQ_Handler /*; Branch to FIQ_Handler.*/
399 RestoreContext r0,r7 /*; Restore the context and return to the...*/
400 /*; ...program execution.*/
402 /*;*******************************************************************************
403 ;* Macro Name : IRQ_to_SYS
404 ;* Description : This macro used to switch form IRQ mode to SYS mode
407 ;*******************************************************************************/
413 /*;*******************************************************************************
414 ;* Macro Name : SYS_to_IRQ
415 ;* Description : This macro used to switch from SYS mode to IRQ mode
416 ; then to return to IRQHnadler routine.
419 ;*******************************************************************************/
421 LDMFD sp!,{lr} /*; Restore the link register. */
422 MSR cpsr_c,#0xD2 /*; Switch to IRQ mode.*/
423 MOV pc,lr /*; Return to IRQHandler routine to clear the*/
427 /*;*******************************************************************************
428 ;* Function Name : WAKUPIRQHandler
429 ;* Description : This function used to switch to SYS mode before entering
430 ;* the WAKUP_IRQHandler function located in 75x_it.c.
431 ;* Then to return to IRQ mode after the
432 ;* WAKUP_IRQHandler function termination.
435 ;*******************************************************************************/
441 /*;*******************************************************************************
442 ;* Function Name : TIM2_OC2IRQHandler
443 ;* Description : This function used to switch to SYS mode before entering
444 ;* the TIM3_OC2_IRQHandler function located in 75x_it.c.
445 ;* Then to return to IRQ mode after the
446 ;* TIM2_OC2_IRQHandler function termination.
449 ;*******************************************************************************/
452 BL TIM2_OC2_IRQHandler
455 /*;*******************************************************************************
456 ;* Function Name : TIM2_OC1IRQHandler
457 ;* Description : This function used to switch to SYS mode before entering
458 ;* the TIM2_OC1_IRQHandler function located in 75x_it.c.
459 ;* Then to return to IRQ mode after the
460 ;* TIM2_OC1_IRQHandler function termination.
463 ;*******************************************************************************/
466 BL TIM2_OC1_IRQHandler
469 /*;*******************************************************************************
470 ;* Function Name : TIM2_IC12IRQHandler
471 ;* Description : This function used to switch to SYS mode before entering
472 ;* the TIM2_IC12_IRQHandler function located in 75x_it.c.
473 ;* Then to return to IRQ mode after the
474 ;* TIM2_IC12_IRQHandler function termination.
477 ;*******************************************************************************/
480 BL TIM2_IC12_IRQHandler
483 /*;*******************************************************************************
484 ;* Function Name : TIM2_UPIRQHandler
485 ;* Description : This function used to switch to SYS mode before entering
486 ;* the TIM2_UP_IRQHandler function located in 75x_it.c.
487 ;* Then to return to IRQ mode after the
488 ;* TIM3_UP_IRQHandler function termination.
491 ;*******************************************************************************/
494 BL TIM2_UP_IRQHandler
497 /*;*******************************************************************************
498 ;* Function Name : TIM1_OC2IRQHandler
499 ;* Description : This function used to switch to SYS mode before entering
500 ;* the TIM1_OC2_IRQHandler function located in 75x_it.c.
501 ;* Then to return to IRQ mode after the
502 ;* TIM1_OC2_IRQHandler function termination.
505 ;*******************************************************************************/
508 BL TIM1_OC2_IRQHandler
511 /*;*******************************************************************************
512 ;* Function Name : TIM1_OC1IRQHandler
513 ;* Description : This function used to switch to SYS mode before entering
514 ;* the TIM1_OC1_IRQHandler function located in 75x_it.c.
515 ;* Then to return to IRQ mode after the
516 ;* TIM1_OC1_IRQHandler function termination.
519 ;*******************************************************************************/
522 BL TIM1_OC1_IRQHandler
525 /*;*******************************************************************************
526 ;* Function Name : TIM1_IC12IRQHandler
527 ;* Description : This function used to switch to SYS mode before entering
528 ;* the TIM1_IC12_IRQHandler function located in 75x_it.c.
529 ;* Then to return to IRQ mode after the
530 ;* TIM1_IC12_IRQHandler function termination.
533 ;*******************************************************************************/
536 BL TIM1_IC12_IRQHandler
539 /*;*******************************************************************************
540 ;* Function Name : TIM1_UPIRQHandler
541 ;* Description : This function used to switch to SYS mode before entering
542 ;* the TIM1_UP_IRQHandler function located in 75x_it.c.
543 ;* Then to return to IRQ mode after the
544 ;* TIM1_UP_IRQHandler function termination.
547 ;*******************************************************************************/
550 BL TIM1_UP_IRQHandler
553 /*;*******************************************************************************
554 ;* Function Name : TIM0_OC2IRQHandler
555 ;* Description : This function used to switch to SYS mode before entering
556 ;* the TIM0_OC2_IRQHandler function located in 75x_it.c.
557 ;* Then to return to IRQ mode after the
558 ;* TIM0_OC2_IRQHandler function termination.
561 ;*******************************************************************************/
564 BL TIM0_OC2_IRQHandler
567 /*;*******************************************************************************
568 ;* Function Name : TIM0_OC1IRQHandler
569 ;* Description : This function used to switch to SYS mode before entering
570 ;* the TIM0_OC1_IRQHandler function located in 75x_it.c.
571 ;* Then to return to IRQ mode after the
572 ;* TIM0_OC1_IRQHandler function termination.
575 ;*******************************************************************************/
578 BL TIM0_OC1_IRQHandler
581 /*;*******************************************************************************
582 ;* Function Name : TIM0_IC12IRQHandler
583 ;* Description : This function used to switch to SYS mode before entering
584 ;* the TIM0_IC12_IRQHandler function located in 75x_it.c.
585 ;* Then to return to IRQ mode after the
586 ;* TIM0_IC12_IRQHandler function termination.
589 ;********************************************************************************/
592 BL TIM0_IC12_IRQHandler
595 /*;*******************************************************************************
596 ;* Function Name : TIM0_UPIRQHandler
597 ;* Description : This function used to switch to SYS mode before entering
598 ;* the TIM0_UP_IRQHandler function located in 75x_it.c.
599 ;* Then to return to IRQ mode after the
600 ;* TIM0_UP_IRQHandler function termination.
603 ;********************************************************************************/
606 BL TIM0_UP_IRQHandler
609 /*;*******************************************************************************
610 ;* Function Name : PWM_OC123IRQHandler
611 ;* Description : This function used to switch to SYS mode before entering
612 ;* the PWM_OC123_IRQHandler function located in 75x_it.c.
613 ;* Then to return to IRQ mode after the
614 ;* PWM_OC123_IRQHandler function termination.
617 ;********************************************************************************/
620 BL PWM_OC123_IRQHandler
623 /*;*******************************************************************************
624 ;* Function Name : PWM_EMIRQHandler
625 ;* Description : This function used to switch to SYS mode before entering
626 ;* the PWM_EM_IRQHandler function located in 75x_it.c.
627 ;* Then to return to IRQ mode after the
628 ;* PWM_EM_IRQHandler function termination.
631 ;*******************************************************************************/
637 /*;*******************************************************************************
638 ;* Function Name : PWM_UPIRQHandler
639 ;* Description : This function used to switch to SYS mode before entering
640 ;* the PWM_UP_IRQHandler function located in 75x_it.c.
641 ;* Then to return to IRQ mode after the
642 ;* PWM_UP_IRQHandler function termination.
645 ;*******************************************************************************/
651 /*;*******************************************************************************
652 ;* Function Name : I2CIRQHandler
653 ;* Description : This function used to switch to SYS mode before entering
654 ;* the I2C_IRQHandler function located in 75x_it.c.
655 ;* Then to return to IRQ mode after the
656 ;* I2C_IRQHandler function termination.
659 ;*******************************************************************************/
665 /*;*******************************************************************************
666 ;* Function Name : SSP1IRQHandler
667 ;* Description : This function used to switch to SYS mode before entering
668 ;* the SSP1_IRQHandler function located in 75x_it.c.
669 ;* Then to return to IRQ mode after the
670 ;* SSP1_IRQHandler function termination.
673 ;*******************************************************************************/
679 /*;*******************************************************************************
680 ;* Function Name : SSP0IRQHandler
681 ;* Description : This function used to switch to SYS mode before entering
682 ;* the SSP0_IRQHandler function located in 75x_it.c.
683 ;* Then to return to IRQ mode after the
684 ;* SSP0_IRQHandler function termination.
687 ;*******************************************************************************/
693 /*;*******************************************************************************
694 ;* Function Name : UART2IRQHandler
695 ;* Description : This function used to switch to SYS mode before entering
696 ;* the UART2_IRQHandler function located in 75x_it.c.
697 ;* Then to return to IRQ mode after the
698 ;* UART2_IRQHandler function termination.
701 ;*******************************************************************************/
707 /*;*******************************************************************************
708 ;* Function Name : UART1IRQHandler
709 ;* Description : This function used to switch to SYS mode before entering
710 ;* the UART1_IRQHandler function located in 75x_it.c.
711 ;* Then to return to IRQ mode after the
712 ;* UART1_IRQHandler function termination.
715 ;*******************************************************************************/
721 /*;*******************************************************************************
722 ;* Function Name : UART0IRQHandler
723 ;* Description : This function used to switch to SYS mode before entering
724 ;* the UART0_IRQHandler function located in 75x_it.c.
725 ;* Then to return to IRQ mode after the
726 ;* UART0_IRQHandler function termination.
729 ;********************************************************************************/
735 /*;*******************************************************************************
736 ;* Function Name : CANIRQHandler
737 ;* Description : This function used to switch to SYS mode before entering
738 ;* the CAN_IRQHandler function located in 75x_it.c.
739 ;* Then to return to IRQ mode after the
740 ;* CAN_IRQHandler function termination.
743 ;********************************************************************************/
749 /*;*******************************************************************************
750 ;* Function Name : USB_LPIRQHandler
751 ;* Description : This function used to switch to SYS mode before entering
752 ;* the USB_LP_IRQHandler function located in 75x_it.c.
753 ;* Then to return to IRQ mode after the
754 ;* USB_LP_IRQHandler function termination.
757 ;********************************************************************************/
763 /*;*******************************************************************************
764 ;* Function Name : USB_HPIRQHandler
765 ;* Description : This function used to switch to SYS mode before entering
766 ;* the USB_HP_IRQHandler function located in 75x_it.c.
767 ;* Then to return to IRQ mode after the
768 ;* USB_HP_IRQHandler function termination.
771 ;********************************************************************************/
777 /*;*******************************************************************************
778 ;* Function Name : ADCIRQHandler
779 ;* Description : This function used to switch to SYS mode before entering
780 ;* the ADC_IRQHandler function located in 75x_it.c.
781 ;* Then to return to IRQ mode after the
782 ;* ADC_IRQHandler function termination.
785 ;********************************************************************************/
791 /*;*******************************************************************************
792 ;* Function Name : DMAIRQHandler
793 ;* Description : This function used to switch to SYS mode before entering
794 ;* the DMA_IRQHandler function located in 75x_it.c.
795 ;* Then to return to IRQ mode after the
796 ;* DMA_IRQHandler function termination.
799 ;********************************************************************************/
805 /*;*******************************************************************************
806 ;* Function Name : EXTITIRQHandler
807 ;* Description : This function used to switch to SYS mode before entering
808 ;* the EXTIT_IRQHandler function located in 75x_it.c.
809 ;* Then to return to IRQ mode after the
810 ;* EXTIT_IRQHandler function termination.
813 ;********************************************************************************/
819 /*;*******************************************************************************
820 ;* Function Name : MRCCIRQHandler
821 ;* Description : This function used to switch to SYS mode before entering
822 ;* the MRCC_IRQHandler function located in 75x_it.c.
823 ;* Then to return to IRQ mode after the
824 ;* MRCC_IRQHandler function termination.
827 ;********************************************************************************/
833 /*;*******************************************************************************
834 ;* Function Name : FLASHSMIIRQHandler
835 ;* Description : This function used to switch to SYS mode before entering
836 ;* the FLASHSMI_IRQHandler function located in 75x_it.c.
837 ;* Then to return to IRQ mode after the
838 ;* FLASHSMI_IRQHandler function termination.
841 ;********************************************************************************/
844 BL FLASHSMI_IRQHandler
847 /*;*******************************************************************************
848 ;* Function Name : RTCIRQHandler
849 ;* Description : This function used to switch to SYS mode before entering
850 ;* the RTC_IRQHandler function located in 75x_it.c.
851 ;* Then to return to IRQ mode after the
852 ;* RTC_IRQHandler function termination.
855 ;********************************************************************************/
861 /*;*******************************************************************************
862 ;* Function Name : TBIRQHandler
863 ;* Description : This function used to switch to SYS mode before entering
864 ;* the TB_IRQHandler function located in 75x_it.c.
865 ;* Then to return to IRQ mode after the
866 ;* TB_IRQHandler function termination.
869 ;********************************************************************************/
874 /*;**********************************************************************************/
880 /*; Reset all Peripheral Clocks*/
881 /*; This is usefull only when using debugger to Reset\Run the application*/
884 LDR r0, =0x01000000 /*; Disable peripherals clock (except GPIO)*/
886 LDR r0, =0x00000000 /*; Disable peripherals clock*/
888 LDR r1, =MRCC_PCLKEN_Addr
892 LDR r0, =0x1875623F /*; Peripherals kept under reset (except GPIO)*/
894 LDR r0, =0x1975623F /*; Peripherals kept under reset*/
903 STR r0, [r1,#4] /*; Disable peripherals reset*/
905 /*; Initialize stack pointer registers
906 ; Enter each mode in turn and set up the stack pointer*/
910 MSR CPSR_c, #Mode_FIQ|I_Bit|F_Bit /*; No interrupts*/
913 MSR CPSR_c, #Mode_IRQ|I_Bit|F_Bit /*; No interrupts*/
916 MSR CPSR_c, #Mode_ABT|I_Bit|F_Bit /*; No interrupts*/
919 MSR CPSR_c, #Mode_UNDEF|I_Bit|F_Bit /*; No interrupts*/
922 MSR CPSR_c, #Mode_SVC|I_Bit|F_Bit /*; No interrupts*/
925 /*; ------------------------------------------------------------------------------
926 ; Description : Enable SMI Bank0: enable GPIOs clock in MRCC_PCLKEN register,
927 ; enable SMI alternate function in GPIO_REMAP register and enable
928 ; Bank0 in SMI_CR1 register.
929 ; ------------------------------------------------------------------------------*/
932 LDR r1, =MRCC_PCLKEN_Addr
933 STR r0, [r1] /*; Enable GPIOs clock*/
935 LDR r1, =GPIOREMAP0R_Addr
939 STR r2, [r1] /*; Enable SMI alternate function */
941 LDR r0, =0x251 /*; SMI Bank0 enabled, Prescaler = 2, Deselect Time = 5*/
942 LDR r1, =SMI_CR1_Addr
943 STR r0, [r1] /*; Configure CR1 register */
945 STR r0, [r1,#4] /*; Reset CR2 register */
948 /*; ----------------------------------------------------------------------------
949 ; Description : Remapping SRAM at address 0x00 after the application has
951 ; ----------------------------------------------------------------------------*/
954 LDR r1, =CFG_GLCONF_Addr
955 LDR r2, [r1] /*; Read GLCONF Register*/
956 BIC r2, r2, #0x03 /*; Reset the SW_BOOT bits*/
957 ORR r2, r2, r0 /*; Change the SW_BOOT bits*/
958 STR r2, [r1] /*; Write GLCONF Register*/
961 /*;-------------------------------------------------------------------------------
962 ;Description : Initialize the EIC as following :
965 ; - IVR contains the load PC opcode
966 ; - All channels are disabled
967 ; - All channels priority equal to 0
968 ; - All SIR registers contains offset to the related IRQ table entry
969 ;-------------------------------------------------------------------------------*/
971 LDR r3, =EIC_base_addr
973 STR r4, [r3, #ICR_off_addr] /*; Disable FIQ and IRQ*/
974 STR r4, [r3, #IER_off_addr] /*; Disable all interrupts channels*/
977 STR r4, [r3, #IPR_off_addr] /*; Clear all IRQ pending bits*/
980 STR r4, [r3, #FIR_off_addr] /*; Disable FIQ channels and clear FIQ pending bits*/
983 STR r4, [r3, #CIPR_off_addr] /*; Reset the current priority register*/
985 LDR r4, =0xE59F0000 /*; Write the LDR pc,pc,#offset..*/
986 STR r4, [r3, #IVR_off_addr] /*; ..instruction code in IVR[31:16]*/
989 LDR r2,= 32 /*; 32 Channel to initialize*/
990 LDR r0, =WAKUP_Addr /*; Read the address of the IRQs address table*/
993 LDR r5,=SIR0_off_addr /*; Read SIR0 address*/
994 SUB r4,r0,#8 /*; subtract 8 for prefetch*/
995 LDR r1, =0xF7E8 /*; add the offset to the 0x00 address..*/
996 /*; ..(IVR address + 7E8 = 0x00)*/
997 /*; 0xF7E8 used to complete the LDR pc,offset opcode*/
998 ADD r1,r4,r1 /*; compute the jump offset*/
1000 MOV r4, r1, LSL #16 /*; Left shift the result*/
1001 STR r4, [r3, r5] /*; Store the result in SIRx register*/
1002 ADD r1, r1, #4 /*; Next IRQ address*/
1003 ADD r5, r5, #4 /*; Next SIR*/
1004 SUBS r2, r2, #1 /*; Decrement the number of SIR registers to initialize*/
1005 BNE EIC_INI /*; If more then continue*/
1013 /* ;copy the initial values for .data section from FLASH to RAM */
1017 _reset_inidata_loop:
1021 blO _reset_inidata_loop
1023 ;/* Clear the .bss section */
1024 mov r0,#0 ;/* get a zero */
1025 ldr r1,=_sbss ;/* point to bss start */
1026 ldr r2,=_ebss ;/* point to bss end */
1028 cmp r1,r2 ;/* check if some data remains to clear */
1029 strlo r0,[r1],#4 ;/* clear 4 bytes */
1030 blo _reset_inibss_loop ;/* loop until done */
1032 /************************************************************************************************/
1034 /*; --- Now enter the C code */
1035 B main /*; Note : use B not BL, because an application will*/
1036 /*; never return this way*/