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
  • 基于STM32结合CubeMX学习Free-RT-OS的源码之信号量与互斥量

    目录 CUBEMX上的配置以及使用 信号量 互斥量 CUBEMX上的配置以及使用 信号量与互斥量都是从队列中衍生出来的 xff0c 他们是一种特殊的队列 不同的地方在于 他们不含有队列的数据部分 xff0c 只有队列结构体 定义属性 xff
  • DSP中GPIO位域

    在TMS320F2812中 xff0c 对于程序中寄存器的名称是如何映射到物理地址的 xff0c 这里做一下详细的讲解 主要应用到三个文件 xff1a CMD h DSP28 GLobalVariableDefs c xff0c 其中CMD
  • TI DSP的中断

    F28069的中断数是96个 xff0c 分为12组 The PIE block can support 96 individual interrupts that are grouped into blocks of eight Each
  • 耳机降噪功能(ANC、ENC、CVC、DSP)

    被动式降噪也称物理降噪 xff0c 被动式降噪是指利用物理特性将外部噪声与耳朵隔绝开 xff0c 主要通过耳机的头梁设计得紧一些 耳罩腔体进行声学优化 耳罩内部放上吸声材料 等等来实现耳机的物理隔音 被动降噪对高频率声音 xff08 如人声
  • STM32输出SPWM波,HAL库,cubeMX配置,滤波后输出1KHz正弦波

    SPWM波 对于功率方向 输出SPWM波是必须要掌握的 工程 stm32生成spwm代码Keil工程链接资源 引用spwm波定义 PWM波形就是指占空比可变的波形 SPWM波形是指脉冲宽度按正弦规律变化且和正弦波等效的PWM波形 两者的区别
  • DSP数据安全平台

    数据安全平台 xff08 DSP xff0c Data Security Platforms xff09 的概念来源于Gartner的 2021数据安全技术成熟度曲线 xff0c DSP定义为以数据安全为中心的产品和服务 xff0c 旨在跨
  • 【DSP】TMS320F28335的ADC模块

    一 功能说明 12位内建采样保持的模数转换器 模拟输入电平 0 3V 16个转换通道 最快转换时钟频率12 5MHz 奈奎斯特定则 25MHz最高能采样12 5MHz的信号 多触发源 软件 ePWM和GPIO 两种采样模式 级联和双通道模式
  • STM32HAL库CubeMX配置ADC多通道选择读取(非DMA)

    CubeMX配置ADC多通道选择读取 非DMA 最近在做项目时需要stm32f103分别读取角度传感器值和电压值 采用HAL库 CubeMX方式并没有找到像标准库一样直接可以调用ADC RegularChannelConfig 函数选择AD
  • DSP-滤波器稳定性与极点 &数字滤波器&TMS320C67XX dsp启动过程

    DSP技术 https www cnblogs com kanite category 1318278 html 滤波器稳定性与极点 在数字信号处理种 系统的稳定性是一个很重要的问题 比如说在滤波器的设计种 都要求系统必须稳定 否则是无法实
  • DSP相关笔记_1:LaunchXL-F28379D的简单教程系列(一)GPIO输出

    LaunchXL F28379D的简单教程系列 一 GPIO输出 本文分为函数库和寄存器两种方法 注 这是本人关于Ti的C2000系列的学习笔记 所用工具有官方的开发软件CCS10版本 帮助文库以及函数库软件controlSUITE 硬件部
  • 如何使实时数据采集处理系统保持数据的高速传输

    如何使实时数据采集处理系统保持数据的高速传输 1引言 当前 越来越多的设计应用领域要求具有高精度的A D转换和实时处理功能 在实时数据采集处理系统设计中 一般需要考虑数据采集以及对采集数据的处理 而对于大数据量的实时数据采集处理系统来说 保
  • (多核DSP快速入门)5.SYS/BIOS的使用实例分析

    原创文章 转载请注册来源http blog csdn net tostq 系列教程目录 http blog csdn net tostq article details 51245979 SYS BIOS是一个可扩展的实时内核 或者说是操作
  • 深入理解采样定理 + Matlab 仿真 Sa 函数的采样与恢复

    建议配合国宝老师的视频食用 信号与线性系统分析 吴大正 郭宝龙 文章目录 1 采样的说明 1 为什么要取样 2 什么是取样 2 采样定理 1 为什么要有奈奎斯特频率 2 什么是采样定理 3 信号的恢复 4 Matlab的Sa函数取样仿真 1
  • ISP DSP的区别

    ISP 是Image Signal Processor 的简称 也就是图像信号处理器 而DSP是Digital Signal Processor 的缩写 也就是数字信号处理器 ISP一般用来处理Image Sensor 图像传感器 的输出数
  • 【11】STM32·HAL库开发-STM32CubeMX简介、安装

    目录 1 STM32CubeMX简介 了解 2 STM32CubeMX安装 了解 2 1STM32CubeMX软件获取 2 1 1获取Java软件 2 1 2获取STM32CubeMX软件 2 2搭建Java运行环境 2 3安装STM32C
  • CCS5.2.1/5.5 错误-No source available for main()

    1 错误现象 在CCS5 2 1开发环境中从别处导入项目并编译完成后 下载程序时出现如下图所示错误 备注 当前使用的compiler版本为C6000v7 4 14 2 解决办法 进入项目属性设置页面 可以看到当前的调试模式为 Suppres
  • CUBEMX+HAL库实现STM32串口(不定长度)收发

    CUBEMX HAL库实现STM32串口接收 不定长度 并发送 首先新建一个CUBEMX工程 选择你自己开发板的芯片型号 设置时钟和串口 设置时钟为72MHZ 设置串口中断 点击小齿轮生成KEIL5的工程 设置工程名称及存放位置 点击Ope
  • HXDSP2441-地址空间转换

    地址空间转换 地址空间本身很简单 但由于HXDSP2441同时有DSP核和CPU核 且二者寻址方式不同 导致编程中会有歧义 DSP核采用字地址编址方式 CPU核和总线空间内都采用字节地址编址方式 而且文档中所涉及的所有寄存器地址及偏移等均为

随机推荐

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

    由于自工作依赖一直专注于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平台中存储容量最