• 正文
  • 相关推荐
申请入驻 产业图谱

【FOC相关外设】EAU单元的应用

19小时前
142
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

EAU概述

扩展算术运算单元(EAU)是专为算术运算设计的协处理器,支持高效执行有符号整数除法、无符号整数除法和无符号整数开方运算,以得到商 / 平方根和余数,是对 M0 + 内核的算术类指令的有效补充和扩展。

EAU有以下特性:

支持 32 位除 32 位的有 / 无符号整数除法运算,得到商和余数

支持 32 位无符号整数开方运算,得到平方根和余数

无符号除法支持除数为零标志

有符号除法支持除数为零标志和溢出标志

电机控制中,使用EAU单元,可以快速进行数学除法运算。

EAU的运算定义

EAU 支持32 位无符号整数除法、32 位有符号整数除法和 32 位无符号整数开方三种运算。其中除法运算需要 2 到 35 个 HCLK 周期,开方运算需要 17 个 HCLK 周期。各运算定义如下

代码详解

完整参考代码如下:

通过网盘分享的文件:EAU除法运算  实例.zip

链接: https://pan.baidu.com/s/1T67cIIyJSoa6lkoO0xxxsw 提取码: L012

 

以有符号除法运算为例子,代码详解如下:

#include "cw32l012_eau.h"  //添加头文件char RamBuf[100] __attribute__((at(0x20000200)));int32_t main(void){    int32_t dividend = -1000;    // 被除数(有符号)    int32_t divisor = 7;         // 除数(有符号)    int32_t quotient;    int32_t remainder;    // 初始化EAU    EAU_Init();    // 设置为有符号除法模式    EAU_SetMode(EAU_MODE_SIGNED_DIV);    // 开始运算    EAU_StartOperation((uint32_t)dividend, (uint32_t)divisor);    // 等待运算完成    while (EAU_GetStatus() & EAU_STATUS_BUSY) {        // 等待忙碌标志位清零    }    // 获取结果    quotient = (int32_t)EAU_GetQuotient();    remainder = (int32_t)EAU_GetRemainder();    // 输出结果    sprintf(RamBuf, "signed div operation:");    sprintf(&RamBuf[25],"dividend:%d ", dividend); //被除数    sprintf(&RamBuf[45],"divisor:%d ", divisor); //除数    sprintf(&RamBuf[60],"quotient:%d ", quotient);  //商    sprintf(&RamBuf[80],"remainder:%d", remainder); //余数
    while(1);    }

运行结果

在例程运行中,可通过仿真单步执行观测运算结果。如下图所示:

从中可以看出: -1000/7的商是-142,余数是-6。

扫码加入QQ群3群| 610403240

相关推荐

登录即可解锁
  • 海量技术文章
  • 设计资源下载
  • 产业链客户资源
  • 写文章/发需求
立即登录

以开放、共享、互助为理念,致力于构建武汉芯源半导体CW32系列MCU生态社区。无论是嵌入式MCU小自还是想要攻破技术难题的工程师,亦或是需求解决方案的产品经理都可在CW32生态社区汲取营养、共同成长。