CubeIDE Note 08: Lesson 4+. Using CCMRAM & Optimizer to Obtain Better Performance

Hsueh-Ju Wu 吳學儒
STM32CubeIDE
Published in
7 min readJun 18, 2021

教學

如何使用 CCMRAM 與優化器獲得更好的執行效能

環境

本文使用
OS: Windows x64
STM32CubeIDE Version: 1.6.1
開發板: NUCLEO-F334R8(STM32F334R8)
Low-Layer (LL) Library

教學文章列表

參考資料

UM2570. Description of STM32G4 HAL and low-layer drivers

https://www.st.com/resource/en/user_manual/dm00610707-description-of-stm32g4-hal-and-lowlayer-drivers--stmicroelectronics.pdf

RM0364. STM32F334xx advanced Arm®-based 32-bit MCUs

https://www.st.com/resource/en/reference_manual/dm00093941-stm32f334xx-advanced-armbased-32bit-mcus-stmicroelectronics.pdf

Datasheet. STM32F334x4 STM32F334x6 STM32F334x8

https://www.st.com/resource/en/user_manual/dm00108524--discovery-kit-for-stm32f3-series-with-stm32f334c8-mcu-stmicroelectronics.pdf

Section 1. 1 前情提要

在 Lesson 4. ADC 設定與應用中基本題要求同學測量ADC之轉換時間,
大部分同學應該都無法測量到與理論值相近的數據

轉換時間 = 採樣時間 + 12.5 clock cycles

根據基本題,Sampling Time 是 1.5 cycle
ADC clock = 72 MHz,所以 T_cycle = 1 / 72M = 14 (ns / cycle)

Cycle_conv = 1.5 + 12.5 = 14 (cycle)
T_conv = 14 cycle * 14 ns / cycle = 196 ns

轉換時間大約會在196 ns 左右

答案揭曉

這是由於DSP程式執行速度不夠,這個不夠不是指硬體上的不夠,
而是程式碼方面在執行上,沒有採用最有效率的做法。

解決方案

i. 直接操作暫存器,減少處理器調用函數
ii. 使用編譯器自帶的優化器,進行速度優化
iii. 使用CCMRAM(SRAM區塊),減少調用延遲

Section 1. 2 各方案比較

A. 原始速度

我們先來看原本的程式碼,是調用 Low-Layer(LL) 函數庫

執行結果

可看到 ADC 轉換時間大概是 980 ns

B. 直接操作暫存器

不使用 LL 函數庫語法,直接操作暫存器

執行結果

可看到ADC轉換時間大概是 350ns,速度已經快了至少一倍

C. 加入程式編譯優化

參考資料
https://community.st.com/s/question/0D53W000003LIl7SAG/how-do-i-change-code-optimization

Step 1.

我們在 Project Explorer 對目前專案點右鍵,選擇最後一項 Properties

Step 2.

展開 C/C++ Build,選擇 Settings,展開MCU GCC Compiler
選擇 Optimization

Step 3.

Optimization Level 設定為 Optimize for speed (-Ofast)
設定好按 Apply and Close,重新編譯即可測試

執行結果

可看到ADC轉換時間大概是 240ns,速度又提升了不少

這個方式可再進一步提升速度,可是 Live Expression會無法即時監看變數

D. 將要調用的函數變數寫入CCMRAM中

參考資料

AN4296. Use STM32F3/STM32G4 CCM SRAM
https://www.st.com/resource/en/application_note/dm00083249-use-stm32f3stm32g4-ccm-sram-with-iar-embedded-workbench-keil-mdkarm-stmicroelectronics-stm32cubeide-and-other-gnubased-toolchains-stmicroelectronics.pdf

STM32cubeIDE使用 CCMRAM - CSDN
https://blog.csdn.net/chejianhp/article/details/104089952

STM32CubeMX简单使用笔记:CCM的简单使用和简单分析 https://cstriker1407.info/blog/stm32cubemx-note-ccm-use/

Flash — 成大資工 wiki
http://wiki.csie.ncku.edu.tw/embedded/Flash

Using CCM Memory — OpenSTM32 Comunity
https://www.openstm32.org/Using+CCM+Memory?structure=Documentation

Step 1. 增加 CCMRAM 分區

打開 STM32F334R8TX.ld 檔案

STM32F3348-DISCO (綠板/藍板): STM32F334C8TX
F334-NUCLEO(白板): STM32F334R8TX

在最後一個大括號前加入以下程式

Step 2. 增加啟動時 CCMRAM 分區搬移

打開 startup_stm32f334r8tx.s

找到movs那開始取代成下面程式碼
FillZerobss: 有重覆到記得要刪除

Step 3. Marco 指定 Section

終於可以來使用CCMRAM了,打開 stm32f3xx_it.c

並在要放進CCMRAM的函數或變數前加上 CCMRAM,如下

執行結果

可看到ADC轉換時間大概是 196ns,與理論結果一致
到此大概就完整逼出MCU性能了

--

--