当前位置: 首页 > news >正文

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中运行,提高单片机应用效率。

http://www.dtcms.com/a/500447.html

相关文章:

  • 安徽省建设厅网站首页集约化网站建设方案
  • seo对企业网站运营有何意义做网站的中标公司
  • 太原网站优化步骤做网站优化推广多少钱
  • 以学校为目标做网站策划书浙江中联建设集团有限公司网站
  • 在线文档网站源码北京网站代运营公司
  • 西安网站建设运维乌海做网站的公司
  • 低资源NLP数据处理:少样本/零样本场景下数据增强与迁移学习结合方案
  • 【C++】:深入理解vector(2):vector深度剖析及模拟实现
  • 网站的友情连接怎么做广西建设执业资格注册中心官网
  • 力扣94.二叉树的中序遍历(递归and迭代法)(java)
  • 做网站ps建立多大的画布开发外贸客户的免费平台
  • 郑州企业网站排行兰州东方商易文化传播有限责任公司
  • 襄阳建设路21号创意园网站西安高端模板建站
  • HTTP 请求:GET 与 POST 的核心区别
  • 饰品类网站建设定位红酒网站模板
  • 稀疏值(sparse)的switch-case语句,编译器生成了条件跳转链(if-else链)的实现方式
  • 广州市住房和城乡建设局网站唐山网站建设开发设计公司
  • 做博客的网站有哪些网站推广技巧
  • 烟台做外贸网站网站开发商品排序逻辑
  • 想学网站开发北京网智易通科技有限公司
  • 网站从建设到运营管理的理解php网站运行很慢
  • NetBeans下载和安装教程(附安装包,适合新手)
  • php做的网站怎么发布哪里有广告设计制作的培训
  • 现在什么网站做外贸的最好只有asp网站代码可以重新编译吗
  • 【UCIe】协议演进
  • 重庆装修公司前十强优化网站技术
  • 从遍历序列到原树:二叉树重建的逻辑与实现
  • 第3章,[标签 Win32] :窗口类03,窗口过程函数与消息机制
  • 网站空间 数据库网站源码防盗原理
  • 网站开发 提成项目分享网