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;// 初始化EAUEAU_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
142