返回列表 发新帖我要提问本帖赏金: 30.00元(功能说明)

[MM32软件] HWDIV硬件除法器底层揭秘,灵动MM32F0160新IP!

[复制链接]
 楼主| 春娇霹雳娃 发表于 2023-6-30 11:32 | 显示全部楼层 |阅读模式
<
本帖最后由 春娇霹雳娃 于 2023-6-30 11:31 编辑

#申请原创# @21小跑堂

1.简介
1.1 MiniBoard (MM32F0163D7P)
使用高性能的 Arm® Cortex-M0 为内核的 32 位微控制器,最高工作频率可达 72MHz,内置高速存储器,丰富的增强型 I/O 端口和多种外设。128KB Flash,16KB SRAM。1 个 I2C 接口、 1 个 I3C 从机接口,2 个 SPI 或 I2S 接口、 4 个 UART 接口、 1 个低功耗 UART。工作温度范围(环境温度)包含 -40℃ ∼ +85℃的工业级和 -40℃ ∼ +105℃ 的扩展工业级(尾缀 V)。适合于多种应用场合:工业物联网设备、PC 外设、电子门锁控制、医疗和保健设备、手持设备及游戏娱乐等。
66438649e4256a31b8.png

电路原理图:
86818649e4c0562332.png

1.2 HWDIV简介
硬件除法器能自动执行有符号或者无符号的 32 位整数除法运算。
  • 硬件除法单元包括 4 个 32 位数据寄存器,分别为被除数,除数,商和余数,可以做有符号或者无符号的 32 位除法运算
  • 通过硬件除法控制寄存器 HWDIV_CR 的 USIGN 位可以选择是有符号除法还是无符号除法
  • 每次写除数寄存器,会自动触发除法运算,在运算结束后,结果会写入到商和余数寄存器里。如果在运算结束前读商寄存器、余数寄存器或者状态寄存器,读操作会保持,直到当前运算结束才返回运算结果
  • 如果除数为零,会产生溢出中断标志位
  • 每次必须先初始化除数与被除数寄存器,才能读取商、余数、状态寄存器的值


85551649e47399f968.png

94518649e473da348c.png

HWDIV features:
  • 32 位除数和被除数,输出 32 位的商和余数
  • 如果除数为零,会产生溢出中断标志位
  • 写除数寄存器自动执行除法运算
  • 读商和余数寄存器时硬件自动等待运算结束

2.HWDIV底层
2.1 时钟
AHB1 总线的外设(RCC,HWDIV,GPIO 和 CRC)通过 AHB 互联矩阵与系统总线连接
3710649e483879a36.png


2.2 寄存器
硬件除法单元包括 4 个 32 位数据寄存器,分别为被除数,除数,商和余数,可以做有符号或者无符号的 32 位除法运算。除数寄存器位 (Divisor data),写完该寄存器后,自动触发除法运算。
24612649e48b0af30d.png

除数为0时SR寄存器的状态:
17276649e490e5e308.png

3.HWDIV驱动搭建
使用以下API:
  1. <font face="Arial">void HWDIV_EnableUsignBit(HWDIV_Type * HWDIVx, bool isUSIGN)
  2. void HWDIV_EnableInterrupt(HWDIV_Type * HWDIVx, bool enable)
  3. bool HWDIV_GetOVFBit(HWDIV_Type * HWDIVx)
  4. void HWDIV_ClearOVFBit(HWDIV_Type * HWDIVx)
  5. bool HWDIV_GetUSIGNBit(HWDIV_Type * HWDIVx)
  6. int32_t HWDIV_CalcSign(HWDIV_Type * HWDIVx,int32_t dvdr,int32_t dvsr)
  7. int32_t HWDIV_GetRMDRBitsSign(HWDIV_Type * HWDIVx)
  8. uint32_t HWDIV_CalcUsign(HWDIV_Type * HWDIVx,uint32_t dvdr,uint32_t dvsr)
  9. uint32_t HWDIV_GetRMDRBitsUsign(HWDIV_Type * HWDIVx)</font>

使能无符号除法:
  1. <font face="Arial">/* Enable unsigned division. */
  2. void HWDIV_EnableUsignBit(HWDIV_Type * HWDIVx, bool isUSIGN){
  3.     if(isUSIGN){
  4.         /* Unsigned division. */
  5.         HWDIVx->CR |= HWDIV_CR_USIGN_MASK;}
  6.     else{
  7.         /* Signed division. */
  8.         HWDIVx->CR &= (0xFFFFFFFFU & ~HWDIV_CR_USIGN_MASK);}}</font>

计算无符号除法:
  1. <font face="Arial">/* Count the unsigned number. */
  2. uint32_t HWDIV_CalcUsign(HWDIV_Type * HWDIVx,uint32_t dvdr,uint32_t dvsr){
  3.     HWDIVx->DVDR = dvdr;
  4.     HWDIVx->DVSR = dvsr;

  5.     if(HWDIVx->SR & HWDIV_SR_OVF_MASK){
  6.         return 0xFFFFFFFFU;}
  7.     else{
  8.         return HWDIVx->QUOTR;}}</font>

获取无符号除法余数:
  1. <font face="Arial">/* Get the unsigned remainder. */
  2. uint32_t HWDIV_GetRMDRBitsUsign(HWDIV_Type * HWDIVx){
  3.     return (uint32_t)HWDIVx->RMDR;}</font>

4.HWDIV样例
连续除法样例
主函数:
  1. <font face="Arial">int main(void){
  2.     uint32_t a,b;

  3.     BOARD_Init();

  4.     HWDIV_EnableUsignBit(HWDIV,true);
  5.     HWDIV_EnableInterrupt(HWDIV,false);

  6.     printf("\r\nhwdiv_basic example.\r\n");

  7.     a = HWDIV_CalcUsign(HWDIV,12,0);
  8.     b = HWDIV_GetRMDRBitsUsign(HWDIV);

  9.     if( HWDIV_GetOVFBit(HWDIV) ){
  10.         HWDIV_ClearOVFBit(HWDIV);}

  11.     printf("\r\nquotient = %u, remainder = %u\r\n", (unsigned)a, (unsigned)b);

  12.     a = HWDIV_CalcUsign(HWDIV,12,6);
  13.     b = HWDIV_GetRMDRBitsUsign(HWDIV);

  14.     printf("\r\nquotient = %u, remainder = %u\r\n", (unsigned)a, (unsigned)b);

  15.     a = HWDIV_CalcUsign(HWDIV,22,5);
  16.     b = HWDIV_GetRMDRBitsUsign(HWDIV);

  17.     printf("\r\nquotient = %u, remainder = %u\r\n", (unsigned)a, (unsigned)b);

  18.     while (1){}}</font>

串口实验现象:
27368649e3cfe913b1.png

5.附件
电路图: Mini-F0160_电路图.pdf (328.33 KB, 下载次数: 1)
UM网址:https://www.mindmotion.com.cn/download/products/UM_MM32F0160_SC.pdf
工程: mini-f0160_hwdiv_basic_mdk.zip (564.81 KB, 下载次数: 2)


打赏榜单

21小跑堂 打赏了 30.00 元 2023-07-18
理由:恭喜通过原创审核!期待您更多的原创作品~

评论

MM32F0163D7P,一个良心MCU,解决了M0内核单片机除法运算的困扰,引入硬件除法器,加速M0内核下的除法运算。  发表于 2023-7-18 16:36
yangxiaor520 发表于 2023-7-1 12:03 来自手机 | 显示全部楼层
硬件除法器肯定比软件计算要好
 楼主| 春娇霹雳娃 发表于 2023-7-1 12:40 | 显示全部楼层
yangxiaor520 发表于 2023-7-1 12:03
硬件除法器肯定比软件计算要好

chenqianqian 发表于 2023-7-3 20:57 来自手机 | 显示全部楼层
用于浮点数运算不错
 楼主| 春娇霹雳娃 发表于 2023-7-4 09:53 | 显示全部楼层
Sunriver_Yao 发表于 2023-7-25 14:05 | 显示全部楼层
yangxiaor520 发表于 2023-7-1 12:03
硬件除法器肯定比软件计算要好

"快"!
 楼主| 春娇霹雳娃 发表于 2023-7-25 15:52 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:灵动系统开发工程师
简介:none........

19

主题

154

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部