STM32 keil mdk启动代码发分析

 

STM32 keil mdk启动代码发分析 收藏

学习STM32,看了一堆乱七八糟的文档,准备写程序了,先分析了下STM32的启动代码,看着这堆鬼鬼的汇编代码,挺吓人的,看看帮助,查查网路,还是不那么难懂。

 

  1. ;// <h> Stack Configuration  
  2. ;//   <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>  
  3. ;// </h>  
  4. Stack_Size      EQU     0x00000200                           ;//定义堆栈大小  
  5.                 AREA    STACK, NOINIT, READWRITE, ALIGN=3    ;//定义一个数据段 按8字节对齐  
  6. Stack_Mem       SPACE   Stack_Size                           ;//保留Stack_Size大小的堆栈空间  
  7. __initial_sp                                                 ;//标号,代表堆栈顶部地址,后面有用  
  8.   
  9. ;// <h> Heap Configuration  
  10. ;//   <o>  Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>  
  11. ;// </h>  
  12. Heap_Size       EQU     0x00000020                            ;//定义堆空间大小  
  13.                 AREA    HEAP, NOINIT, READWRITE, ALIGN=3      ;//定义一个数据段,8字节对齐  
  14. __heap_base  
  15. Heap_Mem        SPACE   Heap_Size                             ;//保留Heap_Size的堆空间  
  16. __heap_limit                                                  ;//标号,代表堆末尾地址,后面有用  
  17.   
  18.                 PRESERVE8                                     ;//指示编译器8字节对齐  
  19.                 THUMB                                         ;//指示编译器为THUMB指令  
  20.   
  21. ; Vector Table Mapped to Address 0 at Reset  
  22.                 AREA    RESET, DATA, READONLY                  ;//定义只读数据段,其实放在CODE区,位于0地址  
  23.                   
  24.                 EXTERN  NMIException  
  25.                 EXTERN  HardFaultException  
  26.                 EXTERN  MemManageException  
  27.                 EXTERN  BusFaultException  
  28.                 EXTERN  UsageFaultException  
  29.                 EXTERN  SVCHandler  
  30.                 EXTERN  DebugMonitor  
  31.                 EXTERN  PendSVC  
  32.                 EXTERN  SysTickHandler                         ;//声明这些符号在外部定义,同C  
  33.                                                                ;//在××it.c中实现这些函数 ,中断就能自动调用了  
  34.                 EXPORT  __Vectors  
  35. __Vectors       DCD     __initial_sp              ; Top of Stack         //Cotex-M  要求此处为堆栈顶部地址  
  36.                 DCD     Reset_Handler             ; Reset Handler  
  37.                 DCD     NMIException              ; NMI Handler  
  38.                 DCD     HardFaultException        ; Hard Fault Handler  
  39.                 DCD     MemManageException        ; MPU Fault Handler  
  40.                 DCD     BusFaultException         ; Bus Fault Handler  
  41.                 DCD     UsageFaultException       ; Usage Fault Handler  
  42.                 DCD     0                         ; Reserved  
  43.                 DCD     0                         ; Reserved  
  44.                 DCD     0                         ; Reserved  
  45.                 DCD     0                         ; Reserved  
  46.                 DCD     SVCHandler                ; SVCall Handler  
  47.                 DCD     DebugMonitor              ; Debug Monitor Handler  
  48.                 DCD     0                         ; Reserved  
  49.                 DCD     PendSVC                   ; PendSV Handler  
  50.                 DCD     SysTickHandler            ; SysTick Handler      //一大堆的异常处理函数地址  
  51.                 ; External Interrupts  
  52.                 EXTERN  WWDG_IRQHandler  
  53.                 EXTERN  PVD_IRQHandler  
  54.                 EXTERN  TAMPER_IRQHandler  
  55.                 EXTERN  RTC_IRQHandler  
  56.                 EXTERN  FLASH_IRQHandler  
  57.                 EXTERN  RCC_IRQHandler  
  58.                 EXTERN  EXTI0_IRQHandler  
  59.                 EXTERN  EXTI1_IRQHandler  
  60.                 EXTERN  EXTI2_IRQHandler  
  61.                 EXTERN  EXTI3_IRQHandler  
  62.                 EXTERN  EXTI4_IRQHandler  
  63.                 EXTERN  DMAChannel1_IRQHandler  
  64.                 EXTERN  DMAChannel2_IRQHandler  
  65.                 EXTERN  DMAChannel3_IRQHandler  
  66.                 EXTERN  DMAChannel4_IRQHandler  
  67.                 EXTERN  DMAChannel5_IRQHandler  
  68.                 EXTERN  DMAChannel6_IRQHandler  
  69.                 EXTERN  DMAChannel7_IRQHandler  
  70.                 EXTERN  ADC_IRQHandler  
  71.                 EXTERN  USB_HP_CAN_TX_IRQHandler  
  72.                 EXTERN  USB_LP_CAN_RX0_IRQHandler  
  73.                 EXTERN  CAN_RX1_IRQHandler  
  74.                 EXTERN  CAN_SCE_IRQHandler  
  75.                 EXTERN  EXTI9_5_IRQHandler  
  76.                 EXTERN  TIM1_BRK_IRQHandler  
  77.                 EXTERN  TIM1_UP_IRQHandler  
  78.                 EXTERN  TIM1_TRG_COM_IRQHandler  
  79.                 EXTERN  TIM1_CC_IRQHandler  
  80.                 EXTERN  TIM2_IRQHandler  
  81.                 EXTERN  TIM3_IRQHandler  
  82.                 EXTERN  TIM4_IRQHandler  
  83.                 EXTERN  I2C1_EV_IRQHandler  
  84.                 EXTERN  I2C1_ER_IRQHandler  
  85.                 EXTERN  I2C2_EV_IRQHandler  
  86.                 EXTERN  I2C2_ER_IRQHandler  
  87.                 EXTERN  SPI1_IRQHandler  
  88.                 EXTERN  SPI2_IRQHandler  
  89.                 EXTERN  USART1_IRQHandler  
  90.                 EXTERN  USART2_IRQHandler  
  91.                 EXTERN  USART3_IRQHandler  
  92.                 EXTERN  EXTI15_10_IRQHandler  
  93.                 EXTERN  RTCAlarm_IRQHandler  
  94.                 EXTERN  USBWakeUp_IRQHandler                    ;//同上,  
  95.                   
  96.                 DCD     WWDG_IRQHandler           ; Window Watchdog  
  97.                 DCD     PVD_IRQHandler            ; PVD through EXTI Line detect  
  98.                 DCD     TAMPER_IRQHandler         ; Tamper  
  99.                 DCD     RTC_IRQHandler            ; RTC  
  100.                 DCD     FLASH_IRQHandler          ; Flash  
  101.                 DCD     RCC_IRQHandler            ; RCC  
  102.                 DCD     EXTI0_IRQHandler          ; EXTI Line 0  
  103.                 DCD     EXTI1_IRQHandler          ; EXTI Line 1  
  104.                 DCD     EXTI2_IRQHandler          ; EXTI Line 2  
  105.                 DCD     EXTI3_IRQHandler          ; EXTI Line 3  
  106.                 DCD     EXTI4_IRQHandler          ; EXTI Line 4  
  107.                 DCD     DMAChannel1_IRQHandler    ; DMA Channel 1  
  108.                 DCD     DMAChannel2_IRQHandler    ; DMA Channel 2  
  109.                 DCD     DMAChannel3_IRQHandler    ; DMA Channel 3  
  110.                 DCD     DMAChannel4_IRQHandler    ; DMA Channel 4  
  111.                 DCD     DMAChannel5_IRQHandler    ; DMA Channel 5  
  112.                 DCD     DMAChannel6_IRQHandler    ; DMA Channel 6  
  113.                 DCD     DMAChannel7_IRQHandler    ; DMA Channel 7  
  114.                 DCD     ADC_IRQHandler            ; ADC  
  115.                 DCD     USB_HP_CAN_TX_IRQHandler  ; USB High Priority or CAN TX  
  116.                 DCD     USB_LP_CAN_RX0_IRQHandler ; USB Low  Priority or CAN RX0  
  117.                 DCD     CAN_RX1_IRQHandler        ; CAN RX1  
  118.                 DCD     CAN_SCE_IRQHandler        ; CAN SCE  
  119.                 DCD     EXTI9_5_IRQHandler        ; EXTI Line 9..5  
  120.                 DCD     TIM1_BRK_IRQHandler       ; TIM1 Break  
  121.                 DCD     TIM1_UP_IRQHandler        ; TIM1 Update  
  122.                 DCD     TIM1_TRG_COM_IRQHandler   ; TIM1 Trigger and Commutation  
  123.                 DCD     TIM1_CC_IRQHandler        ; TIM1 Capture Compare  
  124.                 DCD     TIM2_IRQHandler           ; TIM2  
  125.                 DCD     TIM3_IRQHandler           ; TIM3  
  126.                 DCD     TIM4_IRQHandler           ; TIM4  
  127.                 DCD     I2C1_EV_IRQHandler        ; I2C1 Event  
  128.                 DCD     I2C1_ER_IRQHandler        ; I2C1 Error  
  129.                 DCD     I2C2_EV_IRQHandler        ; I2C2 Event  
  130.                 DCD     I2C2_ER_IRQHandler        ; I2C2 Error  
  131.                 DCD     SPI1_IRQHandler           ; SPI1  
  132.                 DCD     SPI2_IRQHandler           ; SPI2  
  133.                 DCD     USART1_IRQHandler         ; USART1  
  134.                 DCD     USART2_IRQHandler         ; USART2  
  135.                 DCD     USART3_IRQHandler         ; USART3  
  136.                 DCD     EXTI15_10_IRQHandler      ; EXTI Line 15..10  
  137.                 DCD     RTCAlarm_IRQHandler       ; RTC Alarm through EXTI Line  
  138.                 DCD     USBWakeUp_IRQHandler      ; USB Wakeup from suspend   ;//同上  
  139.   
  140.                 AREA    |.text|, CODE, READONLY        ;//定义代码段  
  141.   
  142. ; Reset Handler  
  143. Reset_Handler   PROC                                        ;//Rset_Handler的实现  
  144.                 EXPORT  Reset_Handler             [WEAK]    ;//在外部没有定义该符号时导出该符号,见HELP中[WEAK]  
  145.                 IMPORT  __main                              ;//导入符号,__main为 运行时库提供的函数;完成堆栈,堆的初始话  
  146.                 LDR     R0, =__main                         ;//等工作,会调用下面定义的__user_initial_stackheap;  
  147.                 BX      R0                                  ;//跳到__main,进入C的世界  
  148.                 ENDP  
  149.   
  150.                 ALIGN  
  151.   
  152. ; User Initial Stack & Heap  
  153.                 IF      :DEF:__MICROLIB                     ;//如果使用micro lib,micro lib 描述见armlib.chm  
  154.                   
  155.                 EXPORT  __initial_sp  
  156.                 EXPORT  __heap_base  
  157.                 EXPORT  __heap_limit                        ;//只导出几个定义  
  158.                   
  159.                 ELSE                                        ;//如果使用默认C运行时库  
  160.                   
  161.                 IMPORT  __use_two_region_memory  
  162.                 EXPORT  __user_initial_stackheap  
  163. __user_initial_stackheap                                    ;//则进行堆栈和堆的赋值,在__main函数执行过程中调用。  
  164.                 LDR     R0, =  Heap_Mem  
  165.                 LDR     R1, =(Stack_Mem + Stack_Size)  
  166.                 LDR     R2, = (Heap_Mem +  Heap_Size)  
  167.                 LDR     R3, = Stack_Mem  
  168.                 BX      LR  
  169.                 ALIGN  
  170.                 ENDIF  
  171.   
  172.                 END                                         ;//OK ,完了  
 

 

 

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Version: 2.15.0 (2020-09-28) Keil.STM32F4xx_DFP.2.15.0.pack Download Updated Pack to STM32Cube_FW_F4 Firmware Package version V1.25.1 using HAL Drivers V1.7.9. STM32CubeMX integration (Version 6.0.1): Added support for Timebase Source TIMx (FrameworkCubeMX_gpdsc.ftl). Removed non-existent include path. CMSIS Flash Algorithm: Corrected STM32F42xxx_43xxx_OPT Algorithm. CMSIS SVD: Updated STM32F42*.svd, STM32F43*.svd files. CMSIS-Driver: I2C: Corrected 2 byte reception in master mode. MCI: Replaced empty delay loops with _NOP(). SPI: Corrected PowerControl function (to return error if Initialize was not called, to abort active transfer if power off was requested). Updated GetDataCount function to give accurate count in DMA mode. Corrected Control function (abort in DMA mode, software controlled slave select in slave mode, TI Frame Format selection, ignore bus speed for slave mode). Corrected Uninitialize function (to power off the peripheral if it is powered). Corrected SPI3_SCK pin configuration. Corrected DMA MemDataAlignment configuration. USART: Corrected DMA MemDataAlignment configuration. USBD_HS/USBH_HS: OTG_HS ULPI clock disabled in low power if internal PHY is used to enable proper operation of OTG_HS port in FS mode during CPU sleep. CAN/EMAC/USBD/USBH: Removed macros already provided by cmsis_compiler.h. Updated Boards Examples: Migrated CubeMX projects to V6.0.1 and updated config files. Changed variant selection to "MDK-Plus" where possible. Updated all USB Host/Device examples with user templates from MDK-Middleware v7.11.1. Terminating app_main thread with osThreadExit() to avoid endless loop Updated MS Windows UBS driver files.

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值