wtorek, 19 kwietnia 2022

STM32 - Startup Assembly

W tym poście chciałbym opisać plik startup dla układu STM32F407.

[Źródło: http://www.st.com/en/evaluation-tools/stm32f4discovery.html]

Cały wygenerowany plik wygląda następująco:

  1.   .syntax unified
  2.   .cpu cortex-m4
  3.   .fpu softvfp
  4.   .thumb
  5.  
  6. .global  g_pfnVectors
  7. .global  Default_Handler
  8.  
  9. /* start address for the initialization values of the .data section.
  10. defined in linker script */
  11. .word  _sidata
  12. /* start address for the .data section. defined in linker script */  
  13. .word  _sdata
  14. /* end address for the .data section. defined in linker script */
  15. .word  _edata
  16. /* start address for the .bss section. defined in linker script */
  17. .word  _sbss
  18. /* end address for the .bss section. defined in linker script */
  19. .word  _ebss
  20. /* stack used for SystemInit_ExtMemCtl; always internal RAM used */
  21.  
  22. /**
  23.  * @brief  This is the code that gets called when the processor first
  24.  *          starts execution following a reset event. Only the absolutely
  25.  *          necessary set is performed, after which the application
  26.  *          supplied main() routine is called.
  27.  * @param  None
  28.  * @retval : None
  29. */
  30.  
  31.     .section  .text.Reset_Handler
  32.   .weak  Reset_Handler
  33.   .type  Reset_Handler, %function
  34. Reset_Handler:  
  35.   ldr   sp, =_estack     /* set stack pointer */
  36.  
  37. /* Copy the data segment initializers from flash to SRAM */  
  38.   ldr r0, =_sdata
  39.   ldr r1, =_edata
  40.   ldr r2, =_sidata
  41.   movs r3, #0
  42.   b LoopCopyDataInit
  43.  
  44. CopyDataInit:
  45.   ldr r4, [r2, r3]
  46.   str r4, [r0, r3]
  47.   adds r3, r3, #4
  48.  
  49. LoopCopyDataInit:
  50.   adds r4, r0, r3
  51.   cmp r4, r1
  52.   bcc CopyDataInit
  53.  
  54. /* Zero fill the bss segment. */
  55.   ldr r2, =_sbss
  56.   ldr r4, =_ebss
  57.   movs r3, #0
  58.   b LoopFillZerobss
  59.  
  60. FillZerobss:
  61.   str  r3, [r2]
  62.   adds r2, r2, #4
  63.  
  64. LoopFillZerobss:
  65.   cmp r2, r4
  66.   bcc FillZerobss
  67.  
  68. /* Call the clock system intitialization function.*/
  69.   bl  SystemInit  
  70. /* Call static constructors */
  71.     bl __libc_init_array
  72. /* Call the application's entry point.*/
  73.   bl  main
  74.   bx  lr    
  75. .size  Reset_Handler, .-Reset_Handler
  76.  
  77. /**
  78.  * @brief  This is the code that gets called when the processor receives an
  79.  *         unexpected interrupt.  This simply enters an infinite loop, preserving
  80.  *         the system state for examination by a debugger.
  81.  * @param  None    
  82.  * @retval None      
  83. */
  84.     .section  .text.Default_Handler,"ax",%progbits
  85. Default_Handler:
  86. Infinite_Loop:
  87.   b  Infinite_Loop
  88.   .size  Default_Handler, .-Default_Handler
  89. /******************************************************************************
  90. *
  91. * The minimal vector table for a Cortex M3. Note that the proper constructs
  92. * must be placed on this to ensure that it ends up at physical address
  93. * 0x0000.0000.
  94. *
  95. *******************************************************************************/
  96.    .section  .isr_vector,"a",%progbits
  97.   .type  g_pfnVectors, %object
  98.   .size  g_pfnVectors, .-g_pfnVectors
  99.    
  100.    
  101. g_pfnVectors:
  102.   .word  _estack
  103.   .word  Reset_Handler
  104.   .word  NMI_Handler
  105.   .word  HardFault_Handler
  106.   .word  MemManage_Handler
  107.   .word  BusFault_Handler
  108.   .word  UsageFault_Handler
  109.   .word  0
  110.   .word  0
  111.   .word  0
  112.   .word  0
  113.   .word  SVC_Handler
  114.   .word  DebugMon_Handler
  115.   .word  0
  116.   .word  PendSV_Handler
  117.   .word  SysTick_Handler
  118.  
  119.   /* External Interrupts */
  120.   .word     WWDG_IRQHandler                   /* Window WatchDog              */                                        
  121.   .word     PVD_IRQHandler                    /* PVD through EXTI Line detection */                        
  122.   .word     TAMP_STAMP_IRQHandler             /* Tamper and TimeStamps through the EXTI line */            
  123.   .word     RTC_WKUP_IRQHandler               /* RTC Wakeup through the EXTI line */                      
  124.   .word     FLASH_IRQHandler                  /* FLASH                        */                                          
  125.   .word     RCC_IRQHandler                    /* RCC                          */                                            
  126.   .word     EXTI0_IRQHandler                  /* EXTI Line0                   */                        
  127.   .word     EXTI1_IRQHandler                  /* EXTI Line1                   */                          
  128.   .word     EXTI2_IRQHandler                  /* EXTI Line2                   */                          
  129.   .word     EXTI3_IRQHandler                  /* EXTI Line3                   */                          
  130.   .word     EXTI4_IRQHandler                  /* EXTI Line4                   */                          
  131.   .word     DMA1_Stream0_IRQHandler           /* DMA1 Stream 0                */                  
  132.   .word     DMA1_Stream1_IRQHandler           /* DMA1 Stream 1                */                  
  133.   .word     DMA1_Stream2_IRQHandler           /* DMA1 Stream 2                */                  
  134.   .word     DMA1_Stream3_IRQHandler           /* DMA1 Stream 3                */                  
  135.   .word     DMA1_Stream4_IRQHandler           /* DMA1 Stream 4                */                  
  136.   .word     DMA1_Stream5_IRQHandler           /* DMA1 Stream 5                */                  
  137.   .word     DMA1_Stream6_IRQHandler           /* DMA1 Stream 6                */                  
  138.   .word     ADC_IRQHandler                    /* ADC1, ADC2 and ADC3s         */                  
  139.   .word     CAN1_TX_IRQHandler                /* CAN1 TX                      */                        
  140.   .word     CAN1_RX0_IRQHandler               /* CAN1 RX0                     */                          
  141.   .word     CAN1_RX1_IRQHandler               /* CAN1 RX1                     */                          
  142.   .word     CAN1_SCE_IRQHandler               /* CAN1 SCE                     */                          
  143.   .word     EXTI9_5_IRQHandler                /* External Line[9:5]s          */                          
  144.   .word     TIM1_BRK_TIM9_IRQHandler          /* TIM1 Break and TIM9          */        
  145.   .word     TIM1_UP_TIM10_IRQHandler          /* TIM1 Update and TIM10        */        
  146.   .word     TIM1_TRG_COM_TIM11_IRQHandler     /* TIM1 Trigger and Commutation and TIM11 */
  147.   .word     TIM1_CC_IRQHandler                /* TIM1 Capture Compare         */                          
  148.   .word     TIM2_IRQHandler                   /* TIM2                         */                  
  149.   .word     TIM3_IRQHandler                   /* TIM3                         */                  
  150.   .word     TIM4_IRQHandler                   /* TIM4                         */                  
  151.   .word     I2C1_EV_IRQHandler                /* I2C1 Event                   */                          
  152.   .word     I2C1_ER_IRQHandler                /* I2C1 Error                   */                          
  153.   .word     I2C2_EV_IRQHandler                /* I2C2 Event                   */                          
  154.   .word     I2C2_ER_IRQHandler                /* I2C2 Error                   */                            
  155.   .word     SPI1_IRQHandler                   /* SPI1                         */                  
  156.   .word     SPI2_IRQHandler                   /* SPI2                         */                  
  157.   .word     USART1_IRQHandler                 /* USART1                       */                  
  158.   .word     USART2_IRQHandler                 /* USART2                       */                  
  159.   .word     USART3_IRQHandler                 /* USART3                       */                  
  160.   .word     EXTI15_10_IRQHandler              /* External Line[15:10]s        */                          
  161.   .word     RTC_Alarm_IRQHandler              /* RTC Alarm (A and B) through EXTI Line */                
  162.   .word     OTG_FS_WKUP_IRQHandler            /* USB OTG FS Wakeup through EXTI line */                      
  163.   .word     TIM8_BRK_TIM12_IRQHandler         /* TIM8 Break and TIM12         */        
  164.   .word     TIM8_UP_TIM13_IRQHandler          /* TIM8 Update and TIM13        */        
  165.   .word     TIM8_TRG_COM_TIM14_IRQHandler     /* TIM8 Trigger and Commutation and TIM14 */
  166.   .word     TIM8_CC_IRQHandler                /* TIM8 Capture Compare         */                          
  167.   .word     DMA1_Stream7_IRQHandler           /* DMA1 Stream7                 */                          
  168.   .word     FSMC_IRQHandler                   /* FSMC                         */                  
  169.   .word     SDIO_IRQHandler                   /* SDIO                         */                  
  170.   .word     TIM5_IRQHandler                   /* TIM5                         */                  
  171.   .word     SPI3_IRQHandler                   /* SPI3                         */                  
  172.   .word     UART4_IRQHandler                  /* UART4                        */                  
  173.   .word     UART5_IRQHandler                  /* UART5                        */                  
  174.   .word     TIM6_DAC_IRQHandler               /* TIM6 and DAC1&2 underrun errors */                  
  175.   .word     TIM7_IRQHandler                   /* TIM7                         */
  176.   .word     DMA2_Stream0_IRQHandler           /* DMA2 Stream 0                */                  
  177.   .word     DMA2_Stream1_IRQHandler           /* DMA2 Stream 1                */                  
  178.   .word     DMA2_Stream2_IRQHandler           /* DMA2 Stream 2                */                  
  179.   .word     DMA2_Stream3_IRQHandler           /* DMA2 Stream 3                */                  
  180.   .word     DMA2_Stream4_IRQHandler           /* DMA2 Stream 4                */                  
  181.   .word     ETH_IRQHandler                    /* Ethernet                     */                  
  182.   .word     ETH_WKUP_IRQHandler               /* Ethernet Wakeup through EXTI line */                    
  183.   .word     CAN2_TX_IRQHandler                /* CAN2 TX                      */                          
  184.   .word     CAN2_RX0_IRQHandler               /* CAN2 RX0                     */                          
  185.   .word     CAN2_RX1_IRQHandler               /* CAN2 RX1                     */                          
  186.   .word     CAN2_SCE_IRQHandler               /* CAN2 SCE                     */                          
  187.   .word     OTG_FS_IRQHandler                 /* USB OTG FS                   */                  
  188.   .word     DMA2_Stream5_IRQHandler           /* DMA2 Stream 5                */                  
  189.   .word     DMA2_Stream6_IRQHandler           /* DMA2 Stream 6                */                  
  190.   .word     DMA2_Stream7_IRQHandler           /* DMA2 Stream 7                */                  
  191.   .word     USART6_IRQHandler                 /* USART6                       */                    
  192.   .word     I2C3_EV_IRQHandler                /* I2C3 event                   */                          
  193.   .word     I2C3_ER_IRQHandler                /* I2C3 error                   */                          
  194.   .word     OTG_HS_EP1_OUT_IRQHandler         /* USB OTG HS End Point 1 Out   */                  
  195.   .word     OTG_HS_EP1_IN_IRQHandler          /* USB OTG HS End Point 1 In    */                  
  196.   .word     OTG_HS_WKUP_IRQHandler            /* USB OTG HS Wakeup through EXTI */                        
  197.   .word     OTG_HS_IRQHandler                 /* USB OTG HS                   */                  
  198.   .word     DCMI_IRQHandler                   /* DCMI                         */                  
  199.   .word     CRYP_IRQHandler                   /* CRYP crypto                  */
  200.   .word     HASH_RNG_IRQHandler               /* Hash and Rng                 */
  201.   .word     FPU_IRQHandler                    /* FPU                          */
  202.                          
  203.                          
  204. /*******************************************************************************
  205. *
  206. * Provide weak aliases for each Exception handler to the Default_Handler.
  207. * As they are weak aliases, any function with the same name will override
  208. * this definition.
  209. *
  210. *******************************************************************************/
  211.    .weak      NMI_Handler
  212.    .thumb_set NMI_Handler,Default_Handler
  213.  
  214.    .weak      HardFault_Handler
  215.    .thumb_set HardFault_Handler,Default_Handler
  216.  
  217.    .weak      MemManage_Handler
  218.    .thumb_set MemManage_Handler,Default_Handler
  219.  
  220.    .weak      BusFault_Handler
  221.    .thumb_set BusFault_Handler,Default_Handler
  222.  
  223.    .weak      UsageFault_Handler
  224.    .thumb_set UsageFault_Handler,Default_Handler
  225.  
  226.    .weak      SVC_Handler
  227.    .thumb_set SVC_Handler,Default_Handler
  228.  
  229.    .weak      DebugMon_Handler
  230.    .thumb_set DebugMon_Handler,Default_Handler
  231.  
  232.    .weak      PendSV_Handler
  233.    .thumb_set PendSV_Handler,Default_Handler
  234.  
  235.    .weak      SysTick_Handler
  236.    .thumb_set SysTick_Handler,Default_Handler              
  237.  
  238.    .weak      WWDG_IRQHandler                  
  239.    .thumb_set WWDG_IRQHandler,Default_Handler      
  240.                  
  241.    .weak      PVD_IRQHandler      
  242.    .thumb_set PVD_IRQHandler,Default_Handler
  243.                
  244.    .weak      TAMP_STAMP_IRQHandler            
  245.    .thumb_set TAMP_STAMP_IRQHandler,Default_Handler
  246.            
  247.    .weak      RTC_WKUP_IRQHandler                  
  248.    .thumb_set RTC_WKUP_IRQHandler,Default_Handler
  249.            
  250.    .weak      FLASH_IRQHandler        
  251.    .thumb_set FLASH_IRQHandler,Default_Handler
  252.                  
  253.    .weak      RCC_IRQHandler      
  254.    .thumb_set RCC_IRQHandler,Default_Handler
  255.                  
  256.    .weak      EXTI0_IRQHandler        
  257.    .thumb_set EXTI0_IRQHandler,Default_Handler
  258.                  
  259.    .weak      EXTI1_IRQHandler        
  260.    .thumb_set EXTI1_IRQHandler,Default_Handler
  261.                      
  262.    .weak      EXTI2_IRQHandler        
  263.    .thumb_set EXTI2_IRQHandler,Default_Handler
  264.                  
  265.    .weak      EXTI3_IRQHandler        
  266.    .thumb_set EXTI3_IRQHandler,Default_Handler
  267.                        
  268.    .weak      EXTI4_IRQHandler        
  269.    .thumb_set EXTI4_IRQHandler,Default_Handler
  270.                  
  271.    .weak      DMA1_Stream0_IRQHandler              
  272.    .thumb_set DMA1_Stream0_IRQHandler,Default_Handler
  273.          
  274.    .weak      DMA1_Stream1_IRQHandler              
  275.    .thumb_set DMA1_Stream1_IRQHandler,Default_Handler
  276.                  
  277.    .weak      DMA1_Stream2_IRQHandler              
  278.    .thumb_set DMA1_Stream2_IRQHandler,Default_Handler
  279.                  
  280.    .weak      DMA1_Stream3_IRQHandler              
  281.    .thumb_set DMA1_Stream3_IRQHandler,Default_Handler
  282.                  
  283.    .weak      DMA1_Stream4_IRQHandler              
  284.    .thumb_set DMA1_Stream4_IRQHandler,Default_Handler
  285.                  
  286.    .weak      DMA1_Stream5_IRQHandler              
  287.    .thumb_set DMA1_Stream5_IRQHandler,Default_Handler
  288.                  
  289.    .weak      DMA1_Stream6_IRQHandler              
  290.    .thumb_set DMA1_Stream6_IRQHandler,Default_Handler
  291.                  
  292.    .weak      ADC_IRQHandler      
  293.    .thumb_set ADC_IRQHandler,Default_Handler
  294.                
  295.    .weak      CAN1_TX_IRQHandler  
  296.    .thumb_set CAN1_TX_IRQHandler,Default_Handler
  297.            
  298.    .weak      CAN1_RX0_IRQHandler                  
  299.    .thumb_set CAN1_RX0_IRQHandler,Default_Handler
  300.                            
  301.    .weak      CAN1_RX1_IRQHandler                  
  302.    .thumb_set CAN1_RX1_IRQHandler,Default_Handler
  303.            
  304.    .weak      CAN1_SCE_IRQHandler                  
  305.    .thumb_set CAN1_SCE_IRQHandler,Default_Handler
  306.            
  307.    .weak      EXTI9_5_IRQHandler  
  308.    .thumb_set EXTI9_5_IRQHandler,Default_Handler
  309.            
  310.    .weak      TIM1_BRK_TIM9_IRQHandler            
  311.    .thumb_set TIM1_BRK_TIM9_IRQHandler,Default_Handler
  312.            
  313.    .weak      TIM1_UP_TIM10_IRQHandler            
  314.    .thumb_set TIM1_UP_TIM10_IRQHandler,Default_Handler
  315.      
  316.    .weak      TIM1_TRG_COM_TIM11_IRQHandler      
  317.    .thumb_set TIM1_TRG_COM_TIM11_IRQHandler,Default_Handler
  318.      
  319.    .weak      TIM1_CC_IRQHandler  
  320.    .thumb_set TIM1_CC_IRQHandler,Default_Handler
  321.                  
  322.    .weak      TIM2_IRQHandler            
  323.    .thumb_set TIM2_IRQHandler,Default_Handler
  324.                  
  325.    .weak      TIM3_IRQHandler            
  326.    .thumb_set TIM3_IRQHandler,Default_Handler
  327.                  
  328.    .weak      TIM4_IRQHandler            
  329.    .thumb_set TIM4_IRQHandler,Default_Handler
  330.                  
  331.    .weak      I2C1_EV_IRQHandler  
  332.    .thumb_set I2C1_EV_IRQHandler,Default_Handler
  333.                      
  334.    .weak      I2C1_ER_IRQHandler  
  335.    .thumb_set I2C1_ER_IRQHandler,Default_Handler
  336.                      
  337.    .weak      I2C2_EV_IRQHandler  
  338.    .thumb_set I2C2_EV_IRQHandler,Default_Handler
  339.                  
  340.    .weak      I2C2_ER_IRQHandler  
  341.    .thumb_set I2C2_ER_IRQHandler,Default_Handler
  342.                            
  343.    .weak      SPI1_IRQHandler            
  344.    .thumb_set SPI1_IRQHandler,Default_Handler
  345.                        
  346.    .weak      SPI2_IRQHandler            
  347.    .thumb_set SPI2_IRQHandler,Default_Handler
  348.                  
  349.    .weak      USART1_IRQHandler      
  350.    .thumb_set USART1_IRQHandler,Default_Handler
  351.                      
  352.    .weak      USART2_IRQHandler      
  353.    .thumb_set USART2_IRQHandler,Default_Handler
  354.                      
  355.    .weak      USART3_IRQHandler      
  356.    .thumb_set USART3_IRQHandler,Default_Handler
  357.                  
  358.    .weak      EXTI15_10_IRQHandler              
  359.    .thumb_set EXTI15_10_IRQHandler,Default_Handler
  360.                
  361.    .weak      RTC_Alarm_IRQHandler              
  362.    .thumb_set RTC_Alarm_IRQHandler,Default_Handler
  363.            
  364.    .weak      OTG_FS_WKUP_IRQHandler        
  365.    .thumb_set OTG_FS_WKUP_IRQHandler,Default_Handler
  366.            
  367.    .weak      TIM8_BRK_TIM12_IRQHandler        
  368.    .thumb_set TIM8_BRK_TIM12_IRQHandler,Default_Handler
  369.          
  370.    .weak      TIM8_UP_TIM13_IRQHandler            
  371.    .thumb_set TIM8_UP_TIM13_IRQHandler,Default_Handler
  372.          
  373.    .weak      TIM8_TRG_COM_TIM14_IRQHandler      
  374.    .thumb_set TIM8_TRG_COM_TIM14_IRQHandler,Default_Handler
  375.      
  376.    .weak      TIM8_CC_IRQHandler  
  377.    .thumb_set TIM8_CC_IRQHandler,Default_Handler
  378.                  
  379.    .weak      DMA1_Stream7_IRQHandler              
  380.    .thumb_set DMA1_Stream7_IRQHandler,Default_Handler
  381.                      
  382.    .weak      FSMC_IRQHandler            
  383.    .thumb_set FSMC_IRQHandler,Default_Handler
  384.                      
  385.    .weak      SDIO_IRQHandler            
  386.    .thumb_set SDIO_IRQHandler,Default_Handler
  387.                      
  388.    .weak      TIM5_IRQHandler            
  389.    .thumb_set TIM5_IRQHandler,Default_Handler
  390.                      
  391.    .weak      SPI3_IRQHandler            
  392.    .thumb_set SPI3_IRQHandler,Default_Handler
  393.                      
  394.    .weak      UART4_IRQHandler        
  395.    .thumb_set UART4_IRQHandler,Default_Handler
  396.                  
  397.    .weak      UART5_IRQHandler        
  398.    .thumb_set UART5_IRQHandler,Default_Handler
  399.                  
  400.    .weak      TIM6_DAC_IRQHandler                  
  401.    .thumb_set TIM6_DAC_IRQHandler,Default_Handler
  402.                
  403.    .weak      TIM7_IRQHandler            
  404.    .thumb_set TIM7_IRQHandler,Default_Handler
  405.          
  406.    .weak      DMA2_Stream0_IRQHandler              
  407.    .thumb_set DMA2_Stream0_IRQHandler,Default_Handler
  408.                
  409.    .weak      DMA2_Stream1_IRQHandler              
  410.    .thumb_set DMA2_Stream1_IRQHandler,Default_Handler
  411.                  
  412.    .weak      DMA2_Stream2_IRQHandler              
  413.    .thumb_set DMA2_Stream2_IRQHandler,Default_Handler
  414.            
  415.    .weak      DMA2_Stream3_IRQHandler              
  416.    .thumb_set DMA2_Stream3_IRQHandler,Default_Handler
  417.            
  418.    .weak      DMA2_Stream4_IRQHandler              
  419.    .thumb_set DMA2_Stream4_IRQHandler,Default_Handler
  420.            
  421.    .weak      ETH_IRQHandler      
  422.    .thumb_set ETH_IRQHandler,Default_Handler
  423.                  
  424.    .weak      ETH_WKUP_IRQHandler                  
  425.    .thumb_set ETH_WKUP_IRQHandler,Default_Handler
  426.            
  427.    .weak      CAN2_TX_IRQHandler  
  428.    .thumb_set CAN2_TX_IRQHandler,Default_Handler
  429.                            
  430.    .weak      CAN2_RX0_IRQHandler                  
  431.    .thumb_set CAN2_RX0_IRQHandler,Default_Handler
  432.                            
  433.    .weak      CAN2_RX1_IRQHandler                  
  434.    .thumb_set CAN2_RX1_IRQHandler,Default_Handler
  435.                            
  436.    .weak      CAN2_SCE_IRQHandler                  
  437.    .thumb_set CAN2_SCE_IRQHandler,Default_Handler
  438.                            
  439.    .weak      OTG_FS_IRQHandler      
  440.    .thumb_set OTG_FS_IRQHandler,Default_Handler
  441.                      
  442.    .weak      DMA2_Stream5_IRQHandler              
  443.    .thumb_set DMA2_Stream5_IRQHandler,Default_Handler
  444.                  
  445.    .weak      DMA2_Stream6_IRQHandler              
  446.    .thumb_set DMA2_Stream6_IRQHandler,Default_Handler
  447.                  
  448.    .weak      DMA2_Stream7_IRQHandler              
  449.    .thumb_set DMA2_Stream7_IRQHandler,Default_Handler
  450.                  
  451.    .weak      USART6_IRQHandler      
  452.    .thumb_set USART6_IRQHandler,Default_Handler
  453.                        
  454.    .weak      I2C3_EV_IRQHandler  
  455.    .thumb_set I2C3_EV_IRQHandler,Default_Handler
  456.                        
  457.    .weak      I2C3_ER_IRQHandler  
  458.    .thumb_set I2C3_ER_IRQHandler,Default_Handler
  459.                        
  460.    .weak      OTG_HS_EP1_OUT_IRQHandler        
  461.    .thumb_set OTG_HS_EP1_OUT_IRQHandler,Default_Handler
  462.                
  463.    .weak      OTG_HS_EP1_IN_IRQHandler            
  464.    .thumb_set OTG_HS_EP1_IN_IRQHandler,Default_Handler
  465.                
  466.    .weak      OTG_HS_WKUP_IRQHandler        
  467.    .thumb_set OTG_HS_WKUP_IRQHandler,Default_Handler
  468.            
  469.    .weak      OTG_HS_IRQHandler      
  470.    .thumb_set OTG_HS_IRQHandler,Default_Handler
  471.                  
  472.    .weak      DCMI_IRQHandler            
  473.    .thumb_set DCMI_IRQHandler,Default_Handler
  474.  
  475.    .weak   CRYP_IRQHandler
  476.    .thumb_set CRYP_IRQHandler,Default_Handler
  477.                                    
  478.    .weak      HASH_RNG_IRQHandler                  
  479.    .thumb_set HASH_RNG_IRQHandler,Default_Handler  
  480.  
  481.    .weak      FPU_IRQHandler                  
  482.    .thumb_set FPU_IRQHandler,Default_Handler  
  483.  
  484. /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/

Pierwsze co rzuca się w oczy jest definicja fpu jako programowa:

  1. .fpu softvfp

Pomimo zdefiniowana obsługi jako sprzętowa w parametrach projektu:



Prawdopodobnie nie będzie to miało znaczenia i obsługa FPU będzie zgodna z parametrami zdefiniowanymi w opcjach kompilacji projektu. Natomiast można to zmienić na:

  1. .fpu fpv4-sp-d16

Tak aby parametry były zgodne z danumi ustawionymi w opcjach projektu.

Poniżej znajdują się definicje stałych przekazywanych z plików linkera o lokalizacji poszczególnych elementów w pamięci:

  1. /* start address for the initialization values of the .data section.
  2. defined in linker script */
  3. .word  _sidata
  4. /* start address for the .data section. defined in linker script */  
  5. .word  _sdata
  6. /* end address for the .data section. defined in linker script */
  7. .word  _edata
  8. /* start address for the .bss section. defined in linker script */
  9. .word  _sbss
  10. /* end address for the .bss section. defined in linker script */
  11. .word  _ebss
  12. /* stack used for SystemInit_ExtMemCtl; always internal RAM used */

Definicje miejsc w pamięci można znaleźć w pliku STM32F407VGTX_FLASH.ld.

Kolejnym elementem jest definicja Reset_Handler(). Wprowadza ona odpowiednie adresy pamięci do rejestrów oraz inicjalizuje miejsca w pamięci wartościami 0.

Reset_Handler wywoływany jest na starcie systemu. Jest on przerwaniem nadrzędnym z najwyższym priorytetem. 

  1.     .section  .text.Reset_Handler
  2.   .weak  Reset_Handler
  3.   .type  Reset_Handler, %function
  4. Reset_Handler:  
  5.   ldr   sp, =_estack     /* set stack pointer */
  6.  
  7. /* Copy the data segment initializers from flash to SRAM */  
  8.   ldr r0, =_sdata
  9.   ldr r1, =_edata
  10.   ldr r2, =_sidata
  11.   movs r3, #0
  12.   b LoopCopyDataInit
  13.  
  14. CopyDataInit:
  15.   ldr r4, [r2, r3]
  16.   str r4, [r0, r3]
  17.   adds r3, r3, #4
  18.  
  19. LoopCopyDataInit:
  20.   adds r4, r0, r3
  21.   cmp r4, r1
  22.   bcc CopyDataInit
  23.  
  24. /* Zero fill the bss segment. */
  25.   ldr r2, =_sbss
  26.   ldr r4, =_ebss
  27.   movs r3, #0
  28.   b LoopFillZerobss
  29.  
  30. FillZerobss:
  31.   str  r3, [r2]
  32.   adds r2, r2, #4
  33.  
  34. LoopFillZerobss:
  35.   cmp r2, r4
  36.   bcc FillZerobss
  37.  
  38. /* Call the clock system intitialization function.*/
  39.   bl  SystemInit  
  40. /* Call static constructors */
  41.     bl __libc_init_array
  42. /* Call the application's entry point.*/
  43.   bl  main
  44.   bx  lr    
  45. .size  Reset_Handler, .-Reset_Handler
 
Kolejnym elementem jest Default_Handler() ten kod jest wywoływany gdy zostanie wygenerowane przerwanie, które nie ma przypisanej do niej odpowiedniej funkcji obsługującej:

  1.     .section  .text.Default_Handler,"ax",%progbits
  2. Default_Handler:
  3. Infinite_Loop:
  4.   b  Infinite_Loop
  5.   .size  Default_Handler, .-Default_Handler

Funkcja składa się jedynie z pętli nieskończonej.

W celu sprawdzenia co wywołało to przerwanie można skorzystać z rejestrów NVIC_IABRx.


Dla bitu odpowiadającej sygnałowi przerwania zostanie ustawiona wartość 1, gdy przerwanie jest aktywne, lub 0. Rejestry przechowują informację o przerwaniach w zależności od mikrokontrolera. W przypadku układu STM32F4 numeracja jest od 0 do 81.

Dalej znajduje się tablica wektorów przerwań. Dotyczy to całej listy zdefiniowanej w pliku startup. Funkcje zdefiniowane są jako weak, co oznacza, że można je nadpisać w programie przez funkcję o tej samej nazwie. W przypadku nie znalezienia funkcji o takiej nazwie, zostanie wywołana funkcje Default_Handler.

  1. .weak      NMI_Handler
  2. .thumb_set NMI_Handler,Default_Handler
  3.  
  4. .weak      HardFault_Handler
  5. .thumb_set HardFault_Handler,Default_Handler

Poniżej znajduje się tablica wektorów przerwań. Odpowiada ona informacją jakie są zawarte w dokumentacji PM0215.


Należy przy tym pamiętać, że konkretna funkcja musi znajdować się w przygotowanym dla niej miejscu. Ustawienie innej funkcji obsługi przerwania w złym miejscu spowoduje wywołanie obsługi nie tej funkcji której oczekujemy.  

  1.    .section  .isr_vector,"a",%progbits
  2.   .type  g_pfnVectors, %object
  3.   .size  g_pfnVectors, .-g_pfnVectors
  4.    
  5.    
  6. g_pfnVectors:
  7.   .word  _estack
  8.   .word  Reset_Handler
  9.   .word  NMI_Handler
  10.   .word  HardFault_Handler
  11.   .word  MemManage_Handler
  12.   .word  BusFault_Handler
  13.   .word  UsageFault_Handler
  14.   .word  0
  15.   .word  0
  16.   .word  0
  17.   .word  0
  18.   .word  SVC_Handler
  19.   .word  DebugMon_Handler
  20.   .word  0
  21.   .word  PendSV_Handler
  22.   .word  SysTick_Handler
  23.  
  24.   /* External Interrupts */
  25.   .word     WWDG_IRQHandler                   /* Window WatchDog              */                                        
  26.   .word     PVD_IRQHandler                    /* PVD through EXTI Line detection */                        
  27.   .word     TAMP_STAMP_IRQHandler             /* Tamper and TimeStamps through the EXTI line */            
  28.   .word     RTC_WKUP_IRQHandler               /* RTC Wakeup through the EXTI line */  

W przypadku generowanie pliku należy sprawdzić czy jest w nim zawarte odpowiednie przerwanie. Ponieważ nie wszystkie informacje mogły zostać dodane podczas przygotowywania projektu przez CubeMx. Teraz jest to znacznie bardziej dopracowane niż kilka lat temu, natomiast nie zaszkodzi zweryfikować czy wszystkie informacje są poprawne, tak aby niepotrzebnie nie traci czasu podczas debugowania projektu.

W wygenerowanym przez CubeMx pliku startup nie została zawarta funkcji obsługująca przerwanie od CRYP (Cryp global interrupt, pozycja 79). Aby je uruchomić należałoby zmodyfikować plik i wprowadzić następującą linijkę danych:

  1. .weak   CRYP_IRQHandler
  2.  
  3. //oraz
  4.  
  5. .weak   DCMI_IRQHandler
  6. .thumb_set DCMI_IRQHandler,Default_Handler
  7. //To dodane
  8. .weak   CRYP_IRQHandler
  9. .thumb_set CRYP_IRQHandler,Default_Handler
  10.  
  11. .weak   HASH_RNG_IRQHandler
  12. .thumb_set HASH_RNG_IRQHandler,Default_Handler

Opis tablicy z wektorami przerwań można znaleźć w dokumencie od ST (RM0090) :


Pomiędzy układami z rodziny STM pliki różnią się miedzy sobą tablicami z wektorami przerwań. Pozostałe elementy są w zasadzie identyczne.