單芯片解決方案,開啟全新體驗(yàn)——W55MH32 高性能以太網(wǎng)單片機(jī)
W55MH32是WIZnet重磅推出的高性能以太網(wǎng)單片機(jī),它為用戶帶來(lái)前所未有的集成化體驗(yàn)。這顆芯片將強(qiáng)大的組件集于一身,具體來(lái)說,一顆W55MH32內(nèi)置高性能Arm? Cortex-M3核心,其主頻最高可達(dá)216MHz;配備1024KB FLASH與96KB SRAM,滿足存儲(chǔ)與數(shù)據(jù)處理需求;集成TOE引擎,包含WIZnet全硬件TCP/IP協(xié)議棧、內(nèi)置MAC以及PHY,擁有獨(dú)立的32KB以太網(wǎng)收發(fā)緩存,可供8個(gè)獨(dú)立硬件socket使用。如此配置,真正實(shí)現(xiàn)了All-in-One解決方案,為開發(fā)者提供極大便利。
在封裝規(guī)格上,W55MH32 提供了兩種選擇:QFN100和QFN68。
W55MH32L采用QFN100封裝版本,尺寸為12x12mm,其資源豐富,專為各種復(fù)雜工控場(chǎng)景設(shè)計(jì)。它擁有66個(gè)GPIO、3個(gè)ADC、12通道DMA、17個(gè)定時(shí)器、2個(gè)I2C、5個(gè)串口、2個(gè)SPI接口(其中1個(gè)帶I2S接口復(fù)用)、1個(gè)CAN、1個(gè)USB2.0以及1個(gè)SDIO接口。如此豐富的外設(shè)資源,能夠輕松應(yīng)對(duì)工業(yè)控制中多樣化的連接需求,無(wú)論是與各類傳感器、執(zhí)行器的通信,還是對(duì)復(fù)雜工業(yè)協(xié)議的支持,都能游刃有余,成為復(fù)雜工控領(lǐng)域的理想選擇。 同系列還有QFN68封裝的W55MH32Q版本,該版本體積更小,僅為8x8mm,成本低,適合集成度高的網(wǎng)關(guān)模組等場(chǎng)景,軟件使用方法一致。更多信息和資料請(qǐng)進(jìn)入http://www.w5500.com/網(wǎng)站或者私信獲取。
此外,本W(wǎng)55MH32支持硬件加密算法單元,WIZnet還推出TOE+SSL應(yīng)用,涵蓋TCP SSL、HTTP SSL以及 MQTT SSL等,為網(wǎng)絡(luò)通信安全再添保障。
為助力開發(fā)者快速上手與深入開發(fā),基于W55MH32L這顆芯片,WIZnet精心打造了配套開發(fā)板。開發(fā)板集成WIZ-Link芯片,借助一根USB C口數(shù)據(jù)線,就能輕松實(shí)現(xiàn)調(diào)試、下載以及串口打印日志等功能。開發(fā)板將所有外設(shè)全部引出,拓展功能也大幅提升,便于開發(fā)者全面評(píng)估芯片性能。
若您想獲取芯片和開發(fā)板的更多詳細(xì)信息,包括產(chǎn)品特性、技術(shù)參數(shù)以及價(jià)格等,歡迎訪問官方網(wǎng)頁(yè):http://www.w5500.com/,我們期待與您共同探索W55MH32的無(wú)限可能。
第八章 啟動(dòng)文件詳解
本章參考資料《W55MH32參考手冊(cè)》第八章-中斷和事件,MDK中的幫助手冊(cè)—ARM Development Tools:用來(lái)查詢ARM的匯編指令和編譯器相關(guān)的指令。
1 啟動(dòng)文件簡(jiǎn)介
啟動(dòng)文件由匯編編寫,是系統(tǒng)上電復(fù)位后第一個(gè)執(zhí)行的程序。主要做了以下工作:
初始化堆棧指針SP=_initial_sp
初始化PC指針=Reset_Handler
初始化中斷向量表
配置系統(tǒng)時(shí)鐘
調(diào)用C庫(kù)函數(shù)_main初始化用戶堆棧,從而最終調(diào)用main函數(shù)去到C的世界
2 查找ARM匯編指令
在講解啟動(dòng)代碼的時(shí)候,會(huì)涉及到ARM的匯編指令和Cortex內(nèi)核的指令,有關(guān)Cortex內(nèi)核的指令我們可以參考《CM3權(quán)威指南CnR2》第四章:指令集。 剩下的ARM的匯編指令我們可以在MDK->Help->Uvision Help中搜索到,以EQU為例,檢索如下:
檢索出來(lái)的結(jié)果會(huì)有很多,我們只需要看Assembler User Guide 這部分即可。下面列出了啟動(dòng)文件中使用到的ARM匯編指令, 該列表的指令全部從ARM Development Tools這個(gè)幫助文檔里面檢索而來(lái)。其中編譯器相關(guān)的指令WEAK和ALIGN為了方便也放在同一個(gè)表格了。
指令名稱 | 作用 |
EQU | 給數(shù)字常量取一個(gè)符號(hào)名,相當(dāng)于 C 語(yǔ)言中的define |
AREA | 匯編一個(gè)新的代碼段或者數(shù)據(jù)段 |
SPACE | 分配內(nèi)存空間 |
PRESERVE8 | 當(dāng)前文件堆棧需按照 8 字節(jié)對(duì)齊 |
EXPORT | 聲明一個(gè)標(biāo)號(hào)具有全局屬性,可被外部文件使用 |
DCD | 以字為單位分配內(nèi)存,要求 4 字節(jié)對(duì)齊,并初始化這些內(nèi)存 |
PROC | 定義子程序,與ENDP 成對(duì)使用,表示子程序結(jié)束 |
WEAK | 弱定義,若外部文件聲明標(biāo)號(hào)則優(yōu)先使用,無(wú)定義也不出錯(cuò)(非 ARM 指令,屬編譯器功能) |
IMPORT | 聲明標(biāo)號(hào)來(lái)自外部文件,類似 C 語(yǔ)言的EXTERN 關(guān)鍵字 |
B | 跳轉(zhuǎn)到一個(gè)標(biāo)號(hào) |
ALIGN | 編譯器對(duì)指令 / 數(shù)據(jù)地址對(duì)齊,常跟立即數(shù),缺省 4 字節(jié)對(duì)齊(非 ARM 指令,屬編譯器功能) |
END | 表示文件結(jié)束 |
IF,ELSE,ENDIF | 匯編條件分支語(yǔ)句,類似 C 語(yǔ)言的if else |
3 啟動(dòng)文件代碼講解
3.1 Stack—棧
Stack_Size EQU 0x00000400 AREA STACK, NOINIT, READWRITE, ALIGN=3 Stack_Mem SPACE Stack_Size __initial_sp
開辟棧的大小為0X00000400(1KB),名字為STACK,NOINIT即不初始化,可讀可寫,8(2^3)字節(jié)對(duì)齊。棧的作用是用于局部變量,函數(shù)調(diào)用,函數(shù)形參等的開銷,棧的大小不能超過內(nèi)部SRAM的大小。
如果編寫的程序比較大, 定義的局部變量很多,那么就需要修改棧的大小。如果某一天,你寫的程序出現(xiàn)了莫名奇怪的錯(cuò)誤,并進(jìn)入了硬fault的時(shí)候,這時(shí)你就要考慮下是不是棧不夠大,溢出了。
EQU:宏定義的偽指令,相當(dāng)于等于,類似于C中的define。
AREA:告訴匯編器匯編一個(gè)新的代碼段或者數(shù)據(jù)段。STACK表示段名,這個(gè)可以任意命名;NOINIT表示不初始化; READWRITE表示可讀可寫,ALIGN=3,表示按照2^3對(duì)齊,即8字節(jié)對(duì)齊。
SPACE:用于分配一定大小的內(nèi)存空間,單位為字節(jié)。這里指定大小等于Stack_Size。
標(biāo)號(hào)__initial_sp緊挨著SPACE語(yǔ)句放置,表示棧的結(jié)束地址,即棧頂?shù)刂罚瑮J怯筛呦虻蜕L(zhǎng)的。
3.2 Heap堆
Heap_Size EQU 0x00000200 AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit
開辟堆的大小為0X00000200(512字節(jié)),名字為HEAP,NOINIT即不初始化,可讀可寫,8(2^3)字節(jié)對(duì)齊。__heap_base表示堆的起始地址, __heap_limit表示堆的結(jié)束地址。堆是由低向高生長(zhǎng)的,跟棧的生長(zhǎng)方向相反。
堆主要用來(lái)動(dòng)態(tài)內(nèi)存的分配,像malloc()函數(shù)申請(qǐng)的內(nèi)存就在堆上面。這個(gè)在W5MH32里面用的比較少。
PRESERVE8 THUMB
PRESERVE8:指定當(dāng)前文件的堆棧按照8字節(jié)對(duì)齊。
THUMB:表示后面指令兼容THUMB指令。THUBM是ARM以前的指令集,16bit,現(xiàn)在Cortex-M系列的都使用THUMB-2指令集, THUMB-2是32位的,兼容16位和32位的指令,是THUMB的超集。
3.3 向量表
AREA RESET, DATA, READONLY EXPORT __Vectors EXPORT __Vectors_End EXPORT __Vectors_Size
定義一個(gè)數(shù)據(jù)段,名字為RESET,可讀。 并聲明 __Vectors、__Vectors_End和__Vectors_Size這三個(gè)標(biāo)號(hào)具有全局屬性,可供外部的文件調(diào)用。
EXPORT:聲明一個(gè)標(biāo)號(hào)可被外部的文件使用,使標(biāo)號(hào)具有全局屬性。如果是IAR編譯器,則使用的是GLOBAL這個(gè)指令。
當(dāng)內(nèi)核響應(yīng)了一個(gè)發(fā)生的異常后,對(duì)應(yīng)的異常服務(wù)例程(ESR)就會(huì)執(zhí)行。為了決定 ESR 的入口地址, 內(nèi)核使用了“向量表查表機(jī)制”。 這里使用一張向量表。向量表其實(shí)是一個(gè) WORD( 32 位整數(shù))數(shù)組,每個(gè)下標(biāo)對(duì)應(yīng)一種異常,該下標(biāo)元素的值則是該 ESR的入口地址。 向量表在地址空間中的位置是可以設(shè)置的,通過 NVIC 中的一個(gè)重定位寄存器來(lái)指出向量表的地址。在復(fù)位后,該寄存器的值為 0。因此, 在地址 0 (即FLASH 地址0)處必須包含一張向量表,用于初始時(shí)的異常分配。要注意的是這里有個(gè)另類: 0 號(hào)類型并不是什么入口地址, 而是給出了復(fù)位后 MSP 的初值。
編號(hào) | 優(yōu)先級(jí) | 優(yōu)先級(jí)類型 | 名稱 | 說明 | 地址 |
- | - | - | - | 保留(實(shí)際存的是 MSP 地址) | 0X0000 0000 |
-3 | - | 固定 | Reset | 復(fù)位 | 0X0000 0004 |
-2 | - | 固定 | NMI | 不可屏蔽中斷。RCC 時(shí)鐘安全系統(tǒng) (CSS) 連接到 NMI 向量 | 0X0000 0008 |
-1 | - | 固定 | HardFault | 所有類型的錯(cuò)誤 | 0X0000 000C |
0 | - | 可編程 | MemManage | 存儲(chǔ)器管理 | 0X0000 0010 |
1 | - | 可編程 | BusFault | 預(yù)取指失敗,存儲(chǔ)器訪問失敗 | 0X0000 0014 |
2 | - | 可編程 | UsageFault | 未定義的指令或非法狀態(tài) | 0X0000 0018 |
- | - | - | - | 保留 | 0X0000 001C-0X0000 002B |
3 | - | 可編程 | SVCall | 通過 SWI 指令調(diào)用的系統(tǒng)服務(wù) | 0X0000 002C |
4 | - | 可編程 | Debug Monitor | 調(diào)試監(jiān)控器 | 0X0000 0030 |
- | - | - | - | 保留 | 0X0000 0034 |
5 | - | 可編程 | PendSV | 可掛起的系統(tǒng)服務(wù) | 0X0000 0038 |
6 | - | 可編程 | SysTick | 系統(tǒng)嘀嗒定時(shí)器 | 0X0000 003C |
0 | 7 | 可編程 | WWDG | 窗口看門狗中斷 | 0X0000 0040 |
1 | 8 | 可編程 | PVD | 連到 EXTI 的電源電壓檢測(cè) (PVD) 中斷 | 0X0000 0044 |
2 | 9 | 可編程 | TAMPER | 侵入檢測(cè)中斷 | 0X0000 0048 |
- | - | - | - | 中間部分省略,詳情請(qǐng)參考《STM32 中文參考手冊(cè)》第九章 - 中斷和事件 - 向量表部分 | - |
57 | 64 | 可編程 | DMA2 通道 2 | DMA2 通道 2 中斷 | 0X0000 0124 |
58 | 65 | 可編程 | DMA2 通道 3 | DMA2 通道 3z 中斷 | 0X0000 0128 |
59 | 66 | 可編程 | DMA2 通道 4 5 | DMA2 通道 4 和通道 5 中斷 | 0X0000 012C |
代碼 15?1 向量表
__Vectors DCD __initial_sp ;棧頂?shù)刂? DCD Reset_Handler ;復(fù)位程序地址 DCD NMI_Handler DCD HardFault_Handler DCD MemManage_Handler DCD BusFault_Handler DCD UsageFault_Handler DCD 0 ; 0 表示保留 DCD 0 DCD 0 DCD 0 DCD SVC_Handler DCD DebugMon_Handler DCD 0 DCD PendSV_Handler DCD SysTick_Handler ;外部中斷開始 DCD WWDG_IRQHandler DCD PVD_IRQHandler DCD TAMPER_IRQHandler ;限于篇幅,中間代碼省略 DCD DMA2_Channel2_IRQHandler DCD DMA2_Channel3_IRQHandler DCD DMA2_Channel4_5_IRQHandler __Vectors_End __Vectors_Size EQU __Vectors_End - __Vectors
__Vectors為向量表起始地址,__Vectors_End 為向量表結(jié)束地址,兩個(gè)相減即可算出向量表大小。
向量表從FLASH的0地址開始放置,以4個(gè)字節(jié)為一個(gè)單位,地址0存放的是棧頂?shù)刂罚?X04存放的是復(fù)位程序的地址,以此類推。 從代碼上看,向量表中存放的都是中斷服務(wù)函數(shù)的函數(shù)名,可我們知道C語(yǔ)言中的函數(shù)名就是一個(gè)地址。
DCD:分配一個(gè)或者多個(gè)以字為單位的內(nèi)存,以四字節(jié)對(duì)齊,并要求初始化這些內(nèi)存。在向量表中,DCD分配了一堆內(nèi)存,并且以ESR的入口地址初始化它們。
3.4 復(fù)位程序
AREA |.text|, CODE, READONLY
定義一個(gè)名稱為.text的代碼段,可讀。
Reset_Handler PROC EXPORT Reset_Handler [WEAK] IMPORT SystemInit IMPORT __main LDR R0, =SystemInit BLX R0 LDR R0, =__main BX R0 ENDP
復(fù)位子程序是系統(tǒng)上電后第一個(gè)執(zhí)行的程序,調(diào)用SystemInit函數(shù)初始化系統(tǒng)時(shí)鐘,然后調(diào)用C庫(kù)函數(shù)_mian,最終調(diào)用main函數(shù)去到C的世界。
WEAK:表示弱定義,如果外部文件優(yōu)先定義了該標(biāo)號(hào)則首先引用該標(biāo)號(hào),如果外部文件沒有聲明也不會(huì)出錯(cuò)。 這里表示復(fù)位子程序可以由用戶在其他文件重新實(shí)現(xiàn),這里并不是唯一的。
IMPORT:表示該標(biāo)號(hào)來(lái)自外部文件,跟C語(yǔ)言中的EXTERN關(guān)鍵字類似。這里表示SystemInit和__main這兩個(gè)函數(shù)均來(lái)自外部的文件。
SystemInit()是一個(gè)標(biāo)準(zhǔn)的庫(kù)函數(shù),在system_W5MH32f10x.c這個(gè)庫(kù)文件總定義。主要作用是配置系統(tǒng)時(shí)鐘,這里調(diào)用這個(gè)函數(shù)之后,單片機(jī)的系統(tǒng)時(shí)鐘配被配置為72M。__main是一個(gè)標(biāo)準(zhǔn)的C庫(kù)函數(shù),主要作用是初始化用戶堆棧,并在函數(shù)的最后調(diào)用main函數(shù)去到C的世界。這就是為什么我們寫的程序都有一個(gè)main函數(shù)的原因。
LDR、BLX、BX是CM4內(nèi)核的指令,可在《CM3權(quán)威指南CnR2》第四章-指令集里面查詢到,具體作用見下表:
指令名稱 | 作用 |
LDR | 從存儲(chǔ)器中加載字到一個(gè)寄存器中 |
BL | 跳轉(zhuǎn)到由寄存器 / 標(biāo)號(hào)給出的地址,并把跳轉(zhuǎn)前的下條指令地址保存到 LR |
BLX | 跳轉(zhuǎn)到由寄存器給出的地址,根據(jù)寄存器的 LSE 確定處理器狀態(tài),同時(shí)將跳轉(zhuǎn)前的下條指令地址保存到 LR |
BX | 跳轉(zhuǎn)到由寄存器 / 標(biāo)號(hào)給出的地址,不用返回 |
3.5 中斷服務(wù)程序
在啟動(dòng)文件里面已經(jīng)幫我們寫好所有中斷的中斷服務(wù)函數(shù),跟我們平時(shí)寫的中斷服務(wù)函數(shù)不一樣的就是這些函數(shù)都是空的, 真正的中斷復(fù)服務(wù)程序需要我們?cè)谕獠康腃文件里面重新實(shí)現(xiàn),這里只是提前占了一個(gè)位置而已。
如果我們?cè)谑褂媚硞€(gè)外設(shè)的時(shí)候,開啟了某個(gè)中斷,但是又忘記編寫配套的中斷服務(wù)程序或者函數(shù)名寫錯(cuò),那當(dāng)中斷來(lái)臨的時(shí), 程序就會(huì)跳轉(zhuǎn)到啟動(dòng)文件預(yù)先寫好的空的中斷服務(wù)程序中,并且在這個(gè)空函數(shù)中無(wú)限循環(huán),即程序就死在這里。
NMI_Handler PROC ;系統(tǒng)異常 EXPORT NMI_Handler [WEAK] B . ENDP ;限于篇幅,中間代碼省略 SysTick_Handler PROC EXPORT SysTick_Handler [WEAK] B . ENDP Default_Handler PROC ;外部中斷 EXPORT WWDG_IRQHandler [WEAK] EXPORT PVD_IRQHandler [WEAK] EXPORT TAMP_STAMP_IRQHandler [WEAK] ;限于篇幅,中間代碼省略 LTDC_IRQHandler LTDC_ER_IRQHandler DMA2D_IRQHandler B . ENDP
B:跳轉(zhuǎn)到一個(gè)標(biāo)號(hào)。這里跳轉(zhuǎn)到一個(gè)‘.’,即表示無(wú)限循環(huán)。
3.6 用戶堆棧初始化
ALIGN:對(duì)指令或者數(shù)據(jù)存放的地址進(jìn)行對(duì)齊,后面會(huì)跟一個(gè)立即數(shù)。缺省表示4字節(jié)對(duì)齊。
;用戶棧和堆初始化,由C庫(kù)函數(shù)_main來(lái)完成 IF :DEF:__MICROLIB ;這個(gè)宏在KEIL里面開啟 EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ELSE IMPORT __use_two_region_memory ; 這個(gè)函數(shù)由用戶自己實(shí)現(xiàn) EXPORT __user_initial_stackheap __user_initial_stackheap LDR R0, = Heap_Mem LDR R1, =(Stack_Mem + Stack_Size) LDR R2, = (Heap_Mem + Heap_Size) LDR R3, = Stack_Mem BX LR ALIGN ENDIF
首先判斷是否定義了__MICROLIB ,如果定義了這個(gè)宏則賦予標(biāo)號(hào)__initial_sp(棧頂?shù)刂罚?__heap_base(堆起始地址)、__heap_limit(堆結(jié)束地址)全局屬性,可供外部文件調(diào)用。 有關(guān)這個(gè)宏我們?cè)贙EIL里面配置,具體見圖 使用微庫(kù) 。然后堆棧的初始化就由C庫(kù)函數(shù)_main來(lái)完成。
如果沒有定義__MICROLIB,則才用雙段存儲(chǔ)器模式,且聲明標(biāo)號(hào)__user_initial_stackheap具有全局屬性,讓用戶自己來(lái)初始化堆棧。
IF,ELSE,ENDIF:匯編的條件分支語(yǔ)句,跟C語(yǔ)言的if ,else類似
END:文件結(jié)束
WIZnet 是一家無(wú)晶圓廠半導(dǎo)體公司,成立于 1998 年。產(chǎn)品包括互聯(lián)網(wǎng)處理器 iMCU?,它采用 TOE(TCP/IP 卸載引擎)技術(shù),基于獨(dú)特的專利全硬連線 TCP/IP。iMCU? 面向各種應(yīng)用中的嵌入式互聯(lián)網(wǎng)設(shè)備。
WIZnet 在全球擁有 70 多家分銷商,在香港、韓國(guó)、美國(guó)設(shè)有辦事處,提供技術(shù)支持和產(chǎn)品營(yíng)銷。
香港辦事處管理的區(qū)域包括:澳大利亞、印度、土耳其、亞洲(韓國(guó)和日本除外)。
審核編輯 黃宇
-
芯片
+關(guān)注
關(guān)注
459文章
52078瀏覽量
435220 -
WIZnet
+關(guān)注
關(guān)注
3文章
21瀏覽量
42362
發(fā)布評(píng)論請(qǐng)先 登錄
電子科技大學(xué)labview課件
自動(dòng)控制原理—北京航天航空大學(xué)精品課件(八章全)
I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南
信號(hào)發(fā)生電路基礎(chǔ) 第八章
第八章 線性離散控制系統(tǒng)分析
51單片機(jī)第八章素材
電子技術(shù)基礎(chǔ)模擬部分第五版_第八章習(xí)題答案.pdf
HCIE復(fù)習(xí)資料_網(wǎng)絡(luò)管理
【正點(diǎn)原子Linux連載】第八章匯編LED燈試驗(yàn)--摘自【正點(diǎn)原子】I.MX6U嵌入式Linux驅(qū)動(dòng)開發(fā)指南V1.0

評(píng)論