STM32-MPU內存保護單元(二)_第1頁
STM32-MPU內存保護單元(二)_第2頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 STM32-MPU內存保護單元()上篇我們說了MPU內存保護單元的基本原理跟寄存器,這篇我們來說下HAL庫的函數(shù)及基本配置本章說的些HAL庫參數(shù),請參照上篇寄存器說明部分:先我們來看下在stm32h7xx_hal_cortex.h中的該結構體參數(shù)如下:MPU初始化結構體MPU_Region_InitTypeDefuint8_t Enable; /區(qū)域使能/禁uint8_t Number ; /區(qū)域編號uint32_t BaseAddress; /配置區(qū)域基地址uint8_t Size; /區(qū)域容量uint8_t SubRegionDisable ; / region 除能位段設置uint8_

2、t TypeExtField ; /類型擴展級別uint8_t AccessPermission; /設置訪問權限uint8_t DisableExec; /允 許/禁取指uint8_t IsShareable ; /禁/允許共享uint8_t IsCacheable ; /禁/允許緩存uint8_t IsBufferable ; /禁/允許緩沖MPU_Region_InitTypeDef ;下我們來對這個結構體的各個參數(shù)進講解:1.Enable對應 MPU 控制寄存器(CTRL)的第0位 ENABLE 于控制是否使能 MPU對應HAL庫參數(shù)如下:#define MPU_REGION_ENAB

3、LE (uint8_t)0 x01) /mpu使能#define MPU_REGION_DISABLE (uint8_t)0 x00) /mpu關閉2.Number對應MPU 區(qū)域編號寄存器(RNR)來設置內存區(qū)序號的,戶配置的時候,推薦從 Number0 開始配置,最多到 Number15共計 16 個。對應的 HAL 庫參數(shù)如下 3.BaseAddressMPU 基地址寄存器(RBAR)的ADDR位 來設置內存區(qū)的地址。0 x240000000 x60000000.4.SizeRASR 寄存器的 SIZE 位,設置MPU區(qū)域的,SIZE 位使的是 bit5:1,共計 5 個 bit,可以表

4、 25 = 32 種HAL 庫給出了可以配置的 28 個參數(shù): #define MPU_REGION_SIZE_1MB#define MPU_REGION_SIZE_2MB#define MPU_REGION_SIZE_4MB#define MPU_REGION_SIZE_8MB#define MPU_REGION_SIZE_16MB#define MPU_REGION_SIZE_32MB#define MPU_REGION_SIZE_64MB#define MPU_REGION_SIZE_1GB#define MPU_REGION_SIZE_2GB#define MPU_REGION_SIZ

5、E_4GB(uint8_t)0 x1D)(uint8_t)0 x1E)(uint8_t)0 x1F)5.SubRegionDisableMPU 區(qū)域屬性和容量寄存器(RASR)的SRD位,關閉對應區(qū)域使能SRD 中的 8 個位,每個位控制個 sub region 是否被除能。如 SRD.4=0,則 4 號 sub region被除能。如果某個 sub region 被除能,且其對應的地址范圍沒有落在其它 region 中,則對該區(qū)的訪問將引發(fā) fault。正常我們直接寫0就,就是Region的每個區(qū)域都有效6.TypeExtFieldMPU 區(qū)域屬性和容量寄存器(RASR)的TEX位 Cach

6、e的擴展功能使能位TEX 對應的 HAL 庫 MPU 參數(shù)給了三個,實際應中僅到前兩個 MPU_TEX_LEVEL0 和MPU_TEX_LEVEL1#define MPU_TEX_LEVEL0 (uint8_t)0 x00)#define MPU_TEX_LEVEL1 (uint8_t)0 x01)#define MPU_TEX_LEVEL2 (uint8_t)0 x02)7.AccessPermissionMPU 區(qū)域屬性和容量寄存器(RASR)的AP 位 設置region內存區(qū)的權限正常設置為全訪問,都可以讀寫就可以MPU_REGION_FULL_ACCESS #define MPU_RE

7、GION_PRIV_RO_URO (uint8_t)0 x06)/MPU_REGION_NO_ACCESS,訪問(特權&戶都不可訪問)/MPU_REGION_PRIV_RW,僅持特權讀寫訪問/MPU_REGION_PRIV_RW_URO,禁戶寫訪問(特權可讀寫訪問)/MPU_REGION_FULL_ACCESS,全訪問(特權&戶都可訪問)/MPU_REGION_PRIV_RO,僅持特權讀訪問/MPU_REGION_PRIV_RO_URO,只讀(特權&戶都不可以寫)8.DisableExecRASR 寄存器的 XN 位,XN=0 表使能指令提取,即這塊內存區(qū)可以執(zhí)程序代碼,XN=1 表禁指令提取

8、,即這塊內存區(qū)禁執(zhí)程序代碼#define MPU_INSTRUCTION_ACCESS_DISABLE (uint8_t)0 x01)8.IsShareable-RASR 寄存器的 S 位,于位于控制存儲器的共享特性,S=1,則級存儲器不可以緩存(Cache),如果設置 S=0,則可以緩存(Cache),般我們設置該位為 0 即可。#define MPU_ACCESS_SHAREABLE(uint8_t)0 x01)#define MPU_ACCESS_NOT_SHAREABLE (uint8_t)0 x00)9.IsCacheableRASR 寄存器的 C位,于使能或者禁Cache#defi

9、ne MPU_ACCESS_CACHEABLE(uint8_t)0 x01)#define MPU_ACCESS_NOT_CACHEABLE(uint8_t)0 x00)10.IsBufferableRASR 寄存器的 B位,于配合C位實現(xiàn)Cache下是否使緩沖#define MPU_ACCESS_NOT_BUFFERABLE (uint8_t)0 x00)關于MPU還有個函數(shù):禁和使能 MPU 以及 MemManage 中斷。HAL 庫中使能 MPU 以及 MemManage 中斷函數(shù): _STATIC_INLINE void HAL_MPU_Enable(uint32_t MPU_Cont

10、rol );參數(shù):MPU_ControlMPU_HFNMI_PRIVDEF_NONE (uint32_t)0 x00000000)此參數(shù)設置 MPU 的 CTL 控制寄存器的 PRIVDEFENA 位為 0。表禁了背景區(qū),訪問任何未使能 MPU 的區(qū)域均會造成內存異常 MemFault。此參數(shù)設置 MPU 的 CTL 控制寄存器的 HFNMIENA 位為 0。表 NMI 不可屏蔽中斷服務程序和硬件異常中斷服務程序執(zhí)期間會關閉 MPU。MPU_HARDFAULT_NMI (uint32_t)0 x00000002)此參數(shù)設置 MPU 的 CTL 控制寄存器的 PRIVDEFENA 位為 0。表使

11、能了背景區(qū),訪問任何未使能 MPU 的區(qū)域均會造成內存異常 MemFault。此參數(shù)設置 MPU 的 CTL 控制寄存器的 HFNMIENA 位為 1。表 NMI 不可屏蔽中斷服務程序和硬件異常中斷服務程序執(zhí)期間會保持繼續(xù)開啟 MPU。MPU_PRIVILEGED_DEFAULT (uint32_t)0 x00000004)此參數(shù)設置 MPU 的 CTL 控制寄存器的 PRIVDEFENA 位為 1。表使能了背景區(qū),特權級模式可以正常訪問任何未使能 MPU 的區(qū)域。此參數(shù)設置 MPU 的 CTL 控制寄存器的 HFNMIENA 位為 0。表 NMI 不可屏蔽中斷服務程序和硬件異常中斷服務程序執(zhí)

12、期間會關閉 MPU。MPU_HFNMI_PRIVDEF (uint32_t)0 x00000006)此參數(shù)設置 MPU 的 CTL 控制寄存器的 PRIVDEFENA 位為 1。表禁了背景區(qū),訪問任何未使能 MPU 的區(qū)域均會造成內存異常 MemFault。此參數(shù)設置 MPU 的 CTL 控制寄存器的 HFNMIENA 位為 1。表 NMI 不可屏蔽中斷服務程序和硬件異常中斷服務程序執(zhí)期間會保持繼續(xù)開啟 MPU。正常我們使的是禁函數(shù)為:即使能背景區(qū),異常中斷關閉MPUMPU_PRIVILEGED_DEFAULT_STATIC_INLINE void HAL_MPU_Disable(void);

13、下我們設置下H7的FMC區(qū)域保護 /保護MCU的FMC塊1 區(qū)域,共 64M 字節(jié)/AccessPermission:訪問權限,訪問關系如下:/可設置的值參考:CORTEX_MPU_Region_Permission_Attributes/MPU_REGION_NO_ACCESS,訪問(特權&戶都不可訪問)/MPU_REGION_PRIV_RW,僅持特權讀寫訪問/MPU_REGION_PRIV_RW_URO,禁戶寫訪問(特權可讀寫訪問)/MPU_REGION_FULL_ACCESS,全訪問(特權&戶都可訪問)/MPU_REGION_PRIV_RO,僅持特權讀訪問/MPU_REGION_PRIV

14、_RO_URO,只讀(特權&戶都不可以寫)/詳見:STM32H7 Series Cortex-M7 processor programming manual.pdf,4.6 節(jié),Table 89.void MPU_Set_Protection()MPU_Region_InitTypeDef MPU_Initure ;HAL_MPU_Disable(); /配置MPU 之前先關閉MPU,配置完成以后在使能MPUMPU_Initure.Enable=MPU_REGION_ENABLE; /使能該保護區(qū)域MPU_Initure.Number=MPU_REGION_NUMBER0; /設置保護區(qū)域編號

15、MPU_Initure.BaseAddress=0 x60000000; /設置基址MPU_Initure.Size=MPU_REGION_SIZE_64MB; /設置保護區(qū)域MPU_Initure.SubRegionDisable=0X00; /禁區(qū)域MPU_Initure.TypeExtField=MPU_TEX_LEVEL0; /設置類型擴展域為level0MPU_Initure.AccessPermission=MPU_REGION_FULL_ACCESS; /設置訪問權限,MPU_Initure.DisableExec=MPU_INSTRUCTION_ACCESS_ENABLE; /允許指令訪問MPU_Initure.IsShareable=MPU_ACCESS_NOT_SHAREABLE; /禁共MPU_Initure.IsCacheable=MPU_ACCESS_CACHEABLE; /使能cacheMPU_Initure.IsBufferable=MPU_ACCESS_BUFFERABLE; /允許緩沖HAL_MPU_ConfigRegion(&MPU_Initure); /配置MPUHAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT); /開啟MPU從 0 x60000000 地址開始的 64MB 地

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論