日本高清不卡中文字幕-一起草草视频在线观看-亚洲精品一区二区三区色-国产亚洲精品免费视频

你好!歡迎來(lái)到深圳市穎特新科技有限公司!
語(yǔ)言
當(dāng)前位置:首頁(yè) >> HDSC/華大 >> 國(guó)產(chǎn)超低功耗華大單片啟動(dòng)文件詳解及SystemInit函數(shù)分析

國(guó)產(chǎn)超低功耗華大單片啟動(dòng)文件詳解及SystemInit函數(shù)分析

關(guān)鍵字:小華單片機(jī) 作者: 來(lái)源: 發(fā)布時(shí)間:2020-06-08  瀏覽:48

啟動(dòng)代碼文件名一般可命名為如startup_hc32xxxx.s。啟動(dòng)代碼作用一般是:

1) 堆和棧的初始化

包括堆棧的大小,MSP(main stack pointer)值等。MSP的初始值在復(fù)位階段取自存儲(chǔ)區(qū)的第一個(gè)字(即0地址處的值)。

棧Stack: 由編譯器自動(dòng)分配和釋放,存放函數(shù)的參數(shù)值、局部變量的值等,其操作方式類似于數(shù)據(jù)結(jié)構(gòu)中的棧。向低地址擴(kuò)展。

堆Heap: 一般由程序員分配和釋放,若程序員不釋放,程序結(jié)束時(shí)可能由操作系統(tǒng)回收。分配方式類似于數(shù)據(jù)結(jié)構(gòu)中的鏈表。向高地址擴(kuò)展。

2)向量表定義
定義了各MSP初值,以及各個(gè)中斷服務(wù)程序(ISR)的入口地址。

3)中斷服務(wù)程序
CPU根據(jù)中斷號(hào)從向量表中獲取入口地址后,跳轉(zhuǎn)至對(duì)應(yīng)的ISR

4)設(shè)置系統(tǒng)時(shí)鐘頻率
可在復(fù)位中斷服務(wù)程序Reset_handler中調(diào)用系統(tǒng)時(shí)鐘頻率初始化程序

5) 中斷寄存器的初始化

6)進(jìn)入C應(yīng)用程序
在復(fù)位中斷服務(wù)程序即Reset_handler中實(shí)現(xiàn)進(jìn)入C程序。如:

LDR R0 , =_main ;使用“=”表示LDR目前是偽指令。這里是把_main的地址給R0。

BX R0 ; BX是ARM指令集和THUMB指令集之間程序的跳轉(zhuǎn)。

以下以華大單片機(jī)HC32L136K8TA的啟動(dòng)文件為例,對(duì)1) — 6)進(jìn)行詳細(xì)分析。

;先在RAM中分配系統(tǒng)使用的棧,RAM的起始地址為0x2000_0000

;然后在RAM中分配變量使用的堆

;然后在CODE區(qū)(flash)分配中斷向量表,flash的起始地址為0x0000_0000,該中斷向量表就從這個(gè)起始地址開(kāi)始分配

;分配完成后,再定義和實(shí)現(xiàn)相應(yīng)的中斷函數(shù),

;所有的中斷函數(shù)全部帶有[weak]特性,即弱定義,如果編譯器發(fā)現(xiàn)在別處文件中定義了同名函數(shù),在鏈接時(shí)用別處的地址進(jìn)行鏈接。

;中斷函數(shù)僅僅實(shí)現(xiàn)了Reset_Handler,其他要么是死循環(huán),要么僅僅定義了函數(shù)名稱

;HC32被設(shè)置為從內(nèi)部FLASH啟動(dòng)時(shí)(這也是最常見(jiàn)的一種情況),當(dāng)HC32遇到復(fù)位信號(hào)后,

;從0x0000_0000處取出棧頂?shù)刂反娣庞贛SP寄存器,從0x0000_0004處取出復(fù)位中斷服務(wù)入口地址放入PC寄存器,

;繼而執(zhí)行復(fù)位中斷服務(wù)程序Reset_Handler,

;Reset_Handler僅僅執(zhí)行了兩個(gè)函數(shù)調(diào)用,一個(gè)是SystemInit,另一個(gè)__main,

;SystemInit定義在system_hc32xxxx.c中,主要初始化了HC的時(shí)鐘系統(tǒng):RCH,RCL,XTH,XTL,PLL,SystemClk,HCLK,PCLK等等.

;__main函數(shù)由編譯器生成,負(fù)責(zé)初始化棧、堆等,并在最后跳轉(zhuǎn)到用戶自定義的main()函數(shù),來(lái)到C的世界。

HC32L136K8TA芯片的中斷向量表如下圖所示:

; Stack Configuration; Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>Stack_Size EQU 0x00000200 ;定義堆棧大小AREA STACK, NOINIT, READWRITE, ALIGN=3 ;定義一個(gè)數(shù)據(jù)段 按8字節(jié)對(duì)齊 ;AREA 偽指令用于定義一個(gè)代碼段或數(shù)據(jù)段 ;NOINIT:指定此數(shù)據(jù)段僅僅保留了內(nèi)存單元, ;而沒(méi)有將各初始值寫(xiě)入內(nèi)存單元, ;或者將各個(gè)內(nèi)存單元值初始化為0Stack_Mem SPACE Stack_Size ;保留Stack_Size大小的堆?臻g分配連續(xù) ;Stack_Size字節(jié)的存儲(chǔ)單元并初始化為 0 __initial_sp ;標(biāo)號(hào),代表堆棧頂部地址,后面有用; Heap Configuration; Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>Heap_Size EQU 0x00000000 ;定義堆空間大小AREA HEAP, NOINIT, READWRITE, ALIGN=3 ;定義一個(gè)數(shù)據(jù)段,8字節(jié)對(duì)齊__heap_base ;標(biāo)號(hào),代表堆末底部地址,后面有用Heap_Mem SPACE Heap_Size ;保留Heap_Size的堆空間 __heap_limit ;標(biāo)號(hào),代表堆界限地址,后面有用 ;PRESERVE8 指令指定當(dāng)前文件保持堆棧八字節(jié)對(duì)齊。 ;它設(shè)置 PRES8 編譯屬性以通知鏈接器。 ;鏈接器檢查要求堆棧八字節(jié)對(duì)齊的任何代碼是否僅由 ;保持堆棧八字節(jié)對(duì)齊的代碼直接或間接地調(diào)用。PRESERVE8 ;指示編譯器8字節(jié)對(duì)齊THUMB ;指示編譯器以后的指令為T(mén)HUMB指令; Vector Table Mapped to Address 0 at Reset ;中斷向量表定義AREA RESET, DATA, READONLY;定義只讀數(shù)據(jù)段,其實(shí)放在CODE區(qū),位于0地址EXPORT __Vectors ;EXPORT:在程序中聲明一個(gè)全局的標(biāo)號(hào)__Vectors, ;該標(biāo)號(hào)可在其他的文件中引用EXPORT __Vectors_EndEXPORT __Vectors_Size__Vectors DCD __initial_sp ;Top of Stack;給__initial_sp分配4字節(jié)32位的地址0x0DCD Reset_Handler ;Reset ; 給標(biāo)號(hào)Reset Handler分配地址為0x00000004 DCD NMI_Handler ; NMI; 給標(biāo)號(hào)NMI Handler分配地址0x00000008DCD HardFault_Handler ; Hard FaultDCD 0 ; Reserved ; 這種形式就是保留地址,不給任何標(biāo)號(hào)分配DCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD 0 ; ReservedDCD SVC_Handler ; SVCallDCD 0 ; ReservedDCD 0 ; ReservedDCD PendSV_Handler ; PendSVDCD SysTick_Handler ; SysTickDCD PORTA_IRQHandlerDCD PORTB_IRQHandlerDCD PORTC_IRQHandlerDCD PORTD_IRQHandlerDCD DMAC_IRQHandlerDCD TIM3_IRQHandlerDCD UART0_IRQHandlerDCD UART1_IRQHandlerDCD LPUART0_IRQHandlerDCD LPUART1_IRQHandlerDCD SPI0_IRQHandlerDCD SPI1_IRQHandlerDCD I2C0_IRQHandlerDCD I2C1_IRQHandlerDCD TIM0_IRQHandlerDCD TIM1_IRQHandlerDCD TIM2_IRQHandlerDCD LPTIM_IRQHandlerDCD TIM4_IRQHandlerDCD TIM5_IRQHandlerDCD TIM6_IRQHandlerDCD PCA_IRQHandlerDCD WDT_IRQHandlerDCD RTC_IRQHandlerDCD ADC_IRQHandlerDCD PCNT_IRQHandlerDCD VC0_IRQHandlerDCD VC1_IRQHandlerDCD LVD_IRQHandlerDCD LCD_IRQHandlerDCD EF_RAM_IRQHandlerDCD CLKTRIM_IRQHandler __Vectors_End__Vectors_Size EQU __Vectors_End - __VectorsAREA |.text|, CODE, READONLY ;代碼段定義; Reset Handler ;利用PROC、ENDP這一對(duì)偽指令把程序段分為若干 ;個(gè)過(guò)程,使程序的結(jié)構(gòu)加清晰Reset_Handler PROC ;過(guò)程的開(kāi)始EXPORT Reset_Handler [WEAK] ;[WEAK] 弱定義,意思是如果在別處也定義該標(biāo)號(hào) ;(函數(shù)),在鏈接時(shí)用別處的地址。 如果沒(méi)有其它地方 ;定義,編譯器也不報(bào)錯(cuò),以此處地址進(jìn)行鏈接。 ;EXPORT提示編譯器該標(biāo)號(hào)可以為外部文件引用。IMPORT SystemInit ;代碼中的系統(tǒng)初始化程序IMPORT __main ;通知編譯器要使用的標(biāo)號(hào)在其他文件;reset NVIC if in rom debug LDR R0, =0x20000000LDR R2, =0x0MOVS R1, #0 ; for warning,ADD R1, PC,#0 ; for A1609W,CMP R1, R0BLS RAMCODE; ram code base address.ADD R2, R0,R2RAMCODE; reset Vector table address.LDR R0, =0xE000ED08STR R2, [R0]LDR R0, =SystemInit BLX R0 ;BX是ARM指令集和THUMB指令集之間程序的跳轉(zhuǎn) LDR R0, =__main ;使用“=”表示LDR目前是偽指令不是標(biāo)準(zhǔn)指令。 ;這里是把__main的地址給RO。BX R0 ;BX是ARM指令集和THUMB指令集之間程序的跳轉(zhuǎn)ENDP ;過(guò)程的結(jié)束; Dummy Exception Handlers (infinite loops which can be modified)NMI_Handler PROCEXPORT NMI_Handler [WEAK]B .ENDPHardFault_Handler\PROCEXPORT HardFault_Handler [WEAK]B . ;原地跳轉(zhuǎn)(即無(wú)限循環(huán)),等同于while(1);ENDPSVC_Handler PROCEXPORT SVC_Handler [WEAK]B .ENDPPendSV_Handler PROCEXPORT PendSV_Handler [WEAK]B .ENDPSysTick_Handler PROCEXPORT SysTick_Handler [WEAK]B .ENDPDefault_Handler PROCEXPORT PORTA_IRQHandler [WEAK]EXPORT PORTB_IRQHandler [WEAK]EXPORT PORTC_IRQHandler [WEAK]EXPORT PORTD_IRQHandler [WEAK]EXPORT DMAC_IRQHandler [WEAK]EXPORT TIM3_IRQHandler [WEAK]EXPORT UART0_IRQHandler [WEAK]EXPORT UART1_IRQHandler [WEAK]EXPORT LPUART0_IRQHandler [WEAK]EXPORT LPUART1_IRQHandler [WEAK]EXPORT SPI0_IRQHandler [WEAK]EXPORT SPI1_IRQHandler [WEAK]EXPORT I2C0_IRQHandler [WEAK]EXPORT I2C1_IRQHandler [WEAK]EXPORT TIM0_IRQHandler [WEAK]EXPORT TIM1_IRQHandler [WEAK]EXPORT TIM2_IRQHandler [WEAK]EXPORT LPTIM_IRQHandler [WEAK]EXPORT TIM4_IRQHandler [WEAK]EXPORT TIM5_IRQHandler [WEAK]EXPORT TIM6_IRQHandler [WEAK]EXPORT PCA_IRQHandler [WEAK]EXPORT WDT_IRQHandler [WEAK]EXPORT RTC_IRQHandler [WEAK]EXPORT ADC_IRQHandler [WEAK]EXPORT PCNT_IRQHandler [WEAK]EXPORT VC0_IRQHandler [WEAK]EXPORT VC1_IRQHandler [WEAK]EXPORT LVD_IRQHandler [WEAK]EXPORT LCD_IRQHandler [WEAK]EXPORT EF_RAM_IRQHandler [WEAK]EXPORT CLKTRIM_IRQHandler [WEAK]PORTA_IRQHandlerPORTB_IRQHandlerPORTC_IRQHandlerPORTD_IRQHandlerDMAC_IRQHandlerTIM3_IRQHandlerUART0_IRQHandlerUART1_IRQHandlerLPUART0_IRQHandlerLPUART1_IRQHandlerSPI0_IRQHandlerSPI1_IRQHandlerI2C0_IRQHandlerI2C1_IRQHandlerTIM0_IRQHandlerTIM1_IRQHandlerTIM2_IRQHandlerLPTIM_IRQHandlerTIM4_IRQHandlerTIM5_IRQHandlerTIM6_IRQHandlerPCA_IRQHandlerWDT_IRQHandlerRTC_IRQHandlerADC_IRQHandlerPCNT_IRQHandlerVC0_IRQHandlerVC1_IRQHandlerLVD_IRQHandlerLCD_IRQHandlerEF_RAM_IRQHandlerCLKTRIM_IRQHandler B .ENDPALIGN ;填充字節(jié)使地址對(duì)齊; User Initial Stack & Heap ;堆和棧的初始化IF :DEF:__MICROLIB ;“DEF”的用法:DEF:X就是說(shuō)X定義了則為真,否則為 ;如果定義了MICORLIB,EXPORT __initial_sp ;則將棧頂?shù)刂,EXPORT __heap_base ;堆起始地址賦予全局屬性,EXPORT __heap_limit ;堆末端界限地址賦予全局屬性,使外部程序可調(diào)用ELSE ;如果沒(méi)定義__MICROLIB,則使用默認(rèn)的C運(yùn)行時(shí)庫(kù)IMPORT __use_two_region_memory ;通知編譯器要使用的標(biāo)號(hào)在其他文件 ;__use_two_region_memory EXPORT __user_initial_stackheap ;聲明全局標(biāo)號(hào)__user_initial_stackheap, ;這樣外程序也可調(diào)用此標(biāo)號(hào),則進(jìn)行堆棧和堆的賦 ;值,在__main函數(shù)執(zhí)行過(guò)程中調(diào)用, 如果使用默認(rèn)的 ;C庫(kù),程序啟動(dòng)過(guò)程中就不會(huì)執(zhí)行該標(biāo)號(hào)下的代碼__user_initial_stackheap ;標(biāo)號(hào),表示用戶堆棧初始化程序入口 ;進(jìn)行堆棧和堆的賦值,在_main函數(shù)執(zhí)行過(guò)程中調(diào)用。LDR R0, = Heap_Mem ;保存堆始地址LDR R1, =(Stack_Mem + Stack_Size) ;保存棧的大小LDR R2, = (Heap_Mem + Heap_Size) ;保存堆的大小LDR R3, = Stack_Mem ;保存棧頂指針BX LRALIGN ;填充字節(jié)使地址對(duì)齊ENDIFEND

編輯:admin  最后修改時(shí)間:2020-09-07

聯(lián)系方式

0755-82591179

傳真:0755-82591176

郵箱:vicky@yingtexin.net

地址:深圳市龍華區(qū)民治街道民治大道973萬(wàn)眾潤(rùn)豐創(chuàng)業(yè)園A棟2樓A08

Copyright © 2014-2023 穎特新科技有限公司 All Rights Reserved.  粵ICP備14043402號(hào)-4

屏山县| 渭源县| 平定县| 南漳县| 会同县| 东方市| 资溪县| 图片| 东兴市| 桂阳县| 马公市| 兴安县| 兴和县| 淮北市| 息烽县| 无极县| 西平县| 蓝山县| 雷山县| 志丹县| 皮山县| 子洲县| 容城县| 灵璧县| 宜春市| 邵东县| 霍山县| 涟水县| 延庆县| 霍城县| 库车县| 南江县| 寻乌县| SHOW| 安多县| 开平市| 汝南县| 黄骅市| 丘北县| 滨海县| 绿春县|