SWM341_div.h 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef __SWM341_DIV_H__
  2. #define __SWM341_DIV_H__
  3. void DIV_Init(DIV_TypeDef * DIVx);
  4. /******************************************************************************************************************************************
  5. * 函数名称: DIV_UDiv()
  6. * 功能说明: 使用硬件除法器执行无符号数除法运算
  7. * 输 入: uint32_t dividend 被除数
  8. * uint32_t divisor 除数
  9. * 输 出: 无
  10. * 注意事项: 无
  11. ******************************************************************************************************************************************/
  12. static __INLINE void DIV_UDiv(uint32_t dividend, uint32_t divisor)
  13. {
  14. DIV->DIVIDEND = dividend;
  15. DIV->DIVISOR = divisor;
  16. DIV->CR = (1 << DIV_CR_DIVSIGN_Pos) | (1 << DIV_CR_DIVGO_Pos);
  17. }
  18. /******************************************************************************************************************************************
  19. * 函数名称: DIV_SDiv()
  20. * 功能说明: 使用硬件除法器执行有符号数除法运算
  21. * 输 入: int32_t dividend 被除数
  22. * int32_t divisor 除数
  23. * 输 出: 无
  24. * 注意事项: 无
  25. ******************************************************************************************************************************************/
  26. static __INLINE void DIV_SDiv(int32_t dividend, int32_t divisor)
  27. {
  28. DIV->DIVIDEND = dividend;
  29. DIV->DIVISOR = divisor;
  30. DIV->CR = (0 << DIV_CR_DIVSIGN_Pos) | (1 << DIV_CR_DIVGO_Pos);
  31. }
  32. /******************************************************************************************************************************************
  33. * 函数名称: DIV_Div_IsBusy()
  34. * 功能说明: 硬件除法器是否正在执行除法运算
  35. * 输 入: 无
  36. * 输 出: uint32_t 1 硬件除法器正在执行除法运算 0 硬件除法器已完成除法运算,可取出运算结果
  37. * 注意事项: 无
  38. ******************************************************************************************************************************************/
  39. static __INLINE uint32_t DIV_Div_IsBusy(void)
  40. {
  41. return (DIV->SR & DIV_SR_DIVBUSY_Msk) ? 1 : 0;
  42. }
  43. /******************************************************************************************************************************************
  44. * 函数名称: DIV_UDiv_Result()
  45. * 功能说明: 取出硬件除法器的运算结果
  46. * 输 入: 无
  47. * 输 出: uint32_t *quotient 商
  48. * uint32_t *remainder 余数
  49. * 注意事项: 无
  50. ******************************************************************************************************************************************/
  51. static __INLINE void DIV_UDiv_Result(uint32_t *quotient, uint32_t *remainder)
  52. {
  53. *quotient = DIV->QUO;
  54. *remainder = DIV->REMAIN;
  55. }
  56. /******************************************************************************************************************************************
  57. * 函数名称: DIV_SDiv_Result()
  58. * 功能说明: 取出硬件除法器的运算结果
  59. * 输 入: 无
  60. * 输 出: int32_t *quotient 商
  61. * int32_t *remainder 余数
  62. * 注意事项: 无
  63. ******************************************************************************************************************************************/
  64. static __INLINE void DIV_SDiv_Result(int32_t *quotient, int32_t *remainder)
  65. {
  66. *quotient = DIV->QUO & 0x7FFFFFFF;
  67. if(DIV->QUO & (1u << 31)) *quotient = 0 - *quotient;
  68. *remainder = DIV->REMAIN & 0x7FFFFFFF;
  69. if(DIV->REMAIN & (1u << 31)) *remainder = 0 - *remainder;
  70. }
  71. /******************************************************************************************************************************************
  72. * 函数名称: DIV_Root()
  73. * 功能说明: 使用硬件开方模块执行开方运算
  74. * 输 入: uint32_t radicand 被开方数
  75. * uint32_t calcu_frac 0 开方结果为16位整数 1 开方结果为16位整数+16位小数
  76. * 输 出: 无
  77. * 注意事项: 无
  78. ******************************************************************************************************************************************/
  79. static __INLINE void DIV_Root(uint32_t radicand, uint32_t calcu_fractional)
  80. {
  81. DIV->RADICAND = radicand;
  82. DIV->CR = (1 << DIV_CR_ROOTGO_Pos) | (calcu_fractional << DIV_CR_ROOTMOD_Pos);
  83. }
  84. /******************************************************************************************************************************************
  85. * 函数名称: DIV_Root_IsBusy()
  86. * 功能说明: 硬件开方模块是否正在执行开方运算
  87. * 输 入: 无
  88. * 输 出: uint32_t 1 硬件开方模块正在执行开方运算 0 硬件开方模块已完成开方运算,可取出运算结果
  89. * 注意事项: 无
  90. ******************************************************************************************************************************************/
  91. static __INLINE uint32_t DIV_Root_IsBusy(void)
  92. {
  93. return (DIV->SR & DIV_SR_ROOTBUSY_Msk) ? 1 : 0;
  94. }
  95. /******************************************************************************************************************************************
  96. * 函数名称: DIV_Root_Result()
  97. * 功能说明: 取出硬件开方模块的运算结果
  98. * 输 入: 无
  99. * 输 出: uint32_t 开方结果
  100. * 注意事项: 无
  101. ******************************************************************************************************************************************/
  102. static __INLINE uint32_t DIV_Root_Result(void)
  103. {
  104. if(DIV->CR & DIV_CR_ROOTMOD_Msk)
  105. {
  106. return DIV->ROOT;
  107. }
  108. else
  109. {
  110. return DIV->ROOT >> 16;
  111. }
  112. }
  113. #endif //__SWM341_DIV_H__