学习STM32,看了一堆杂乱无章的文档,预备写程序了,先剖析了下STM32的发动代码,看着这堆鬼鬼的汇编代码,挺吓人的,看看协助,查查网路,仍是不那么难明。
- ;//
StackConfiguration - ;//
StackSize(inBytes)<0x0-0xFFFFFFFF:8> - ;//
- Stack_SizeEQU0x00000200;//界说仓库巨细
- AREASTACK,NOINIT,READWRITE,ALIGN=3;//界说一个数据段按8字节对齐
- Stack_MemSPACEStack_Size;//保存Stack_Size巨细的仓库空间
- __initial_sp;//标号,代表仓库顶部地址,后边有用
- ;//
HeapConfiguration - ;//
HeapSize(inBytes)<0x0-0xFFFFFFFF:8> - ;//
- Heap_SizeEQU0x00000020;//界说堆空间巨细
- AREAHEAP,NOINIT,READWRITE,ALIGN=3;//界说一个数据段,8字节对齐
- __heap_base
- Heap_MemSPACEHeap_Size;//保存Heap_Size的堆空间
- __heap_limit;//标号,代表堆结尾地址,后边有用
- PRESERVE8;//指示编译器8字节对齐
- THUMB;//指示编译器为THUMB指令
- ;VectorTableMappedtoAddress0atReset
- AREARESET,DATA,READONLY;//界说只读数据段,其实放在CODE区,坐落0地址
- EXTERNNMIException
- EXTERNHardFaultException
- EXTERNMemManageException
- EXTERNBusFaultException
- EXTERNUsageFaultException
- EXTERNSVCHandler
- EXTERNDebugMonitor
- EXTERNPendSVC
- EXTERNSysTickHandler;//声明这些符号在外部界说,同C
- ;//在××it.c中完结这些函数,中止就能主动调用了
- EXPORT__Vectors
- __VectorsDCD__initial_sp;TopofStack//Cotex-M要求此处为仓库顶部地址
- DCDReset_Handler;ResetHandler
- DCDNMIException;NMIHandler
- DCDHardFaultException;HardFaultHandler
- DCDMemManageException;MPUFaultHandler
- DCDBusFaultException;BusFaultHandler
- DCDUsageFaultException;UsageFaultHandler
- DCD0;Reserved
- DCD0;Reserved
- DCD0;Reserved
- DCD0;Reserved
- DCDSVCHandler;SVCallHandler
- DCDDebugMonitor;DebugMonitorHandler
- DCD0;Reserved
- DCDPendSVC;PendSVHandler
- DCDSysTickHandler;SysTickHandler//一大堆的反常处理函数地址
- ;ExternalInterrupts
- EXTERNWWDG_IRQHandler
- EXTERNPVD_IRQHandler
- EXTERNTAMPER_IRQHandler
- EXTERNRTC_IRQHandler
- EXTERNFLASH_IRQHandler
- EXTERNRCC_IRQHandler
- EXTERNEXTI0_IRQHandler
- EXTERNEXTI1_IRQHandler
- EXTERNEXTI2_IRQHandler
- EXTERNEXTI3_IRQHandler
- EXTERNEXTI4_IRQHandler
- EXTERNDMAChannel1_IRQHandler
- EXTERNDMAChannel2_IRQHandler
- EXTERNDMAChannel3_IRQHandler
- EXTERNDMAChannel4_IRQHandler
- EXTERNDMAChannel5_IRQHandler
- EXTERNDMAChannel6_IRQHandler
- EXTERNDMAChannel7_IRQHandler
- EXTERNADC_IRQHandler
- EXTERNUSB_HP_CAN_TX_IRQHandler
- EXTERNUSB_LP_CAN_RX0_IRQHandler
- EXTERNCAN_RX1_IRQHandler
- EXTERNCAN_SCE_IRQHandler
- EXTERNEXTI9_5_IRQHandler
- EXTERNTIM1_BRK_IRQHandler
- EXTERNTIM1_UP_IRQHandler
- EXTERNTIM1_TRG_COM_IRQHandler
- EXTERNTIM1_CC_IRQHandler
- EXTERNTIM2_IRQHandler
- EXTERNTIM3_IRQHandler
- EXTERNTIM4_IRQHandler
- EXTERNI2C1_EV_IRQHandler
- EXTERNI2C1_ER_IRQHandler
- EXTERNI2C2_EV_IRQHandler
- EXTERNI2C2_ER_IRQHandler
- EXTERNSPI1_IRQHandler
- EXTERNSPI2_IRQHandler
- EXTERNUSART1_IRQHandler
- EXTERNUSART2_IRQHandler
- EXTERNUSART3_IRQHandler
- EXTERNEXTI15_10_IRQHandler
- EXTERNRTCAlarm_IRQHandler
- EXTERNUSBWakeUp_IRQHandler;//同上,
- DCDWWDG_IRQHandler;WindowWatchdog
- DCDPVD_IRQHandler;PVDthroughEXTILinedetect
- DCDTAMPER_IRQHandler;Tamper
- DCDRTC_IRQHandler;RTC
- DCDFLASH_IRQHandler;Flash
- DCDRCC_IRQHandler;RCC
- DCDEXTI0_IRQHandler;EXTILine0
- DCDEXTI1_IRQHandler;EXTILine1
- DCDEXTI2_IRQHandler;EXTILine2
- DCDEXTI3_IRQHandler;EXTILine3
- DCDEXTI4_IRQHandler;EXTILine4
- DCDDMAChannel1_IRQHandler;DMAChannel1
- DCDDMAChannel2_IRQHandler;DMAChannel2
- DCDDMAChannel3_IRQHandler;DMAChannel3
- DCDDMAChannel4_IRQHandler;DMAChannel4
- DCDDMAChannel5_IRQHandler;DMAChannel5
- DCDDMAChannel6_IRQHandler;DMAChannel6
- DCDDMAChannel7_IRQHandler;DMAChannel7
- DCDADC_IRQHandler;ADC
- DCDUSB_HP_CAN_TX_IRQHandler;USBHighPriorityorCANTX
- DCDUSB_LP_CAN_RX0_IRQHandler;USBLowPriorityorCANRX0
- DCDCAN_RX1_IRQHandler;CANRX1
- DCDCAN_SCE_IRQHandler;CANSCE
- DCDEXTI9_5_IRQHandler;EXTILine9..5
- DCDTIM1_BRK_IRQHandler;TIM1Break
- DCDTIM1_UP_IRQHandler;TIM1Update
- DCDTIM1_TRG_COM_IRQHandler;TIM1TriggerandCommutation
- DCDTIM1_CC_IRQHandler;TIM1CaptureCompare
- DCDTIM2_IRQHandler;TIM2
- DCDTIM3_IRQHandler;TIM3
- DCDTIM4_IRQHandler;TIM4
- DCDI2C1_EV_IRQHandler;I2C1Event
- DCDI2C1_ER_IRQHandler;I2C1Error
- DCDI2C2_EV_IRQHandler;I2C2Event
- DCDI2C2_ER_IRQHandler;I2C2Error
- DCDSPI1_IRQHandler;SPI1
- DCDSPI2_IRQHandler;SPI2
- DCDUSART1_IRQHandler;USART1
- DCDUSART2_IRQHandler;USART2
- DCDUSART3_IRQHandler;USART3
- DCDEXTI15_10_IRQHandler;EXTILine15..10
- DCDRTCAlarm_IRQHandler;RTCAlarmthroughEXTILine
- DCDUSBWakeUp_IRQHandler;USBWakeupfromsuspend;//同上
- AREA|.text|,CODE,READONLY;//界说代码段
- ;ResetHandler
- Reset_HandlerPROC;//Rset_Handler的完结
- EXPORTReset_Handler[WEAK];//在外部没有界说该符号时导出该符号,见HELP中[WEAK]
- IMPORT__main;//导入符号,__main为运行时库供给的函数;完结仓库,堆的初始话
- LDRR0,=__main;//等作业,会调用下面界说的__user_initial_stackheap;
- BXR0;//跳到__main,进入C的国际
- ENDP
- ALIGN
- ;UserInitialStack&Heap
- IF:DEF:__MICROLIB;//假如运用microlib,microlib描绘见armlib.chm
- EXPORT__initial_sp
- EXPORT__heap_base
- EXPORT__heap_limit;//只导出几个界说
- ELSE;//假如运用默许C运行时库
- IMPORT__use_two_region_memory
- EXPORT__user_initial_stackheap
- __user_initial_stackheap;//则进行仓库和堆的赋值,在__main函数履行过程中调用。
- LDRR0,=Heap_Mem
- LDRR1,=(Stack_Mem+Stack_Size)
- LDRR2,=(Heap_Mem+Heap_Size)
- LDRR3,=Stack_Mem
- BXLR
- ALIGN
- ENDIF
- END;//OK,完了