STM32F4xx包含16個(gè)32位核心(整數(shù))寄存器,。它們被標(biāo)記為R0-R15,。寄存器名可以在匯編語(yǔ)言中以大寫或小寫形式出現(xiàn),。當(dāng)寄存器在過(guò)程調(diào)用標(biāo)準(zhǔn)中具有固定角色時(shí),使用大寫,。STM32F4xx支持的核心寄存器如下圖: 程序計(jì)數(shù)器(PC)是寄存器R15,。它包含當(dāng)前程序地址。處理器復(fù)位時(shí),,處理器用復(fù)位向量的值加載PC,,該值位于0x00000004。編寫匯編時(shí)需要遵循ABI規(guī)范,,該規(guī)范規(guī)定了寄存器的相關(guān)用法,,函數(shù)調(diào)用規(guī)范如下: 前四個(gè)寄存器r0-r3(a1-a4)用于將參數(shù)值傳遞給子程序,并從函數(shù)返回結(jié)果值。它們還可用于在例程中保存中間值(但通常僅在子例程調(diào)用之間),。在一些變體中,,r11(FP)可以用作幀指針。通常寄存器r4-r8,、r10和r11(v1-v5,、v7和v8)用于保存例程局部變量的值。 向量表包含復(fù)位時(shí)堆棧指針的值,、復(fù)位起始地址以及所有異常處理程序入口地址,。在系統(tǒng)復(fù)位時(shí),向量表固定在地址0x00000000,。特權(quán)軟件可以寫入VTOR寄存器以將矢量表的起始地址重新定位到不同的內(nèi)存位置,,在范圍0x00000080到0x3FFFFF80。 通過(guò)上述的鏈接腳本指isr_vector段即定向量表的地址位于代碼起始處,,其libraries\STM32F4xx_HAL\CMSIS\Device\ST\STM32F4xx\Source\Templates\gcc\startup_stm32f407xx.s啟動(dòng)代碼中的下圖代碼表明向量表的布局,,與向量表圖吻合,其處理器的執(zhí)行的第一條指令為Reset_Handler函數(shù)的第一條指令,。 Reset_Handler函數(shù)主要負(fù)責(zé)把數(shù)據(jù)段搬移到SRAM和BSS段清零操作,,然后跳轉(zhuǎn)到SystemInit函數(shù)設(shè)置微控制器系統(tǒng),初始化FPU設(shè)置,、矢量表位置和外部存儲(chǔ)器配置,,最后調(diào)用entry函數(shù)進(jìn)入RT-Thread內(nèi)核初始化。其數(shù)據(jù)段和BSS段的起始地址和結(jié)束地址由鏈接腳本指定,,其數(shù)據(jù)段的起始地址和結(jié)束地址變量為_sdata和_edata,。BSS段的起始地址和結(jié)束地址為_sbss和_ebss。其初始化流程如下: 系統(tǒng)采用SysTick timer (STK)做為系統(tǒng)時(shí)鐘,,默認(rèn)配置每秒鐘1000次tick,其定時(shí)器處理函數(shù)為SysTick_Handler,。SysTick異常是系統(tǒng)計(jì)時(shí)器在計(jì)數(shù)達(dá)到零時(shí)產(chǎn)生,,SysTick異常位于15號(hào)中斷向量。 0x8000000-0x80FFFFF為FLASH空間,,0x20000000-0x2001BFFF為SRAM空間,,其內(nèi)存模型如下: 片內(nèi)FALSH不適合運(yùn)行文件系統(tǒng),每個(gè)扇區(qū)空間太大,,一般前面扇區(qū)作為存儲(chǔ)程序使用,,后面扇區(qū)作為文件系統(tǒng),但是每個(gè)扇區(qū)128KB太大(一般SPI FLASH的扇區(qū)大小為512字節(jié)),導(dǎo)致只有幾個(gè)扇區(qū),,文件創(chuàng)建都是以扇區(qū)為單位,,沒(méi)有意義。可通過(guò)調(diào)用fal_blk_device_create注冊(cè)一個(gè)塊設(shè)備,,然后可以通過(guò)open函數(shù)打開設(shè)備,,進(jìn)行FLASH的相關(guān)讀寫。 |
|