<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > STM8單片機啟動(dòng)流程徹底探究--基于IAR開(kāi)發(fā)環(huán)境

STM8單片機啟動(dòng)流程徹底探究--基于IAR開(kāi)發(fā)環(huán)境

作者: 時(shí)間:2017-01-16 來(lái)源:網(wǎng)絡(luò ) 收藏

  初學(xué)會(huì )發(fā)現,官方的固件庫并沒(méi)有提供一個(gè).s文件的啟動(dòng)代碼,那么她是如何啟動(dòng)然后跳轉到main函數執行的呢

本文引用地址:http://dyxdggzs.com/article/201701/342940.htm

  首先,我們根據ARM的只是可以推測,也是通過(guò)復位向量來(lái)啟動(dòng)的,假設流程在復位響亮中完成的,應該首先去復位向量表中間去找,看復位向量又要看存儲器映射,一環(huán)扣一環(huán)

  STM8使用的是統一編址技術(shù),以下是存儲器編址圖


  我們可以看到,最大取指空間是0XFFFFFF,也就是說(shuō),是16M,這是因為PC的特性決定的


  在程序內部,它是將16M分為了256個(gè)節(sector),每個(gè)節的大小為64K,64*256= 16384K=16M,由圖我們可以看到,在SECTOR0區間里面似乎還有些玄妙,之后的就是普通空間了


  這就是sector的分區,分區如下

  0-17ff 是RAM空間,而且是最大的ram空間,STM8的ram一般都小于6K由此可見(jiàn),在這個(gè)ram空間里面就包含有我們的堆棧區域.但是不一定是6K,(3G尋址的win7也沒(méi)見(jiàn)多少人真的裝3G啊,裝2G內存條的多的是)

  1800-3fff是保留區域

  4000-47ff是最大2K的數據保存區(相當于EEPROM)

  4800-487f是選項字節空間,用于設置一些配置信息

  4900-4fff是保留空間

  5000-57ff IO以及外設的寄存器空間(統一編址技術(shù))

  5800-5fff 保留區域

  6000-67ff 2K的啟動(dòng)代碼rom

  6800-7eff 保留區間

  7f00-7fff 系統寄存器的地址

  8000-8080 中斷向量

  在往下才是flash空間,也就是說(shuō),我們的代碼存放的區域就是在0x8000開(kāi)始的

  在上面那張圖我們可以看見(jiàn)復位向量



  那是不是說(shuō)芯片啟動(dòng)立馬就到了復位向量0x8000的位置了呢?

  其實(shí)不然,查看手冊我們發(fā)現這一段話(huà)



  也就是說(shuō),系統啟動(dòng)的時(shí)候不在復位向量的地方,那這個(gè)6000區域存放的是啥



  原來(lái)是啟動(dòng)代碼,還是數據手冊



  鑒于此,我們可以很肯定地說(shuō),系統啟動(dòng)的過(guò)程是

  復位-->跳轉到boot ram--->boot ram進(jìn)行某種初始化-->處理用戶(hù)有可能的程序更新-->跳轉到0x8000-->復位向量執行

  既然復位向量在8000,那么代碼中應該有指示



  我們在里面看到他對中斷的處理依靠這個(gè)宏定義,實(shí)際上他就是定義了兩個(gè)重要的宏定義

  INTERRUPT_HANDLER_TRAP(a)和INTERRUPT_HANDLER(a, b )

  我們展開(kāi)第一個(gè)

  得到

  INTERRUPT_HANDLER_TRAP(a) ==

  _Pragma(vector = 1) __interruptvoid (a) (void)

  這里面涉及到兩個(gè)編譯器關(guān)鍵字分別是Pragma和interrupt



  Pragma是一個(gè)預處理指令,它包含不同的語(yǔ)句的時(shí)候有不同的含義,我們現在包含的是vector,那就和vector有關(guān)系了



  什么意思呢,我們得看具體語(yǔ)法



  也就是說(shuō),相當于在中斷向量表標號中寫(xiě)入指定的函數

  _Pragma(vector = 1) __interruptvoid (a) (void)

  相當于在中斷向量1的位置寫(xiě)入a這個(gè)函數的指針

  INTERRUPT_HANDLER( a, b )展開(kāi)來(lái)

  _Pragma(vector = b+2) __interruptvoid (a) (void)

  就是在中斷向量表B+2的位置寫(xiě)入a這個(gè)函數的指針,(因為0和1被reset和trap占用了)

  現在我們來(lái)看it.c中的語(yǔ)句就很清楚了



  第一個(gè)函數是trap指針,我們需要實(shí)現TRAP_IRQHandler這個(gè)函數就能關(guān)聯(lián)上對應的中斷向量

  第二個(gè)函數同樣我們只要實(shí)現TLI_IRQHandler這個(gè)函數就OK了

  函數的視線(xiàn)需要遵循

  __interrupt void (a) (void)的模式,否則宏定義報錯

  可是trap有了,reset去哪了呢?這是的一個(gè)手段,他把RESET隱藏了,我們來(lái)看這個(gè)圖片



  相當于,在RESET處默認存放了一個(gè)中斷向量指針,指針的指向是__iar_program_start函數,這個(gè)函數我們無(wú)法找到,屬于iar內置函數,但是我們可以看到,調試就可以了

  打開(kāi)仿真



  在reset位置放置了一個(gè)0x80c3地址(0x82屬于固定填充,24位地址,32位高八位不用),80c3位置代碼如下



  由此可見(jiàn)我們的推論是正確的

  先設置堆?;刂?x17ff然后經(jīng)歷lowinit和datainit之后跳轉到main函數執行

  所以,IAR下編譯STM8啟動(dòng)的過(guò)程總結如下

  復位-->跳轉到boot ram--->boot ram進(jìn)行某種初始化-->處理用戶(hù)有可能的程序更新-->跳轉到0x8000-->復位向量執行à跳轉到__iar_program_start-->跳轉到main函數地址



關(guān)鍵詞: STM8 IAR

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>