【STM32】STM32G系列使用CORDIC模块加速计算

1.前言

STM32G431系列产品内置了CORDIC运算单元,可以用来加速数学计算,如三角函数、取模、开方等。适合大量数据进行相同的运算操作。配合DMA可以大大节省CPU计算开销。
在这里插入图片描述

2.CubeMX配置

使用CORDIC模块无需配置参数,若采用DMA方式则只需配置DMA读写通道,配置如下
在这里插入图片描述

3.相关代码

在代码中对cordic模块进行初始化,主要是完成对CORDIC_ConfigTypeDef结构体的配置。
声明结构体变量

CORDIC_ConfigTypeDef sCordicConfig;

具体配置函数如下:

void cordic_config(void)
{
	sCordicConfig.Function         = CORDIC_FUNCTION_SINE;     /* sine function */
  	sCordicConfig.Precision        = CORDIC_PRECISION_6CYCLES; /* max precision for q1.31 sine */
 	sCordicConfig.Scale            = CORDIC_SCALE_0;           /* no scale */
 	sCordicConfig.NbWrite          = CORDIC_NBWRITE_1;         /* One input data: angle. Second input data (modulus) is 1 after cordic reset */
 	sCordicConfig.NbRead           = CORDIC_NBREAD_2;          /* One output data: sine */
 	sCordicConfig.InSize           = CORDIC_INSIZE_32BITS;     /* q1.31 format for input data */
  	sCordicConfig.OutSize          = CORDIC_OUTSIZE_32BITS;    /* q1.31 format for output data */
	
	HAL_CORDIC_Configure(&hcordic, &sCordicConfig);
}

这里使用了cordic模块计算sin和cos函数,传入参数1个(角度),传出参数2个(sin和cos值),输入输出数据都是32位。具体内容可以参考ST官方手册。
在这里插入图片描述
HAL库中使用DMA方式进行cordic计算对应的函数为HAL_StatusTypeDef HAL_CORDIC_Calculate_DMA(CORDIC_HandleTypeDef *hcordic, int32_t *pInBuff, int32_t *pOutBuff, uint32_t NbCalc, uint32_t DMADirection),该函数有5个入口参数,分别是:cordic结构体地址、输入数据地址、输出数据地址、转换次数、DMA数据方向。可以将其进一步封装成cordic_calculate_start函数,具体代码如下:

int32_t pInBuff;			//输入数据
int32_t pOutBuff[2];		//输出数据
void cordic_calculate_start(float arg1)			
{
	//传入的是归一化角度[0, 1.0]
	if(arg1 > 0.5f)								//将角度从[0, 1.0]转换到[-0.5, 0.5]
		arg1 -= 1.0f;
	pInBuff = value_to_cordic31(arg1, 0.5f);	//[-0.5, 0.5]对0.5f归一化,转换到[-1.0, 1.0],并用Q31定点数据表示
	
	//传入的是弧度值[0, 6.28]
	/*if(arg1 > 3.14f)							//将角度从[0, 6.28]转换到[-3.14, 3.14]
		arg1 -= 6.28f;
	pInBuff = value_to_cordic31(arg1, 3.14f);	//[-3.14, 3.14]对3.14f归一化,转换到[-1.0, 1.0],并用Q31定点数据表示
	*/
	
	HAL_CORDIC_Calculate_DMA(&hcordic, &pInBuff, pOutBuff, 1, CORDIC_DMA_DIR_IN_OUT);			//开始转换
}

值得注意的是,cordic模块计算sin和cos要求传入角度取值在[-1,1](对应弧度值[-PI, PI]),并且需要用Q31定点格式来表示。因此采用函数value_to_cordic31对角度格式进行转换,具体代码为:

int32_t value_to_cordic31(float value, float coeff)
{
	int32_t cordic31;
	cordic31 = (int32_t)((value/coeff)*0x80000000);		//value对coeff归一化,然后扩大2^31倍,取整得到Q31定点数据
	return cordic31;
}

DMA转换完成后,结果会自动存放到指定的输出地址处,我们就可以直接读取了。

void cordic_get_result(float *res1, float *res2)
{	
	while (HAL_CORDIC_GetState(&hcordic) != HAL_CORDIC_STATE_READY);	//等待cordic模块空闲

	cordic31_to_value(pOutBuff[0], res1);								//正弦值转浮点
	cordic31_to_value(pOutBuff[1], res2);								//余弦值转浮点
}

读到的数据也是Q31定点格式,可以采用cordic31_to_value函数将其转换成浮点数。(正数直接缩小2^31倍,负数由于是以补码形式存储,需要先去掉最高位符号位,然后转换成原码,再进行缩小)

void cordic31_to_value(int cordic31, float *res)
{
	if(cordic31&0x80000000)			//为负数
	{
		cordic31 = cordic31&0x7fffffff;
		*res = ((float)(cordic31)-0x80000000)/0x80000000;
	}
	else							//为正数
	{
		*res = (float)(cordic31)/0x80000000;
	}
}

4.总结

STM32G系列内置CORDIC模块可以加速三角函数等数学运算,且拥有较高的计算精度。CORDIC模块单次转换速度可能与查表法没有太大差距,但其优势在于,可以同时对大量数据进行相同的运算操作,同时节省CPU资源。使用时,需要按照手册对数据进行浮定点转换以及标幺处理。另外,使用过程中发现,DMA模式下更改CORDIC模块配置进行不同的数学运算,得到的计算结果会出错,因此DMA模式只适用于相同数学运算的应用场景。
参考资料:1.https://shequ.stmicroelectronics.cn/thread-635016-1-1.html
2.ST官方CORDIC例程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/35621.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多元分类预测 | Matlab基于灰狼优化深度置信网络(GWO-DBN)的分类预测,多特征输入模型,GWO-DBN分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab基于灰狼优化深度置信网络(GWO-DBN)的分类预测,多特征输入模型,GWO-DBN分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

如何提高OAK相机在树莓派和JETSON上的运行帧率?

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 Hello,大家好,这里是OAK中国,我是助手君。 最…

【嵌入式Qt开发入门】如何使用Qt进行绘制实时图表——QChart 图表

要想使用 Qt Charts,我们的 Qt 版本得使用 Qt 5.7 之后的版本。其实 Qt Charts 并不是 Qt 5.7 才有的,是在 Qt 5.7 以前只有商业版本的 Qt 才有 Qt Charts。我们能免费下载的 Qt 版本都是社区(开源)版本。 Qt Charts 很方便的绘制…

密码学入门——DES与AES

文章目录 参考书目一、编码与异或1.1 编码1.2 异或 二、DES与三重DES三、AES 参考书目 图解密码技术,第三版 一、编码与异或 1.1 编码 计算机的操作对象并不是文字,而是由0和1排列而成的比特序列。无论是文字、图像、声音、视频还是程序,…

win系统删除oracle数据文件恢复---惜分飞

有客户联系我们,说win平台下的数据库,在由于空间紧张,在关闭数据库的情况下删除的两个数据文件,导致数据库无法正常访问很多业务表,需要对其进行恢复,查看alert日志发现大概操作,删除文件之后,启动数据库失败 Completed: alter database mount exclusive alter database open E…

【案例实战】SpringBoot整合Redis的GEO实现查找附近门店功能

像我们平常美团点外卖的时候,都会看到一个商家距离我们多少米。还有类似QQ附近的人,我们能看到附近的人距离我们有多少米。 那么这些业务是怎么做的呢?是如何实现 基于位置的附近服务系统呢。 在去了解基于位置的附近服务之前,我…

个人域名邮箱无法给gmail发邮件

问题描述 我注册了一个域名 mydomain.com, 并在此域名下创建了 mailbox,从该邮箱向外发送邮件和接收邮件会失败。 主要是一些配置工作没有做好。 接收邮件 当创建邮箱 xxxmydomain.com,尝试向该邮箱发送邮件时,邮件会被拒收,并…

在Linux中安装RabbitMQ

RabbitMQ下载网址 Socat下载网址 erlang下载网址 RabbitMQ安装包依赖于Erlang语言包的支持,所以需要先安装Erlang语言包,再安装RabbitMQ安装包 通过Xftp软件将这三个压缩包上传到linux中的opt目录下 ,双击即可 在安装之前先查询…

Css基础:盒子模型

1.盒子模型的构成: 边框 外边距 内边距 实际内容 2.table表格的单元格之间的线太粗需要border-collapse:collapse;合并一下边框宽度 3.内边距 padding 4.外边距 margin 块元素水平居中的做法,margin:0 auto; 行内元素和行内块元素 水平居中做…

【Jenkins】Jenkins构建后端流水线

目录 一、新建任务1、输入任务名称,选择构建项目类型(这里我选择的是Maven项目),任务名称一般格式为:项目名称-前后端2、创建成功后的结果 二、配置流水线1、进入刚创建好的任务页面中,点击配置2、General配…

快速入门uniapp——从环境搭建到项目实践

🙂博主:小猫娃来啦 🙂文章核心:快速入门uniapp——从环境搭建到项目实践 文章目录 初步介绍UniApp开发环境搭建下载和安装UniApp开发工具创建新项目(HBuilderX)开发工具界面介绍 UniApp基础知识页面结构页面…

SQLite Expert Professional将ACCESS数据库文件导入到SQLITE

一、下载与安装 下载对应的位数的SQLite Expert:http://www.sqliteexpert.com/download.html ,建议下载professional版本的,功能更加强大。 如果官网进不去可以到百度云下载:https://pan.baidu.com/s/17igndAqQ7SQ57LcjwS4WIQ …

原型模式:如何最快速地clone一个HashMap散列表?

我们还像学习建造者模式一样 思考 什么是原型模式?主要解决哪些问题? 如果对象的创建成本比较大,而同一个类的不同对象之间差别不大(大部分字段都相同),在这种情况下,我们可以利用对已有对象…

关于PHP 使用 Elastic Search8的相关经历

你好! 如果你也是第一次使用ES8和PHP对接使用,这里或许有一些心得可以为你解决一些问题。 本地环境所需工具 windows 版本搭建 Elastic Search 如下图,通过官网下载一个windows版本的Elastic Search 执行.bat文件即可启动 https://localhos…

ChatGPT 有什么新奇的使用方式?

先来看看ChatGPT对此问题如何作答 ChatGPT对此问题如何作答 ChatGPT是什么 ChatGPT是一种基于自然语言处理的语言模型,由OpenAI开发。它是建立在GPT(Generative Pre-trained Transformer)架构的基础上的,采用了深度学习技术。GP…

在树莓派上搭建web站点并发布互联网上线【无需公网IP】

文章目录 概述使用 Raspberry Pi Imager 安装 Raspberry Pi OS设置 Apache Web 服务器测试 web 站点安装静态样例站点将web站点发布到公网安装 Cpolar内网穿透cpolar进行token认证生成cpolar随机域名网址生成cpolar二级子域名将参数保存到cpolar配置文件中测试修改后配置文件配…

Devops系列四(使用argocd部署java应用到k8s容器)

一、说在前面的话 上文已为我们准备好了以下内容: 制作java应用的docker镜像,并推送至镜像仓库上传helm yaml代码至gitlab仓库(此gitlab和java应用所在的gitlab可以独立,也可以在一起,但是不宜在同一个工程&#xff…

Gradio HTML组件详解

❤️觉得内容不错的话,欢迎点赞收藏加关注😊😊😊,后续会继续输入更多优质内容❤️ 👉有问题欢迎大家加关注私戳或者评论(包括但不限于NLP算法相关,linux学习相关,读研读博…

使用electron打包spring-boot+vue项目开发桌面exe端项目一站式全部解决!专栏有解决报错文章

准备工具 前端:node.js 14以下(直接安装 node.js 即可) 后端:jre 1.8(必须1.8) 工具: Bat_To_Exe_ConverterInno_Setup 汉化版(英文版不支持简体中文,打包出来的安装界面是英文的)我以及给大家汇总完毕直接点击进去下载即可 https://pan.baidu.com/s/1XoA0tj3b4Q…

上位机和树莓派采用USB转TTL模块连接,采用串口通信

采用USB转TTL模块,Linux系统的工控机接USB插口,树莓派的GPIO口接TTL串口,如何编写双向通信程序? USB转TTL-CH340模块 ChatGPT 下面是一个示例,展示了如何使用USB转TTL模块在Linux系统的工控机和树莓派之间进行双向…