STM32G474单片机开发入门(十六)CCM SRAM详解及实战
文章目录
- 一.概要
- 二.CCM SRAM基本概念与地址空间
- 三.CCM SRAM代码如何配置
- 四.CubeMX配置工程
- 1. 硬件准备
- 2.创建CubeMX工程
- 3.复制前面的工程,配置main文件在CCM SRAM
- 4.实验效果
- 五.小结
一.概要
STM32G4系列微控制器的CCM(Core Coupled Memory)是一种紧密耦合到Cortex-M4内核的特殊SRAM,适用于中断服务程序(ISR)、DSP算法缓冲区等低延迟需求场景,关键代码(如中断服务程序)在CCM中执行速度可提升约20%,由于具有更好的运行速度,所以FPU运算数据优先存放于CCM,减少总线竞争。
二.CCM SRAM基本概念与地址空间
CCM是通过AHB与Cortex-M4内核连接的独立SRAM,物理上区别于主SRAM。为CPU提供对关键代码/数据的高速访问(延迟低于主SRAM),CCM在单片机框图上的位置如下图所示。
STM32G474RET6的CCM RAM为32KB,固定在0x10000000~0x10007FFF范围的地址,如下图所示。
三.CCM SRAM代码如何配置
我们以Keil5开发环境为例,介绍下如何把一段代码放置在CCM SRAM,一般有两种方式。
1.把一个函数放入到CCM SRAM
步骤1.在分散加载scatter文件中定义一个新区域(ccmram),通过指定CCM SRAM的起始地址和结束地址,向链接器指示,具有ccmram属性的部分必须放置在CCM SRAM区域中。
步骤2.去掉原先默认的打勾,使用我们修改过的分散加载文件。
步骤3.将要从CCM SRAM中执行的代码部分放置在上述定义的ccmram部分中,在函数声明上方添加属性关键字。
通过以上步骤,这个函数就会在CCM SRAM中运行了。
2.把一个文件放入到CCM SRAM
步骤1.在项目选项窗口([项目]>[选项]>[目标])中将CCM SRAM定义为内存区域。
步骤2. 右键点击文件,将其放入CCM SRAM中,并选择[选项]。
步骤3.在[内存分配]菜单中选择CCM SRAM区域。
以上步骤就把main.c放在CCM SRAM中运行了。
四.CubeMX配置工程
1. 硬件准备
STLINK接STM32G474RET6开发板,STLINK接电脑USB口。
2.创建CubeMX工程
如下图所示,打开STM32CubeMX软件,新建工程。
如下图所示,Part Number处输入STM32G474RE,再双击就创建新的工程。
如下图所示,配置下载口引脚,PA13为SWD的SWDIO脚,PA14为SWD的SWCLK脚。
如下图所示,可以查看STM32G474RET6开发板原理图,PC8连接LED灯,所以配置PC8为GPIO输出,推挽输出。
如下图所示,配置系统主频170Mhz,使用内部16MHZ晶振。
如下图所示,配置工程文件名,保存路径,KEIL5工程输出方式。
如下图所示,生成工程。
如下图所示,增加代码,主要用来计算运行一段浮点计算比较多的代码的运行时间。
增加时间计数,计算时间差,就是前面循环运行的时间。
主要代码如下
//定义一个结构体,包含多个浮点变量
struct Dcdc_Loop
{//环路参数float error_CLA;//环路误差float e_n1;// error input (e(t-1))---环路误差--一阶float y1_n; // proportional output (y1(t))//环路输出float y1_n1; // proportional output (y1(t-1))//环路输出--一阶/* DPI coeffs and terms *///数字PI环参数float i_n0; // integral output (t0)//整型输出float i_n1; // integral output (t-1)//整型输出一阶float y2_n; // proportional + integral output (y2(t))//数字PI环输出float y2_n1; // proportional + integral output (y2(t-1))//数字PI环输出一阶/* Phase Lag network *///相位滞后网络float y3_n;// (y2(t))--网络输出float y3_n1;// (y2(t-1))//网络输出一阶float y3_n2;// (y2(t-2))//网络输出二阶/* DLP2 *///数字低通滤波2参数float y4_n; // DLP2 output (y4(t))//低通2输出---环路最终输出(电压)--Q11float y4_n1; // DLP2 output (y4(t-1))//低通2输出一阶float y4_n2; // DLP2 output (y4(t-2))//低通2输出二阶float compensator_error;//(补偿)误差float DemandVoltage_CLA;//输出电压(环路输出的)要求值--Q11--[40,62]};/* USER CODE END PM *//* Private variables ---------------------------------------------------------*//* USER CODE BEGIN PV */
struct Dcdc_Loop DcdcLoop;float test_vaule = 0;
//编写一个函数,里面包含各种浮点运算,加法乘法等void test_loop(void)
{int i=100;while(i){i--;__asm("NOP");}if(test_vaule<1.0f){test_vaule += 0.001f;}else{test_vaule = 0.0f;}DcdcLoop.error_CLA = test_vaule;DcdcLoop.y1_n = (DcdcLoop.error_CLA * 5.0f) - (DcdcLoop.e_n1 * 6.0f); // Q18 resultDcdcLoop.i_n0 = (7.0 * (DcdcLoop.y1_n + DcdcLoop.y1_n1))*0.0078125 + DcdcLoop.i_n1;if(DcdcLoop.i_n0 < 10.0){DcdcLoop.i_n0 = 10.0;}if(DcdcLoop.i_n0 > 100.0){DcdcLoop.i_n0 = 100.0;}DcdcLoop.e_n1 = DcdcLoop.error_CLA;DcdcLoop.y1_n1 = DcdcLoop.y1_n;DcdcLoop.i_n1 = DcdcLoop.i_n0;DcdcLoop.y2_n1 = DcdcLoop.y2_n;DcdcLoop.y3_n2 = DcdcLoop.y3_n1;DcdcLoop.y3_n1 = DcdcLoop.y3_n;DcdcLoop.y4_n2 = DcdcLoop.y4_n1;DcdcLoop.y4_n1 = DcdcLoop.y4_n;
}
int main(void)
{/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();//SysTick配置成1ms中断/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();//16M内部晶振,170MHZ系统主频/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();//PC8引脚配置成输出/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){/* USER CODE END WHILE *//* USER CODE BEGIN 3 */HAL_Delay(200);//等待200msRunTimeOld=CurrentTime;//获取当前时间,SysTick计数for(int j=0;j<10000;j++)//调用测试函数{test_loop();test_loop();test_loop();test_loop();test_loop();test_loop();test_loop();test_loop();HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_8);}if(CurrentTime>RunTimeOld ){RunTime=CurrentTime-RunTimeOld;//通过计算时间差,就知道上面代码运行的时间}}/* USER CODE END 3 */
}
3.复制前面的工程,配置main文件在CCM SRAM
前面的Keil5工程拷贝一个新的,参照前面第三章介绍的3.2把一个文件放入到CCM SRAM,把main.c文件放在CCM SRAM中。
4.实验效果
通过调试运行,查看RunTime变量,可以看到在CCM SRAM中运行的代码时间小很多。
五.小结
stm32g4单片机在对运行时间效率有要求的场合,比如浮点运算等可以考虑代码放在CCM SRAM中运行,提高单片机应用效率。