wdg.c
上传用户:yyyd609
上传日期:2022-07-18
资源大小:183k
文件大小:2k
源码类别:

微处理器开发

开发平台:

C/C++

  1. /******************** (C) COPYRIGHT 2003 STMicroelectronics ********************
  2. * File Name          : WDG.c
  3. * Author             : MCD Application Team
  4. * Date First Issued  : 10/24/2003
  5. * Description        : This file provides all the WDG software functions
  6. ********************************************************************************
  7. * History:
  8. *  01/01/2004 : V1.2
  9. *  14/07/2004 : V1.3
  10. *******************************************************************************/
  11. #include "wdg.h"
  12. #ifndef abs
  13. #define abs(x) ((x)>0 ? (x) : -(x))
  14. #endif
  15. /*******************************************************************************
  16. * Function Name  : FindFactors
  17. * Description    : Search for the best (a,b) values that fit n = a*b
  18. *                  with the following constraints: 1<=a<=256, 1<=b<=65536
  19. * Input 1        : n: the number to decompose
  20. * Input/Output 2 : a: a pointer to the first factor
  21. * Input/Output 3 : b: a pointer to the second factor
  22. * Return         : None
  23. *******************************************************************************/
  24. static void FindFactors(unsigned long n, unsigned int *a, unsigned long *b)
  25. {
  26. unsigned long b0;
  27. unsigned int a0;
  28. long err, err_min=n;
  29. *a = a0 = ((n-1)/65536ul) + 1;
  30. *b = b0 = n / *a;
  31. for (; *a <= 256; (*a)++)
  32. {
  33. *b = n / *a;
  34. err = (long)*a * (long)*b - (long)n;
  35. if (abs(err) > (*a / 2))
  36. {
  37. (*b)++;
  38. err = (long)*a * (long)*b - (long)n;
  39. }
  40. if (abs(err) < abs(err_min))
  41. {
  42. err_min = err;
  43. a0 = *a;
  44. b0 = *b;
  45. if (err == 0) break;
  46. }
  47. }
  48. *a = a0;
  49. *b = b0;
  50. }
  51. /*******************************************************************************
  52. * Function Name  : WDG_PeriodValueConfig
  53. * Description    : Set the prescaler and counter reload value
  54. * Input          : Amount of time (us) needed
  55. * Return         : None
  56. *******************************************************************************/
  57. void WDG_PeriodValueConfig ( u32 Time )
  58. {
  59. unsigned int a;
  60. unsigned long n, b;
  61. n = Time * (RCCU_FrequencyValue(RCCU_PCLK) / 1000000);
  62. FindFactors(n, &a, &b);
  63.     WDG->PR = a - 1;
  64.     WDG->VR = b - 1;
  65. }
  66. /******************* (C) COPYRIGHT 2003 STMicroelectronics *****END OF FILE****/