stm32f10x_con.h
配置文件:加載哪個外設、使能assert 對參數進行檢查,如果使能了assert 需要在main文件中添加 _assert_faild 函數。 使能assert會增大編譯出執行文件的大小,調試完后可以將assert 屏蔽。
stm32f10x.h頭文件中包含了stm32f10x_conf.h 。
stm32f10x.h
1、對所有的外設的地址進行映射,映射到存儲區,即定義某外設結構體變量,因為結構體是連續存儲的只要將外設的基地址強制轉換為結構體類型的指針,那么該外設的寄存器就可以通過指針進行訪問,以GPIO為例:
定義外設的結構體,結構體變量都是volatile類型,告訴編譯器不要進行優化,讀取值從內存讀取不要讀緩存。
typedef struct
{
__IO uint32_t CRL;
__IO uint32_t CRH;
__IO uint32_t IDR;
__IO uint32_t ODR;
__IO uint32_t BSRR;
__IO uint32_t BRR;
__IO uint32_t LCKR;
} GPIO_TypeDef;
GPIO外設的地址
#define PERIPH_BASE ((uint32_t)0x40000000) //外設別名區的基地址
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000) // APB2外設總線上寄存器的基地址,GPIO掛在APB2總線上
// GPIO外設的地址
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOB_BASE (APB2PERIPH_BASE + 0x0C00)
#define GPIOC_BASE (APB2PERIPH_BASE + 0x1000)
#define GPIOD_BASE (APB2PERIPH_BASE + 0x1400)
#define GPIOE_BASE (APB2PERIPH_BASE + 0x1800)
#define GPIOF_BASE (APB2PERIPH_BASE + 0x1C00)
#define GPIOG_BASE (APB2PERIPH_BASE + 0x2000)
// 將外設地址強制轉化為結構體的指針,然后就可以通過指針GPIOx區訪問某個端口中的寄存器
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)
#define GPIOB ((GPIO_TypeDef *) GPIOB_BASE)
#define GPIOC ((GPIO_TypeDef *) GPIOC_BASE)
#define GPIOD ((GPIO_TypeDef *) GPIOD_BASE)
#define GPIOE ((GPIO_TypeDef *) GPIOE_BASE)
#define GPIOF ((GPIO_TypeDef *) GPIOF_BASE)
#define GPIOG ((GPIO_TypeDef *) GPIOG_BASE)
2、外設寄存器位的定義
core_cm3.c文件
內核相關的變量和函數的定義:NVIC、systick、MPU(有的MCU沒有)、調試組件
1、NVIC相關的變量和函數。
中斷向量的使能_(我理解相當于全局中斷的使能)
中斷向量的禁止
中斷向量的掛起
清除掛起的中斷
設置中斷的優先級
讀取中斷的優先級
2、systick定時器的配置,static __INLINE uint32_t SysTick_Config(uint32_t ticks);用來使能中斷、開啟systick定時器。
系統滴答定時器的配置,具體的systick 的介紹在cortex-m3 技術手冊中有介紹。
system_stm32f10x.c
1、 時鐘的頻率,系統時鐘的初始化,在最后設置了中斷向量表的基地址和偏移地址:
SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET;
當在MDK中改變燒寫程序IROM的地址時FLASH_BASE 的地址要改為IROM的地址,如果改為函數void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);修改NVIC_VectTab_FLASH 的地址,實際上這兩種設置向量表的方法是一樣的,都要修改向量表的基地址。
偏移量默認偏移量是0,從代碼區啟動則向量表的地址0x0800 0000,0x0800 0000保存的是堆棧棧頂的地址,代碼區的燒寫地址在MDK軟件中設置。
IAP遠程升級能用到這部分的內容,可以參考正點原子的教程。
misc.c
1、void NVIC_SetVectorTable(uint32_t NVIC_VectTab, uint32_t Offset);函數用來設置中斷向量表的位置:SRAM or Flash 默認是在Flash中,偏移量必須是0x200的整數倍。
2、NVIC中斷管理的函數,使能、分組等。
3、SCB system control block 系統控制塊
系統控制塊結構體包含了:
startup_stm32f10x_md.s
啟動文件,啟動文件中定義了該類型MCU堆的大小和棧的大小,還有中斷向量表。中斷向量表通過偽指令分配了各個中斷入口函數,在程序進行鏈接時就會把中斷向量表中偽指令中斷函數分配實際的flash地址。
上一篇:stm32通過spi連接esp8266的hspi 開發
下一篇:基于STM32的簡單電子書的實現
推薦閱讀
史海拾趣