STM32H750VBT6的DSP使用的学习——基于CubeMX

2023-05-16

前言

人生如逆旅,我亦是行人。


1、STM32H7的DSP功能介绍

  • (STMicroelectronics,简称ST)推出新的运算性能创记录的H7系列微控制器。新系列内置STM32平台中存储容量最高的SRAM(1MB)、高达2MB闪存和种类最丰富的通信外设,为实现让智慧更高的智能硬件无处不在的目标铺平道路。

  • STM32H7系列沿用STM32F7系列的ARM Cortex-M7处理器内核,是业界首款采用40nm闪存制造工艺的Cortex-M7微控制器,还是首款运行频率达到400MHz的微控制器,这些重大改进之处使得STM32H743能够创下运算性能测试856D的记录,EEMBC CoreMark 测试取得2010分。

  • DSP功能是内核自带的:

其中较为重要的两个设计单元:

  • DSP(Digital Signal Processing):数字信号处理

    DSP单元集成了一批专用的指令集(主要是SMID指令和快速MAC乘积累加指令),可以加速数字信号处理的执行速度。

  • FPU(Float Point Unit):浮点运算器

    Cortex-M7内核支持双精度浮点,可以大大加速浮点运算的处理速度。


下面是Cortex-M3,M4和M7的指令集爆炸图:

在这里插入图片描述

  • M4 和 M7 系列有相同的 DSP 指令集;
  • M7 相比 M4 系列要多一些浮点指令集;
  • 同时这里要注意一个小细节,浮点指令都是以字符 V 开头的。通过这点,我们可以方便的验证是否正确开启了 FPU (MDK 或者 IAR 调试状态查看浮点运算对应的反汇编是否有这种指令);

不同 M 内核的 DSP 性能比较:

在这里插入图片描述

  • Cortex-M7内核的DSP性能最强;
  • Cortex-M3,M4和M33是中等性能,其中M3最弱;
  • Cortex-M0,M0+和M23性能最弱

二、ARM 提供的 CMSIS-DSP 库

为了方便用户实现DSP功能,ARM专门做了一个DSP库CMSIS-DSP,主要包含以下数字信号处理算法:

  • BasicMathFunctions

    在这里插入图片描述

    提供了基本的数据运算,如加减乘除等基本运算,以_f32结尾的函数是浮点运算,以_q8, _q15, _q31,结尾的函数是定点运算

  • FastMathFunctions

    在这里插入图片描述

    快速数学函数,提供 sin ,cos 以及平方根 sqrt 的运算。

  • ComplexMathFunctions

    在这里插入图片描述

    复杂数学函数,主要是向量、求模等运算。

  • FilteringFunctions

    在这里插入图片描述

    过滤功能,主要是滤波函数,如 IIR、FIR、LMS等。

  • MatrixFunctions

    在这里插入图片描述

    矩阵函数,主要是矩阵的运算。

  • TransformFunctions

    在这里插入图片描述

    转换函数,变换功能,包括复数FFT(CFFT),复数FFT逆运算(CIFFT),实数FFT(RFFT),实数 FFT 逆运算。

  • ControllerFunctions

    在这里插入图片描述
    控制器功能,主要是 PID 控制函数和正余弦函数。

  • StatisticsFunctions

    在这里插入图片描述
    统计函数,求平均值,最大值,最小值,功率,RMS等。

  • SupportFunctions

    在这里插入图片描述
    支持功能函数,如数据拷贝,Q格式和浮点格式相互转换。

  • CommonTables


三、获取 DSP 库的学习资料

在 Keil MDK 版本中,DSP 库集成与 runtime environment 之中,可以在 Keil 的安装目录中找到。

  • 通常路径:F:\Keil5\ARM\PACK\ARM\CMSIS\5.8.0\CMSIS\DSP

  • 帮助文件位于:F:\Keil5\ARM\PACK\ARM\CMSIS\5.8.0\CMSIS\Documentation\DSP\html\index.html

  • 官方例程:F:\Keil5\ARM\PACK\ARM\CMSIS\5.8.0\CMSIS\DSP\Examples\ARM

    在这里插入图片描述


四、利用 CubeMX 进行配置

  • 现在开始我们的主要部分,进行 CubeMX 的配置。
  • 我所使用的开发板是 STM32H7 的最小系统板:STM32H750VBT6,下面有请主角闪亮登场。
    在这里插入图片描述
  • 接下来进行 CubeMX 的主要配置:

1、新建工程

在这里插入图片描述
在这里插入图片描述

2、进行各种配置

  • 时钟配置

    开启时钟:
    在这里插入图片描述
    配置时钟树:
    在这里插入图片描述

  • 串口配置

    这里我所使用 USB 的虚拟串口(virtual COM):
    在这里插入图片描述
    在这里插入图片描述

  • 原理图上的硬件与 CubeMX 上的引脚对应:
    在这里插入图片描述
    在这里插入图片描述

  • 另外配置完 USB 虚拟串口之后,还要进行一下时钟树的配置:
    在这里插入图片描述

  • 调试配置在这里插入图片描述

  • DSP 库的添加:

    选中 select components
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

3、生成代码

在这里插入图片描述
在这里插入图片描述

4、Keil 中的配置

在这里插入图片描述

  • 添加宏:
,__FPU_PRESENT=1,__FPU_USED=1,ARM_MATH_CM7,__CC_ARM

在这里插入图片描述

  • 添加路径:
    在这里插入图片描述
    在这里插入图片描述

5、工程配置

  • 添加如下库文件:
    在这里插入图片描述
    在这里插入图片描述
  • 添加 fft 的官方例程:
    在这里插入图片描述
    在这里插入图片描述

6、添加代码

  • USB 的虚拟串口:
#include "usbd_cdc.h"
#include "stdarg.h"

#define CONSOLEBUF_SIZE 256

static char Uart_buf[CONSOLEBUF_SIZE];
extern USBD_HandleTypeDef hUsbDeviceFS;

void PrintfDebugUSB(const char *fmt, ...)
{
	va_list args;
	va_start(args, fmt);
	int length = vsnprintf(Uart_buf, sizeof(Uart_buf) - 1, fmt, args);
	va_end(args);
	
	HAL_Delay(1);
	USBD_CDC_SetTxBuffer(&hUsbDeviceFS, (uint8_t *)Uart_buf, length);
	USBD_CDC_TransmitPacket(&hUsbDeviceFS);
}
  • USB 的重新枚举函数:
/*USB 重新枚举函数*/
void USB_Reset(void)
{
    GPIO_InitTypeDef GPIO_InitStruct = {0};
	__HAL_RCC_GPIOA_CLK_ENABLE();
	GPIO_InitStruct.Pin = GPIO_PIN_12;
	GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
	GPIO_InitStruct.Pull = GPIO_NOPULL;
	GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
	HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_RESET);
	HAL_Delay(100);
	HAL_GPIO_WritePin(GPIOA,GPIO_PIN_12,GPIO_PIN_SET);
}
  • 调用 USB 的复位:
  /* USER CODE BEGIN SysInit */
	
	USB_Reset();	//USB复位
	
  /* USER CODE END SysInit */
  • 使用 fft 的例子:
#include <stdio.h>

#include "arm_math.h"
#include "arm_const_structs.h"

#define TEST_LENGTH_SAMPLES 2048

extern float32_t testInput_f32_10khz[TEST_LENGTH_SAMPLES];//only have 1024
static float32_t testOutput[TEST_LENGTH_SAMPLES/2];
uint32_t fftSize = 1024;
uint32_t ifftFlag = 0;
uint32_t doBitReverse = 1;

/* 库的最大能量发生时的参考索引 */
uint32_t refIndex = 213, testIndex = 0;
  • 在主函数中添加以下代码:
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  
	arm_status status;
	float32_t maxValue;
	
	status = ARM_MATH_SUCCESS;
	
	/* Process the data through the CFFT/CIFFT module */
	arm_cfft_f32(&arm_cfft_sR_f32_len1024, testInput_f32_10khz, ifftFlag, doBitReverse);
	
	/* Process the data through the Complex Magnitude Module for
	calculating the magnitude at each bin */
	arm_cmplx_mag_f32(testInput_f32_10khz, testOutput, fftSize);
	
	/* Calculates maxValue and returns corresponding BIN value */
	arm_max_f32(testOutput, fftSize, &maxValue, &testIndex);
	
	if (testIndex !=  refIndex)
	{
		status = ARM_MATH_TEST_FAILURE;
	}
	
	/* ----------------------------------------------------------------------
	** Loop here if the signals fail the PASS check.
	** This denotes a test failure
	** ------------------------------------------------------------------- */
	
	if ( status != ARM_MATH_SUCCESS)
	{
		while (1);
	}
	
	while (1)
	{
		//printf("hello\n"); 
		HAL_Delay(5000);
		for(int i =0;i<1024;i++)
		{
			PrintfDebugUSB("%f \r\n",testOutput[i]);
			HAL_Delay(10);
		}
		while(1);
	}
  /* USER CODE END 3 */	
}

7、使用串口助手接收打印数据

在这里插入图片描述

8、用Excel整理我们接收到的数据转换为折线

在这里插入图片描述
以上便完成了我们对 DSP 库中的 fft 例子的调用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32H750VBT6的DSP使用的学习——基于CubeMX 的相关文章

  • DSP RTB SSP

    作者 xff1a 炸乌鸦面 链接 xff1a https www zhihu com question 23458646 answer 130631448 来源 xff1a 知乎 著作权归作者所有 商业转载请联系作者获得授权 xff0c 非
  • DSP Group, Inc. <DSPG>

    公司官网 xff1a DSP Group Leading global provider of wireless chipset solutions About DSP Group DSP Group Inc NASDAQ DSPG is
  • CubeMX 配置PWM使用DMA,生成Dshot600的协议

    看到电调支持Dshot125 600的协议 xff0c 想自己做一个支持Dshot协议的驱动 xff0c 所以研究了一下 xff0c 如何利用精确的PWM产生Dshot协议 先看结果 xff01 图中为油门值为1500的时候的输出的Dsho
  • DSP CCS 12.00运用, 产生正弦波的图像 芯片:F28335

    1 首先建立新的项目 工程 2 参数选择 3 设置数据 保证与芯片得连接 4 整理思路 信号频率 1000 HZ 采样频率 20000 HZ 采样点数 128 5 代码 头文件的定义 include stdio h include math
  • CCS6 配置工程头文件路径方法

    软件版本 Code Composer Studio Version 6 1 3 00034 配置头文件 给工程配置 右键工程名字没然后选择Properties 选择CCS Build gt Cxxxx Compiler gt Include
  • TI DSP TMS320C66x学习笔记之VLIB测试数据(三)

    VLIB是TI提供的针对C6x优化过的视觉库 下载地址 http software dl ti com libs vlib latest index FDS html 提供40多个核心函数 主要实现以下功能 Background Model
  • cubemx hal stm32 舵机 可减速 任意位置停止 驱动代码

    CubeMX配置 对于 STM32 F407VE 这里的84是来自APB1那路2倍频得到 代码部分 两个舵机都是180度的 servo c include servo h include tim h include stdio h IO u
  • 傅里叶变换的实质--正交之美

    引 最近在搞一个音频解码器 将随意录制好的声音按照不同的频率分离出不同的音频流 然后推到不同的音箱中 如果再考虑一下音场的谐性 那就是一个N 1声道的解码系统了 我只是想在女儿 或者儿子 出生之前为她做点事情 以便能最终做出个东西送给她 或
  • 如何使实时数据采集处理系统保持数据的高速传输

    如何使实时数据采集处理系统保持数据的高速传输 1引言 当前 越来越多的设计应用领域要求具有高精度的A D转换和实时处理功能 在实时数据采集处理系统设计中 一般需要考虑数据采集以及对采集数据的处理 而对于大数据量的实时数据采集处理系统来说 保
  • 【转】DSP 缓存机制

    本文主要以DSP讲解cache原理 但原理与CPU是相通的 故转载 原文地址 https blog csdn net qq 39376747 article details 112794096 文章目录 DSP 缓存机制 1 Cache基础
  • 【音效处理】Reverb 混响算法简介

    系列文章目录 Delay Line 简介及其 C C 实现 LFO 低频振荡器简介及其 C C 实现 音效处理 Delay Echo 简介 音效处理 Vibrato 简介 文章目录 系列文章目录 一 混响 二 人工混响 三 数字混响算法 3
  • 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用 信号与线性系统分析 吴大正 郭宝龙 文章目录 1 采样的说明 1 为什么要取样 2 什么是取样 2 采样定理 1 为什么要有奈奎斯特频率 2 什么是采样定理 3 信号的恢复 4 Matlab的Sa函数取样仿真 1
  • CCS8.0和XDS100V3仿真器连接目标板失败的解决办法

    对于新手 要想顺利的连接上目标板不是一个容易的事 所以我这里记录一下我这个新手为了连接目标板的折腾过程 我的开发平台 WIN10系统CCS8 0 目标板芯片 TMS320VC5509A 仿真器 研旭XDS100V3 已确定的前提条件 CCS
  • STM32CubeMX 生成工程步骤图文说明

    本文也适合STM32CubeMX 支持的所有芯片的设置 调整文章结构 添加图文说明 2022 2 增加其他应用章节 增加 ADC 设置说明 2023 3 考虑到增加的内容越来越多 修改文章标题 增加PWM设置说明 2023 4 增加 DAC
  • [培训-DSP快速入门-8]:C54x DSP汇编语言之寻址方式

    作者主页 文火冰糖的硅基工坊 https blog csdn net HiWangWenBing 本文网址 https blog csdn net HiWangWenBing article details 119023151 目录 第1章
  • CCS5.2.1/5.5 错误-No source available for main()

    1 错误现象 在CCS5 2 1开发环境中从别处导入项目并编译完成后 下载程序时出现如下图所示错误 备注 当前使用的compiler版本为C6000v7 4 14 2 解决办法 进入项目属性设置页面 可以看到当前的调试模式为 Suppres
  • 怎样确定AD采样频率,跟转换时间有关吗。在单片机中如何设置采样频率。

    转自百度知道https zhidao baidu com question 295921974 html 采样频率的意思是单位时间的采样次数 要确定采样频率 应该根据被测模拟量的变化动态以及测量需求决定 对于特定的硬件环境以及转换位数来说
  • SD卡系列之---SD初始化(SPI)

    SD卡分为SDIO模式与SPI模式 SDIO模式使用SD总线协议 使用4根数据线进行数据传输 SPI使用1收1发2根数据线数据传输 理论上SDIO模式会比SPI模式速度快4倍 但SDIO模式还牵扯到CRC校验位的计算 所以 如果使用CPU有
  • HXDSP2441-地址空间转换

    地址空间转换 地址空间本身很简单 但由于HXDSP2441同时有DSP核和CPU核 且二者寻址方式不同 导致编程中会有歧义 DSP核采用字地址编址方式 CPU核和总线空间内都采用字节地址编址方式 而且文档中所涉及的所有寄存器地址及偏移等均为
  • 纯国产DSP,QX320F28335,自研内核指令集,主频150MHz,自研工具链,硬件兼容TMS320F28335

    32位单核CPU 主频150MHz flash 1M SRAM 500KB 单精度浮点运算FPU 3个4M精度12位的ADC 12个ePWM 6个HRPWM 150ps

随机推荐

  • 分享一下工作以来我看过计算机书籍

    由于自工作依赖一直专注于linux 下的c c 43 43 编程工作 xff0c 所以 xff0c 我的书籍也大的都是这方 这边书尽管很经典 xff0c 但是我的能力实在有限 xff0c 只把数据结构的那点看了一下 xff0c 其他的 看的
  • 51单片机定时器初值计算详解

    前言 xff1a 本文详细介绍了51单片机学习过程中定时器的初值计算问题以及相关概念 xff0c 力求把每一个学习过程中的可能会遇到的难点说清楚 xff0c 并举相关的例子加以说明 学习完毕 xff0c 又顺手利用刚学到定时器的相关知识写了
  • STM32平台下官方DMP库6.12超详细移植教程

    前记 Motion Driver官方库 xff1a Motion Driver 6 12 STM32工程源码 xff1a STM32F103C8 软件MPU6050 xff08 DMP xff09 MPU6050软件I2C驱动 xff0c
  • STM32F103C8-平衡小车笔记

    STM32F103C8 平衡小车笔记 1 PID的作用 xff08 1 xff09 比例项 xff1a 提高响应速度 xff0c 减小静差 xff08 2 xff09 积分项 xff1a 消除稳态误差 xff08 3 xff09 微分项 x
  • 嵌入式Linux系统开发笔记(十四)

    U Boot环境变量 uboot 中有两个非常重要的环境变量 bootcmd 和 bootargs xff0c bootcmd 和 bootagrs 是采用类似 shell 脚本语言编写的 xff0c 里面有很多的变量引用 xff0c 这些
  • 嵌入式Linux系统开发笔记(十五)

    Linux内核启动验证 5 1 编译内核 span class token comment 清除工程 span span class token comment make distclean span span class token co
  • 基于ROS搭建机器人仿真环境

    别人的发复现及经验 https blog csdn net qq 38620941 article details 125321347 gazebo默认仿真环境 1 gazebo models 是系统下gazebo放置模型库的默认位置 2
  • 嵌入式Linux系统开发笔记(十六)

    根文件系统rootfs启动验证测试 接下来我们使用测试一下前面创建好的根文件系统 rootfs xff0c 测试方法使用 NFS 挂载 6 1 检查是否在Ubuntu主机中安装和开启了NFS服务 xff08 特别注意 xff1a nfs 配
  • 安卓5.0以上7.0以下使用Termux

    参考 xff1a https zhuanlan zhihu com p 400507701 说明 xff1a Termux支持5 0以上的安卓系统 Termux7 3版本之后 xff0c 仅支持7 0以上的安卓系统 1 安装Termux 设
  • 关于DSP的CCS6.0平台下的工程搭建(完全可移植)

    本工程以CCS6 0下新建TMS320F28335工程为例 xff0c 其他系列处理器工程搭建类似 xff0c 参考本例即可 工程搭建用到的F2833x TI官方库文件 下载链接 也可直接参考笔者搭建好CCS6 0的工程 下载链接 所建工程
  • STM32Fxx JTAG/SWD复用功能重映射

    问题描述 xff1a 在实验室调车过程中 xff0c 遇到的一个问题 xff1a 为了每次下载程序方便 xff0c 队员们往往会把 Jlink 插在板子上 xff0c 可是在调车过程中发现 xff0c 有时程序会莫名死掉 xff0c 而同样
  • VS2012编译RTKLIB——GNSS定位开源库

    RTKLIB 开源库 有着强大的 GPS 数据实时和后处理功能 xff0c 由于 笔者的毕业设计中需要对GPS 载波相位观测量进行 RTK 解算 xff0c 故而 xff0c 对 RTKLIB 开源库进行了学习与研究 RTKLIB 提供了很
  • 51单片机串行口波特率计算

    1 工作方式介绍 xff1a 方式 0 xff1a 这种工作方式比较特殊 xff0c 与常见的微型计算机的串行口不同 xff0c 它又叫 同步移位寄存器输出方式 在这种方式下 xff0c 数据从 RXD 端串行输出或输入 xff0c 同步信
  • 数码管显示问题总结

    1 数码管显示原理 我们最常用的是七段式和八段式 LED 数码管 xff0c 八段比七段多了一个小数点 xff0c 其他的基本相同 所谓的八段就是指数码管里有八个小 LED 发光二极管 xff0c 通过控制不同的 LED 的亮灭来显示出不同
  • 单片机与嵌入式linux 比较

    MCU门槛低 xff0c 入门容易 xff0c 但是灵活 xff0c 其实对工程师的软硬件功底要求更高 xff0c 随着半导体的飞速发展 xff0c MCU能实现很多匪夷所思匪夷所思的功能 xff0c 比如 xff0c 使用GPIO模拟1个
  • rtk 精确定位 简介

    RTK又称载波相位差分 xff1a 基准站通过数据链及时将其载波观测量及站坐标信息一同传送给用户站 用户站接收GPS卫星的载波相位与来自基准站的载波相位 xff0c 并组成相位差分观测值进行及时处理 xff0c 能及时给出厘米级的定位结果
  • STM32开发利器:STM32CubeMX

    这篇博客篇幅不长 xff0c 主要是为大家介绍ST公司推出的STM32CubeMX开发工具 xff0c 当成下周更新STM32 10个项目工程的预备篇 xff0c 同时FPGA FPGA 20个例程篇 xff1a 8 SD卡任意地址的读写
  • ROS命名空间

    ROS命令空间是一个很重要的内容 xff0c 官方文档 xff1a http wiki ros org Names 分为三类 xff1a relative xff0c global xff0c private 下边是一个官网给的示例 Nod
  • STM32CubeMX关于添加DSP库的使用

    前言 人生如逆旅 xff0c 我亦是行人 一 介绍 STM32 系列基于专为要求高性能 低成本 低功耗的嵌入式应用专门设计的 ARM Cortex M3 内核 而 DSP 应该是 TMS320 系列 xff0c TMS320 系列 DSP
  • STM32H750VBT6的DSP使用的学习——基于CubeMX

    前言 人生如逆旅 xff0c 我亦是行人 1 STM32H7的DSP功能介绍 xff08 STMicroelectronics xff0c 简称ST xff09 推出新的运算性能创记录的H7系列微控制器 新系列内置STM32平台中存储容量最