#PS:要轉載請注明出處,本人版權所有
#PS:這個只是 《 我自己 》理解,如果和你的
#原則相沖突,請諒解,勿噴
對于keil的啟動代碼(針對STM32F042),添加 備注 和 自己的理解
;******************** (C) COPYRIGHT
2014 STMicroelectronics ********************
;* File Name : startup_stm32f042.s
;* Author : MCD Application Team,modified
by Sky,
;* Version : V1
.5.0
;* Date :
05-December-
2014,modified
on,
01-Nov-
2016
;* Description : STM32F042 Devices vector table
for
;*
for MDK-ARM toolchain.
;* This module performs:
;* - Set
the initial SP
;* - Set
the initial PC == Reset_Handler
;* - Set
the vector table entries
with the exceptions ISR address
;* - Configure
the system clock
;* - Branches
to __main
in the C library (which eventually
;* calls main()).
;* After Reset
the CortexM0 processor
is in Thread mode,
;* priority
is Privileged,
and the Stack
is set to Main.
;* <<< Use Configuration Wizard
in Context Menu >>>
;*******************************************************************************
; @attention
;
; Licensed under MCD-ST Liberty SW License Agreement V2, (
the "License");
; You may
not use this
file except
in compliance
with the License.
; You may obtain a
copy of the License
at:
;
; http:;;www.st.com/software_license_agreement_liberty_v2
;
; Unless required
by applicable law
or agreed
to in writing, software
; distributed under
the License
is distributed
on an
"AS IS" BASIS,
; WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
or implied.
; See
the License
for the specific language governing permissions
and
; limitations under
the License.
;
;*******************************************************************************;
;
;notes:stack,heap,data seg,code seg address
of mem
is set by compiler
;
;;
; Amount
of memory (
in bytes) allocated
for Stack
; Tailor this value
to your
application needs
; <h> Stack Configuration
; <o> Stack Size (
in Bytes) <
0x0-
0xFFFFFFFF:
8>
; </h>\;;EQU 定義宏
;;棧大小,
1k
Stack_Size EQU
0x00000400
;;AREA 定義段,注意:一個程序是由多個段構成,如CODE,STACK,DATA,
;;ALIGN=
3,
8字節對齊AREA STACK, NOINIT, READWRITE, ALIGN=
3
Stack_Mem SPACE Stack_Size
;;__initial_sp一個標號,由匯編器進行計算,代表上面SPACE分配內存的最后一個地址,棧為向下增長型
__initial_sp; <h> Heap Configuration
; <o> Heap Size (
in Bytes) <
0x0-
0xFFFFFFFF:
8>
; </h>
;;堆
512bytes
Heap_Size EQU
0x00000200AREA HEAP, NOINIT, READWRITE, ALIGN=
3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
;;PRESERVE8,指定當前文件堆棧
8bytes對齊PRESERVE8
;;THUMB,后面的指令要兼容THUMB指令THUMB; Vector Table Mapped
to Address
0 at Reset
;;定義一個叫做RESET的數據段AREA RESET, DATA, READONLY
;;EXPORT聲明標號為外部文件可用EXPORT __VectorsEXPORT __Vectors_EndEXPORT __Vectors_Size
;;DCD是按
4字節分配存儲單元
__Vectors DCD __initial_sp ; Top
of StackDCD Reset_Handler ; Reset HandlerDCD NMI_Handler ; NMI HandlerDCD HardFault_Handler ; Hard Fault HandlerDCD
0 ; ReservedDCD
0 ; ReservedDCD
0 ; ReservedDCD
0 ; ReservedDCD
0 ; ReservedDCD
0 ; ReservedDCD
0 ; ReservedDCD SVC_Handler ; SVCall HandlerDCD
0 ; ReservedDCD
0 ; ReservedDCD PendSV_Handler ; PendSV HandlerDCD SysTick_Handler ; SysTick Handler; External InterruptsDCD WWDG_IRQHandler ; Window WatchdogDCD PVD_VDDIO2_IRQHandler ; PVD
and VDDIO2
through EXTI Line detectDCD RTC_IRQHandler ; RTC
through EXTI LineDCD FLASH_IRQHandler ; FLASHDCD RCC_CRS_IRQHandler ; RCC
and CRSDCD EXTI0_1_IRQHandler ; EXTI Line
0 and 1DCD EXTI2_3_IRQHandler ; EXTI Line
2 and 3DCD EXTI4_15_IRQHandler ; EXTI Line
4 to 15DCD TSC_IRQHandler ; TSDCD DMA1_Channel1_IRQHandler ; DMA1 Channel
1DCD DMA1_Channel2_3_IRQHandler ; DMA1 Channel
2 and Channel
3DCD DMA1_Channel4_5_IRQHandler ; DMA1 Channel
4, Channel
5DCD ADC1_IRQHandler ; ADC1 DCD TIM1_BRK_UP_TRG_COM_IRQHandler ; TIM1 Break, Update, Trigger
and CommutationDCD TIM1_CC_IRQHandler ; TIM1 Capture CompareDCD TIM2_IRQHandler ; TIM2DCD TIM3_IRQHandler ; TIM3DCD
0 ; ReservedDCD
0 ; ReservedDCD TIM14_IRQHandler ; TIM14DCD
0 ; ReservedDCD TIM16_IRQHandler ; TIM16DCD TIM17_IRQHandler ; TIM17DCD I2C1_IRQHandler ; I2C1DCD
0 ; ReservedDCD SPI1_IRQHandler ; SPI1DCD SPI2_IRQHandler ; SPI2DCD USART1_IRQHandler ; USART1DCD USART2_IRQHandler ; USART2DCD
0 ; ReservedDCD CEC_CAN_IRQHandler ; CEC
and CANDCD USB_IRQHandler ; USB__Vectors_End__Vectors_Size EQU __Vectors_End - __Vectors;;定義一個.
text的代碼段AREA |.
text|, CODE, READONLY;STM32F03x devices feature
4Kbytes
of static SRAM. STM32F04x devices feature
;
6 Kbytes
of static SRAM. STM32F05x devices feature
8Kbytes
of static SRAM.
;STM32F07xS devices feature
16 Kbytes
of static SRAM. STM32F09x devices feature
;
32 Kbytes
of static SRAM.; Reset handler routine
;;PROC定義子程序
Reset_Handler PROC
;;WEAK:弱定義EXPORT Reset_Handler [WEAK]IMPORT __mainIMPORT SystemInit;;給R0賦值,sp的值LDR R0, =__initial_sp ;
set stack pointer
;;R0給MSP寄存器MSR MSP, R0 ;;Check
if boot
space corresponds
to test memory LDR R0,=
0x00000004LDR R1, [R0];;R1=
0x08000004 OR R1=
0x20000004 OR R1=
0x1FXX XXXX;;when R1=R1=
0x1FXX XXXX,we can know
that Reset_Handler'sAddress
is not right,;;
it maybe
in reserved
or systemmemory
or optionbyte,we must remap address
for start
;;Logical shift right
by register LSRSLSRS R1, R1, ;R2=
0x0000001FLDR R2,=
0x1FCMP R1, R2BNE ApplicationStart ;; SYSCFG clock enable ;RCC_APB2ENR,
0x40021018 LDR R0,=
0x40021018 LDR R1,=
0x00000001STR R1, [R0];; Set CFGR1 register
with flash memory remap
at address
0;SYS_CFGR1,
0x40010000 LDR R0,=
0x40010000 LDR R1,=
0x00000000STR R1, [R0]
ApplicationStartLDR R0, =SystemInitBLX R0LDR R0, =__mainBX R0ENDP; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler PROCEXPORT NMI_Handler [WEAK];;B . 無限循環B .ENDP
HardFault_Handler\PROCEXPORT HardFault_Handler [WEAK]B .ENDP
SVC_Handler PROCEXPORT SVC_Handler [WEAK]B .ENDP
PendSV_Handler PROCEXPORT PendSV_Handler [WEAK]B .ENDP
SysTick_Handler PROCEXPORT SysTick_Handler [WEAK]B .ENDPDefault_Handler PROCEXPORT WWDG_IRQHandler [WEAK]EXPORT PVD_VDDIO2_IRQHandler [WEAK]EXPORT RTC_IRQHandler [WEAK]EXPORT FLASH_IRQHandler [WEAK]EXPORT RCC_CRS_IRQHandler [WEAK]EXPORT EXTI0_1_IRQHandler [WEAK]EXPORT EXTI2_3_IRQHandler [WEAK]EXPORT EXTI4_15_IRQHandler [WEAK]EXPORT TSC_IRQHandler [WEAK]EXPORT DMA1_Channel1_IRQHandler [WEAK]EXPORT DMA1_Channel2_3_IRQHandler [WEAK]EXPORT DMA1_Channel4_5_IRQHandler [WEAK]EXPORT ADC1_IRQHandler [WEAK]EXPORT TIM1_BRK_UP_TRG_COM_IRQHandler [WEAK]EXPORT TIM1_CC_IRQHandler [WEAK]EXPORT TIM2_IRQHandler [WEAK]EXPORT TIM3_IRQHandler [WEAK]EXPORT TIM14_IRQHandler [WEAK]EXPORT TIM16_IRQHandler [WEAK]EXPORT TIM17_IRQHandler [WEAK]EXPORT I2C1_IRQHandler [WEAK]EXPORT SPI1_IRQHandler [WEAK]EXPORT SPI2_IRQHandler [WEAK]EXPORT USART1_IRQHandler [WEAK]EXPORT USART2_IRQHandler [WEAK]EXPORT CEC_CAN_IRQHandler [WEAK]EXPORT USB_IRQHandler [WEAK]WWDG_IRQHandler
PVD_VDDIO2_IRQHandler
RTC_IRQHandler
FLASH_IRQHandler
RCC_CRS_IRQHandler
EXTI0_1_IRQHandler
EXTI2_3_IRQHandler
EXTI4_15_IRQHandler
TSC_IRQHandler
DMA1_Channel1_IRQHandler
DMA1_Channel2_3_IRQHandler
DMA1_Channel4_5_IRQHandler
ADC1_IRQHandler
TIM1_BRK_UP_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM14_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
I2C1_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
CEC_CAN_IRQHandler
USB_IRQHandler B .ENDPALIGN;*******************************************************************************
; User Stack
and Heap initialization
;*******************************************************************************IF :DEF:__MICROLIBEXPORT __initial_spEXPORT __heap_baseEXPORT __heap_limitELSEIMPORT __use_two_region_memoryEXPORT __user_initial_stackheap__user_initial_stackheapLDR R0, = Heap_MemLDR R1, =(Stack_Mem + Stack_Size)LDR R2, = (Heap_Mem + Heap_Size)LDR R3, = Stack_MemBX LRALIGNENDIFEND;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****
#PS:請尊重原創,不喜勿噴
#PS:要轉載請注明出處,本人版權所有.
有問題請留言,看到后我會第一時間回復
總結
以上是生活随笔為你收集整理的STM32 启动代码分析的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。