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

文章介绍了MiniBoardMM32F0163D7P微控制器,基于ArmCortex-M0内核,适用于各种应用如工业物联网和医疗设备。重点讲解了硬件除法器HWDIV的功能,包括32位除法运算、自动触发、溢出中断处理,并提供了相关API的示例代码,展示如何进行无符号除法和获取余数的操作。
摘要由CSDN通过智能技术生成

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


电路原理图:


1.2 HWDIV简介
硬件除法器能自动执行有符号或者无符号的 32 位整数除法运算。

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

     





HWDIV features:

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


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


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


除数为0时SR寄存器的状态:


3.HWDIV驱动搭建
使用以下API

<font face="Arial">void HWDIV_EnableUsignBit(HWDIV_Type * HWDIVx, bool isUSIGN)

void HWDIV_EnableInterrupt(HWDIV_Type * HWDIVx, bool enable)

bool HWDIV_GetOVFBit(HWDIV_Type * HWDIVx)

void HWDIV_ClearOVFBit(HWDIV_Type * HWDIVx)

bool HWDIV_GetUSIGNBit(HWDIV_Type * HWDIVx)

int32_t HWDIV_CalcSign(HWDIV_Type * HWDIVx,int32_t dvdr,int32_t dvsr)

int32_t HWDIV_GetRMDRBitsSign(HWDIV_Type * HWDIVx)

uint32_t HWDIV_CalcUsign(HWDIV_Type * HWDIVx,uint32_t dvdr,uint32_t dvsr)

uint32_t HWDIV_GetRMDRBitsUsign(HWDIV_Type * HWDIVx)</font>


使能无符号除法:

<font face="Arial">/* Enable unsigned division. */

void HWDIV_EnableUsignBit(HWDIV_Type * HWDIVx, bool isUSIGN){

    if(isUSIGN){

        /* Unsigned division. */

        HWDIVx->CR |= HWDIV_CR_USIGN_MASK;}

    else{

        /* Signed division. */

        HWDIVx->CR &= (0xFFFFFFFFU & ~HWDIV_CR_USIGN_MASK);}}</font>


计算无符号除法:

<font face="Arial">/* Count the unsigned number. */

uint32_t HWDIV_CalcUsign(HWDIV_Type * HWDIVx,uint32_t dvdr,uint32_t dvsr){

    HWDIVx->DVDR = dvdr;

    HWDIVx->DVSR = dvsr;



    if(HWDIVx->SR & HWDIV_SR_OVF_MASK){

        return 0xFFFFFFFFU;}

    else{

        return HWDIVx->QUOTR;}}</font>


获取无符号除法余数:

<font face="Arial">/* Get the unsigned remainder. */

uint32_t HWDIV_GetRMDRBitsUsign(HWDIV_Type * HWDIVx){

    return (uint32_t)HWDIVx->RMDR;}</font>


4.HWDIV样例
连续除法样例
主函数:

<font face="Arial">int main(void){

    uint32_t a,b;



    BOARD_Init();



    HWDIV_EnableUsignBit(HWDIV,true);

    HWDIV_EnableInterrupt(HWDIV,false);



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



    a = HWDIV_CalcUsign(HWDIV,12,0);

    b = HWDIV_GetRMDRBitsUsign(HWDIV);



    if( HWDIV_GetOVFBit(HWDIV) ){

        HWDIV_ClearOVFBit(HWDIV);}



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



    a = HWDIV_CalcUsign(HWDIV,12,6);

    b = HWDIV_GetRMDRBitsUsign(HWDIV);



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



    a = HWDIV_CalcUsign(HWDIV,22,5);

    b = HWDIV_GetRMDRBitsUsign(HWDIV);



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



    while (1){}}</font>


串口实验现象:

 

---------------------
作者:春娇霹雳娃
链接:https://bbs.21ic.com/icview-3311868-1-1.html
来源:21ic.com
此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值