<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è) > 設計應用 > 基于S12G CAN總線(xiàn)通信的獨立NVM驅動(dòng)安全bootloader設計 

基于S12G CAN總線(xiàn)通信的獨立NVM驅動(dòng)安全bootloader設計 

作者:胡恩偉 時(shí)間:2016-07-28 來(lái)源:電子產(chǎn)品世界 收藏
編者按:本文針對傳統汽車(chē)ECU CAN總線(xiàn)通信bootloader將NVM驅動(dòng)放置在MCU片上Flash, 存在程序跑飛進(jìn)入NVM驅動(dòng)時(shí)造成NVM數據丟失,從而出現ECU功能丟失或工作異常的問(wèn)題,提出一種獨立NVM驅動(dòng)的安全bootloader設計,并在NXP的S12G128上實(shí)現。引言  CAN總線(xiàn)因其良好的差分通信抗干擾能力而被廣泛應用于汽車(chē)ECU通信。bootloader是MCU上電或復位之后最先運行的一段永久駐留于MCU 片上NVM (Non-Volatile Memory,非易失性存儲器) 中的一

摘要:本文針對傳統汽車(chē)ECU 通信bootloader將NVM驅動(dòng)放置在MCU片上Flash, 存在程序跑飛進(jìn)入NVM驅動(dòng)時(shí)造成NVM數據丟失,從而出現ECU功能丟失或工作異常的問(wèn)題,提出一種設計,并在NXP的128上實(shí)現。

本文引用地址:http://dyxdggzs.com/article/201607/294705.htm

引言

  因其良好的差分通信抗干擾能力而被廣泛應用于汽車(chē)ECU通信。bootloader是MCU上電或復位之后最先運行的一段永久駐留于MCU 片上NVM (Non-Volatile Memory,非易失性存儲器) 中的一段極小的程序,完成與PC上位機通信,下載、解析并存儲應用程序到ECU的非易失性存儲器,從而完成應用程序的在線(xiàn)升級[1]。以往的bootloader設計將NVM的驅動(dòng)程序放在片上Flash中,當程序跑飛進(jìn)入NVM驅動(dòng)時(shí)就會(huì )造成NVM數據丟失,導致ECU功能丟失或工作異常。如果將NVM驅動(dòng)程序編譯到MCU RAM中,形成S19文件,與應用程序一起由下載到RAM中運行而不將其儲存在片上,則可以避免此類(lèi)情況發(fā)生。

1 128片上NVM資源及其獨立驅動(dòng)程序開(kāi)發(fā)

  128片上NVM資源包括片上的4KB EEPROM和128KB P-Flash。由于S12內核中SP和PC寄存器都是16位寬,因此,其最大線(xiàn)性尋址范圍為64KB。為了高效地訪(fǎng)問(wèn)大于64KB的P-Flash存儲空間,Freescale提出了存儲器分頁(yè)訪(fǎng)問(wèn)機制,即通過(guò)0x8000~0xBFFF的16KB Flash窗口以存儲器映射的方式對分頁(yè)的Flash空間進(jìn)行訪(fǎng)問(wèn)[2-3]。

1.1 S12G128片上NVM資源

  S12G128的128KB P-Flash包括了從全局地址0x20000開(kāi)始的8個(gè)連續16KB Flash頁(yè),其支持1/2/4/8/16KB的區域 (region) 保護 (Protection) 和 整個(gè)P-Flash的加密 (Secure) 。所謂保護是指不能被應用程序擦除和改寫(xiě),這一功能在bootloader開(kāi)發(fā)中常被用于保護bootloader程序自身不被應用程序修改。加密是針對BDM調試接口的,當S12G加密之后,外部調試器能夠執行的唯一BDM命令就是整片擦除,要想解密,就得執行整片擦除命令將整個(gè)P-Flash上的數據清空或者輸入8個(gè)字節的正確后門(mén)密鑰 (backdoor key,位于局部地址0xFF00~0xFF07,全局地址0x3FF00~0x3FF07)。 從而有效的保護用戶(hù)的軟件知識產(chǎn)權[2]。

  S12G128的片上4KB EEPROM,地址空間為0x400~0x13FF,位于CPU可以直接訪(fǎng)問(wèn)的局部地址[3]中,所有無(wú)需分頁(yè)訪(fǎng)問(wèn)。其包含1024個(gè)4Byte的最小擦除和編程扇區(sector)并支持靈活的保護功能。S12G 128 的NVM都支持硬件ECC,能夠自動(dòng)糾正NVM數據的單比特錯誤和多比特檢錯。

1.2 S12G128 開(kāi)發(fā)

  NXP提供的S12系列MCU的標準軟件驅動(dòng) (SSD—Standard Software Driver),包含運行時(shí)獨立的源代碼、S19文件,C數組以及靜態(tài)庫等形式的NVM驅動(dòng)[5]。

  本設計中使用標準軟件驅動(dòng)開(kāi)發(fā):首先,根據實(shí)際MCU型號配置SSD,make生成C數組形式的NVM驅動(dòng),將其整理在一個(gè)C文件中與SSD頭文件一起添加到CodeWarrior工程中編譯,并將各個(gè)NVM驅動(dòng)函數地址放在位于地址0x3F80的數組中作為NVM驅動(dòng)函數地址表。因為所有的NVM驅動(dòng)函數數組和NVM驅動(dòng)函數地址表都由C語(yǔ)言關(guān)鍵詞const修飾,是數組常量,默認放在ROM_VAR段中,修改工程PRM鏈接文件,將ROM_VAR段放置在NVM_RAM段中即可將其編譯到0x3000開(kāi)始的RAM地址,得到S19文件,從中即可分離得到NVM驅動(dòng)及其函數地址表的S19格式文件。具體的NVM驅動(dòng)函數映射地址表及PRM鏈接文件如圖1所示。

  使用時(shí),先將其加載在對應的RAM地址,然后用函數指針調用。

2 基于CAN總線(xiàn)的bootloader設計

  基于CAN總線(xiàn)的bootloader設計包括運行在PC上的上位機軟件和運行在目標MCU中的bootloader軟件兩部分。

2.1 PC上位機軟件及通信協(xié)議設計

  運行在PC上的上位機軟件主要功能是讀取目標MCU的應用程序S19文件,并調用USB轉CAN總線(xiàn)適配器(Adapter),將其逐行下載到目標MCU,其軟件設計軟件設計流程圖如圖2所示。

  本設計中,采用Visual C++調用WFC和武漢吉陽(yáng)光電的-GY8507 USB轉CAN適配器驅動(dòng),編寫(xiě)上位機軟件。

  上位機下載應用程序S19文件的CAN消息是ID為0x64的標準數據幀,而bootloader host程序應答上位機的CAN消息幀是ID為0xC8的標準數據幀,通信速率設置為500Kbit/s。因此在S12G初始化時(shí)將MSCAN模塊的接收ID濾波器設置為只接收ID為0x64的標準幀,以避免總線(xiàn)上其他ECU的干擾。具體的CAN消息命令定義如表1所示。

2.2 bootloader軟件設計

  bootloader軟件設計流程如圖3所示。

  MCU復位之后,進(jìn)行系統初始化,配置系統時(shí)鐘和MSCAN,使能CPU全局中斷,然后等待上位機boot命令并檢查是否超時(shí):如果在規定的500ms內接收到了上位機請求進(jìn)入boot的命令,則建立通信接收并解析得到行地址和字對齊的數據,接著(zhù)判斷S19行地址空間,若是Flash地址且是第一次收到Flash數據,則將除bootloader程序之外的所有片上Flash擦除;若為EEPROM地址且是第一次收到EEPROM數據,則將全部EEPROM擦除;若是RAM地址,則不可擦除。對Flash地址的數據,在編程到Flash之前,還須將解析結果中的邏輯地址轉換為Flash驅動(dòng)所需的線(xiàn)性連續物理地址,并將數據進(jìn)行4字對齊,以提高編程效率。依次逐行接收,解析并將結果燒寫(xiě)到相應地址的片上Flash/EEPROM/RAM中,直至整個(gè)應用程序S19文件結束,最后復位外設、清除NVM驅動(dòng)所在的RAM、關(guān)閉CPU全局中斷,結束bootloader跳轉至應用程序;如果在規定的500ms內未收到上位機通過(guò)CAN發(fā)來(lái)的進(jìn)入boot命令,則直接關(guān)閉CPU全局中斷,結束bootloader跳轉至應用程序。

2.3 應用程序軟件設計

  應用程序設計時(shí),需要保留bootloader所在的Flash空間并在系統初始化時(shí)設置IVOR=0xEF,將應用程序中斷向量表偏移至0xEF80,使其與MCU復位后默認的中斷向量表分開(kāi),從而執行不同的外設中斷服務(wù)函數。

  另外,需要將COP看門(mén)狗使能,在應用程序主循環(huán)中正常喂狗,而在MSCAN接收中斷中對接收到的CAN消息ID進(jìn)行判斷,若接收到Boot ID,則不喂狗,讓其溢出復位,從而進(jìn)入bootloader。典型的應用程序軟件設計流程圖如圖4所示。

3 bootloader和應用程序內存分配及處理器專(zhuān)家配置

  在bootloader工程中使用CodeWarrior 5.1 IDE自帶的內核和外設圖形化配置和自動(dòng)代碼生成工具--處理器專(zhuān)家(Processor Expert)配置外部8MHz晶振作為PLL參考時(shí)鐘,配置PLL倍頻輸出50MHz作為CPU運行時(shí)鐘,其二分配得到的25MHz作為總線(xiàn)時(shí)鐘頻率;MSCAN通信速率為500Kbit/s,使能接收中斷。配置0xF000~0xFEFF的3.8KB Flash作為bootloader存儲空間,堆棧大小為256B,保留0x3000到0x3FFF的4KB空間作為NVM驅動(dòng)代碼的存儲和運行空間并將其初始化為0。系統RAM空間為0x2000到0x2FFF。

  在應用程序工程中,需要保留bootloader所在的Flash最后4KB空間,其余Flash空間全部可被應用程序使用;對于RAM空間,則全部8KB都可以被用戶(hù)使用。而且必須保證其入口函數Entry_Point () 與bootloader中定義的應用程序入口地址相同 (因為使用處理器專(zhuān)家生成的工程中,默認從0xC000開(kāi)始放置默認中斷服務(wù)函數Cpu_Interrupt () 和匯編軟件延遲函數Cpu_Delay100US (), 其分別占2個(gè)字節和12個(gè)字節,然后才放置MCU復位中斷服務(wù)函數_EntryPoint () ,如果在處理器專(zhuān)家的CPU組件中未使能匯編軟件延遲函數,則應將bootloader和應用程序中的應用程序入口地址由0xC00E改為0xC002 。

  bootloader和應用程序的內存分配如圖5所示。

  使用處理器專(zhuān)家CPU組件的編譯選項能夠非常方便的完成上述內存分配并生成prm鏈接文件, bootloader內存分配處理器專(zhuān)家配置結果如圖6所示。

  生成相應的鏈接文件為:

  SEGMENTS

  RAM = READ_WRITE 0x2000 TO 0x2FFF;

  ROM_C000 = READ_ONLY 0xC00E TO 0xEFFF;

  NVM_DRIVER_RAM = READ_WRITE 0x3000 TO 0x3FFF FILL 0x00;

  BOOT_ROM = READ_ONLY 0xF000 TO 0xFEFF;

  END

  PLACEMENT

  _PRESTART,

  STARTUP,

  ROM_VAR,

  STRINGS,

  NON_BANKED,

  DEFAULT_ROM,

  COPY INTO BOOT_ROM;

  DEFAULT_RAM INTO RAM, NVM_DRIVER_RAM;

  APP_ROM_ENTRY INTO ROM_C000;

  END

  INIT _EntryPoint

  STACKSIZE 0x0100

4. 總結

  本文針對NXP公司的S12 (X) 系列MCU在汽車(chē)ECU應用中bootloader開(kāi)發(fā)的實(shí)際需求,介紹了S12G128的片上NVM資源極其獨立驅動(dòng)開(kāi)發(fā),提出并實(shí)現了一種基于CAN總線(xiàn)通信將NVM驅動(dòng)程序由上位機下載到RAM中運行而非讓其駐留于MCU片上Flash的設計,有效避免了應用程序跑飛運行至駐留于片上Flash的NVM驅動(dòng)代碼所造成的程序/數據丟失失效。借助CodeWarrior 5.1 IDE的圖形化外設配置和自動(dòng)代碼生成工具----處理器專(zhuān)家,便捷的實(shí)現了bootloader和應用程序的內存分配和片上外設配置。本設計提供完整設計工程和使用文檔,在此基礎上,根據整車(chē)廠(chǎng)的要求修改CAN報文boot ID和命令,并增加相應的UDP或者CCP協(xié)議棧即可快速開(kāi)發(fā)出符合車(chē)廠(chǎng)要求的產(chǎn)品。

參考文獻:

  [1][德]康拉德·萊夫 .BOSCH汽車(chē)電氣與電子, 中文第二版[M].孫澤昌,譯,北京:北京理工大學(xué)出版社,,2014,8.

  [2]孫同景. Freescale 9S12 十六位單片機原理及嵌入式開(kāi)發(fā)技術(shù)[M].北京:機械工業(yè)出版社, 2008,7.

  [3]AN3784.Understanding the Memory Scheme in the S12(X) Architecture, Application Note. NXP Semiconductor, http://www.nxp.com. 2009.

  [4]MC9S12G Family Reference Manual, Rev.1.25. NXP Semiconductor, http://www.nxp.com. 2014.

  [5]Standard Software Driver for MC9S12G / MC9S12VR User’s Manual, Rev.3.1. NXP Semiconductor, http://www.nxp.com. 2012.

本文來(lái)源于中國科技期刊《電子產(chǎn)品世界》2016年第7期第73頁(yè),歡迎您寫(xiě)論文時(shí)引用,并注明出處。



評論


相關(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>