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

这篇具有很好参考价值的文章主要介绍了【STM32】STM32G系列使用CORDIC模块加速计算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1.前言

STM32G431系列产品内置了CORDIC运算单元,可以用来加速数学计算,如三角函数、取模、开方等。适合大量数据进行相同的运算操作。配合DMA可以大大节省CPU计算开销。
【STM32】STM32G系列使用CORDIC模块加速计算,STM32,stm32,嵌入式硬件,单片机

2.CubeMX配置

使用CORDIC模块无需配置参数,若采用DMA方式则只需配置DMA读写通道,配置如下
【STM32】STM32G系列使用CORDIC模块加速计算,STM32,stm32,嵌入式硬件,单片机

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官方手册。
【STM32】STM32G系列使用CORDIC模块加速计算,STM32,stm32,嵌入式硬件,单片机
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例程文章来源地址https://www.toymoban.com/news/detail-533220.html

到了这里,关于【STM32】STM32G系列使用CORDIC模块加速计算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32G0x0系列-软件定时器解决HAL_Delay问题

    目录 HAL_Delay函数源码 软件定时器 创建工程试验 1.将对应文件移动到项目位置 2.添加现有文件放到工程中   3.重定向printf 3.验证自己的软件定时器 4.查看现象          HAL_Delay函数使用了中断机制来实现延时功能,当在中断函数中调用HAL_Delay函数需要考虑中断优先级问题。

    2024年02月07日
    浏览(49)
  • 【STM32F4系列】【HAL库】【模块介绍】MPU6050设置与DMP库使用

    MPU6050是一个3轴陀螺仪(测角加速度)和3轴加速度计(测量线加速度)的测量芯片 内部自带运算单元(DMP),可以输出经姿态融合计算后的 四元数 (一种表示旋转的方法) 而且MPU6050的价格较低(10r以下),常被用于精度不高的场合作为姿态感知的芯片 如经典项目平衡车,某年电赛题目风力摆

    2024年02月05日
    浏览(39)
  • 【模块系列】STM32&TCS3472

    前言   手上正好有TCS3472模块,也正好想在加深一下自己对I2C协议的理解和应用,所以就写了这个代码库出来。参考的资料主要来源于TCS3472的数据手册,和arduino中MH_TCS3472库的宏定义,和函数名称,我就没有重新命名,方便大家理解和使用修改之类的。 环境 开发板:STM32

    2024年01月20日
    浏览(30)
  • 【模块系列】STM32&BMP280

    前言   最进想练习下I2C的应用,手上好有BMP280也没用过,就看着机翻手册和原版手册,开始嘎嘎写库函数了。库的命名应该还1是比较规范了吧,就是手册对于最终值的计算方式很迷糊,所以现在也不能保证有可靠性啊,大家看着来用吧。 注意 :该BMP280库不一定能用,仅供

    2024年01月16日
    浏览(25)
  • STM32系列——手把手教你将SYN6288语音播报模块的标准库程序转为hal库使用

    目录 前言 1. 原理 2. Cubmx配置 3. keil5编写代码 3.1 main.c 3.2 syn6288.c 3.3 syn6288.h 本教程基于 stm32f103c8t6 最小系统板, hal库 开发。 操作简单,讲解直接清楚,旨在让大家少走弯路。 SYN6288就是用到一个串口资源即可,用STM32开发起来不难。 配置串口3为异步通信模式 ,注意波特率

    2024年02月07日
    浏览(83)
  • STM32G030C8T6:使用外部晶振配置LED灯闪烁

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,使用STM32G030C8T6单片机,通过STM32CubeMX软件,配置并使用外部8MHz晶振,实现PB4引脚的LED灯每一秒钟闪烁一次; 涉及到的知识有:外部晶振的配置,配置

    2024年01月25日
    浏览(44)
  • STM32G030C8T6:使用按键控制LED亮灭(外部中断)

    本专栏记录STM32开发各个功能的详细过程,方便自己后续查看,当然也供正在入门STM32单片机的兄弟们参考; 本小节的目标是,系统主频64 MHZ,采用高速外部晶振,通过KEY1 按键的PA0 引脚配置成中断输入引脚,PB9引脚配置成输出,每次按键,PA0 引脚就会进入一次外部中断,每进

    2024年02月05日
    浏览(40)
  • STM32系列——手把手教你蓝牙模块HC05、HC06的使用,重在“用起来”(HAL库)

    不论是HC05还是HC06,我们用到的都是蓝牙模块的透传功能,只需要用到4个引脚:RXD、TXD、VCC(5V)、GND。 1、HC-05有6个引脚,但是我们只用到4个。 2、HC-05正面有一个按键。与HC-06的区别是, 它上电之前必须要按住此按键再插入电脑中,才能够进入AT模式 。HC-06没有按键,直接

    2024年02月05日
    浏览(74)
  • STM32系列(HAL库)——使用ESP8266-01S物联网模块连接Onenet云平台上报DHT11温湿度

    本篇主要讲解如何使用ESP8266-01S物联网模块连接Onenet云平台,并上报DHT11模块的温湿度数据。本文单片机主控采用STM32F405RGT6,使用其他主控的话基本要求有2个串口,一个串口用于调试使用,另一个用于ESP模块通讯。 1.软件 CubeMX Keil5 串口调试助手 Onenet云平台账户 2.硬件 STM32开

    2024年02月02日
    浏览(73)
  • 64MHz 闪存STM32G0B1CEU6(STM32G0B1CCU6)STM32G0B1CBU6引脚配置图、32位微控制器

    STM32G0B1 32位微控制器具有最高512KB嵌入式闪存和144kB RAM存储器。该器件采用48-UFQFPN 引脚封装。它支持USB全速主机/设备、集成USB Type-C控制器和收发器、FDCAN协议以及多达8个UART。 STM32G0 32位微控制器 (MCU) 适合用于消费、工业和家电领域的应用,并可随时用于物联网 (IoT) 解决方案

    2024年02月09日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包