日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

STM32H743+CubeMX-梳理MPU的设置

發布時間:2025/3/15 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 STM32H743+CubeMX-梳理MPU的设置 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、前言
  • 二、CubeMX
    • 2.1、Cortex interface Settings
    • 2.2、Cortex Memory Protection Unit Control Settings(內存保護單元控制設置)
    • 2.3、Cortex Memory Protection Unit Region 0 Settings(內存保護單元區域0設置)
      • 2.3.1、MPU Region
      • 2.3.2、MPU Region Base Address(MPU區域首地址)
      • 2.3.3、MPU Region Size(MPU區域大小)
      • 2.3.4、MPU SubRegion Disable
      • 2.3.5、MPU TEX field level(MPU TEX域等級)
      • 2.3.6、MPU Access Permission(MPU訪問權限)
      • 2.3.7、MPU Instruction Access ( MPU指令訪問)
      • 2.3.8、MPU Shareability Permission(MPU共享許可)
      • 2.3.9、MPU Cacheable Permission(MPU Cache許可)與 MPU Bufferable Permission(MPU 緩存許可)
  • 三、代碼
    • 3.1、案例一
    • 3.2、案例二
    • 3.3、案例一與案例二的區別

相關筆記:
STM32H743+CubeMX-將變量定義到指定的內存
STM32CubeIDE教程-查看FLASH與RAM細節

一、前言

充分發揮Cortex-M7架構(STM32H743屬于Cortex-M7)的性能,必須掌握MPU的使用。實際上,提高CPU性能的不是MPU,而是Cache(高速緩存器)。在STM32上,配置了MPU才能使用Cache,Cache的配置是通過MPU設置的。總之,為了使用cache才配置MPU。
參考安富萊例程源碼,配置MPU管理512kb的AXI SRAM內存:

  • 訪問許可為Full access(訪問不受限)
  • 內存類型:Normal
  • Cache的配置為Write-back,wirte and read allocate(Cache四種配置之一)
  • 禁止多個進程共享內存。

    為什么使用Cache才能充分發揮CPU的性能?在默認的配置下,靜態內存優先使用128KB的DTCM。原因是CPU讀寫DTCM內存的速度是480M,所以一般優先使用128KB的DTCM。CPU直接讀寫其他靜態內存的速度僅僅只有200M,白白浪費CPU的480M主頻了。為了解決這個問題,Cortex-M7架構有了cache。通過提前將數據緩沖到12KB的cache,然后CPU再從cache里讀取數據,這樣就能解決當CPU讀寫AXI SRAM與SRAM1等內存時所造成的性能損失。
    為什么要學習使用MPU?只有通過設置MPU才能配置cache,才能正常使用cache緩存數據。

    并不是DTCM擠滿了才有機會使用MPU。比如當使用ADC+DMA采集模擬量數據時,DMA并不能將外設采集的模擬量數據存放到DTCM里,一般只能放進AXI SRAM,SRAM1,SRAM2,SRAM3里。此時,就需要使用MPU+cache提高CPU讀寫AXI RAM,SRAM1等內存的速度。

    配置MPU的目的是使用cache,所以可以簡單地將MPU的設置分為三部分。第一部分是配置MPU的內存地址,第二部分是配置Cache的讀寫規則,第三部分設置保護規則(配置MPU是為了使用Cache,所以不用保護)。
  • 二、CubeMX

    2.1、Cortex interface Settings

    在CubeMX上找到CORTEX_M7,使能CPU ICache與CPU DCahce。其實就是使能Cache(高速緩存器)。

    2.2、Cortex Memory Protection Unit Control Settings(內存保護單元控制設置)

    MPU Control Mode有四種控制模式:

  • Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers
  • Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers
  • Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers
  • Background Region Privileged access only + MPU Enable during hard fault , NMI and FAULTMASK handers

    MPU Control Mode選項其實就是配置MPU_CTRL寄存器:
    • PRIVDEFENA :使能特權軟件對默認內存映射的訪問
    • HFNMIENA:使能在硬件故障,NMI與FAULTMASK中斷程序里操作MPU

      MPU的四種控制模式相當于:
  • Background Region Access Not Allowed + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 0 + HFNMIENA = 0)
  • Background Region Access Not Allowed + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 0 + HFNMIENA = 1)
  • Background Region Privileged access only + MPU Disable during hard fault , NMI and FAULTMASK handlers (PRIVDEFENA = 1 + HFNMIENA = 0)
  • Background Region Privileged access only + MPU Enable during hard fault , NMI and FAULTMASK handers (PRIVDEFENA = 1 + HFNMIENA = 1)
  • 2.3、Cortex Memory Protection Unit Region 0 Settings(內存保護單元區域0設置)

    2.3.1、MPU Region

    必須使能。

    2.3.2、MPU Region Base Address(MPU區域首地址)

    內存的首地址0x24000000,從編程手冊RM0433查詢到:

    2.3.3、MPU Region Size(MPU區域大小)

    內存的大小512KB,從編程手冊RM0433查詢到:

    2.3.4、MPU SubRegion Disable

    0x00表示沒有子區域。

    2.3.5、MPU TEX field level(MPU TEX域等級)

    配置MPU_RASR寄存器的TEX段,當前只用到000(level0)與001(level1)兩種。

    2.3.6、MPU Access Permission(MPU訪問權限)

    為了使用Cache才配置的MPU,所以并不需要限制訪問。設置MPU_RASR寄存器的AP段,設置Full access(訪問不受限)。

    2.3.7、MPU Instruction Access ( MPU指令訪問)

    必須Enable。

    2.3.8、MPU Shareability Permission(MPU共享許可)

    必須DISABLE。根據安富萊的教程:

    2.3.9、MPU Cacheable Permission(MPU Cache許可)與 MPU Bufferable Permission(MPU 緩存許可)

    這兩個配置與MPU TEX field level一起決定Memory Type(內存的類型)。

    ST官方手冊對以下下四種內存類型與Cache一起使用的說明:

    安富萊的STM32H7用戶手冊對這四個內存類型與Cache也有進一步的說明,更容易理解。

    三、代碼

    3.1、案例一


    CubeMX上MPU的設置生成的代碼如下:

    void MPU_Config(void) {MPU_Region_InitTypeDef MPU_InitStruct = {0};/* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected*/MPU_InitStruct.Enable = MPU_REGION_ENABLE; //MPU RegionMPU_InitStruct.Number = MPU_REGION_NUMBER0; //Region 0 SettingsMPU_InitStruct.BaseAddress = 0x24000000; //MPU Region Base AddressMPU_InitStruct.Size = MPU_REGION_SIZE_512KB; //MPU Region SizeMPU_InitStruct.SubRegionDisable = 0x0; //MPU SubRegion DisableMPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1; //MPU TEX field levelMPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS; //MPU Access PermissionMPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE; //MPU Instruction AccessMPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE; //MPU Shareability PermissionMPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE; //MPU Cacheable PermissionMPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE; //MPU Bufferable PermissionHAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_HFNMI_PRIVDEF); //MPU Enable}

    3.2、案例二

    void MPU_Config(void) {MPU_Region_InitTypeDef MPU_InitStruct = {0};/* Disables the MPU */HAL_MPU_Disable();/** Initializes and configures the Region and the memory to be protected*/MPU_InitStruct.Enable = MPU_REGION_ENABLE;MPU_InitStruct.Number = MPU_REGION_NUMBER0;MPU_InitStruct.BaseAddress = 0x24000000;MPU_InitStruct.Size = MPU_REGION_SIZE_512KB;MPU_InitStruct.SubRegionDisable = 0x0;MPU_InitStruct.TypeExtField = MPU_TEX_LEVEL1;MPU_InitStruct.AccessPermission = MPU_REGION_FULL_ACCESS;MPU_InitStruct.DisableExec = MPU_INSTRUCTION_ACCESS_ENABLE;MPU_InitStruct.IsShareable = MPU_ACCESS_NOT_SHAREABLE;MPU_InitStruct.IsCacheable = MPU_ACCESS_CACHEABLE;MPU_InitStruct.IsBufferable = MPU_ACCESS_BUFFERABLE;HAL_MPU_ConfigRegion(&MPU_InitStruct);/* Enables the MPU */HAL_MPU_Enable(MPU_PRIVILEGED_DEFAULT);}

    3.3、案例一與案例二的區別

    案例一與案例二的區別在于MPU control mode不一樣,從而導致函數MPU_Config(void)里,最后一段代碼HAL_MPU_Enable( )的入口參數從MPU_HFNMI_PRIVDEF改為MPU_PRIVILEGED_DEFAULT。功能上的區別是程序要不要在硬件錯誤等中斷回調函數里處理MPU。

    總結

    以上是生活随笔為你收集整理的STM32H743+CubeMX-梳理MPU的设置的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。