赞
踩
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 外设、电子门锁控制、医疗和保健设备、手持设备及游戏娱乐等。
电路原理图:
1.2 HWDIV简介
硬件除法器能自动执行有符号或者无符号的 32 位整数除法运算。
HWDIV features:
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所有,任何人未经允许禁止转载。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。