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內存:
為什么使用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有四種控制模式:
MPU Control Mode選項其實就是配置MPU_CTRL寄存器:
- PRIVDEFENA :使能特權軟件對默認內存映射的訪問
- HFNMIENA:使能在硬件故障,NMI與FAULTMASK中斷程序里操作MPU
MPU的四種控制模式相當于:
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的設置生成的代碼如下:
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的设置的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: RTX5 | 互斥量01 - 互斥量的使
- 下一篇: cad在布局怎么调比例_大神们都在用的9