gd32f30x_fwdgt.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. /*!
  2. \file gd32f30x_fwdgt.c
  3. \brief FWDGT driver
  4. */
  5. /*
  6. Copyright (C) 2017 GigaDevice
  7. 2017-02-10, V1.0.1, firmware for GD32F30x
  8. */
  9. #include "gd32f30x_fwdgt.h"
  10. /* write value to FWDGT_CTL_CMD bit field */
  11. #define CTL_CMD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0))
  12. /* write value to FWDGT_RLD_RLD bit field */
  13. #define RLD_RLD(regval) (BITS(0,11) & ((uint32_t)(regval) << 0))
  14. /*!
  15. \brief disable write access to FWDGT_PSC and FWDGT_RLD
  16. \param[in] none
  17. \param[out] none
  18. \retval none
  19. */
  20. void fwdgt_write_disable(void)
  21. {
  22. FWDGT_CTL = FWDGT_WRITEACCESS_DISABLE;
  23. }
  24. /*!
  25. \brief reload the counter of FWDGT
  26. \param[in] none
  27. \param[out] none
  28. \retval none
  29. */
  30. void fwdgt_counter_reload(void)
  31. {
  32. FWDGT_CTL = FWDGT_KEY_RELOAD;
  33. }
  34. /*!
  35. \brief start the free watchdog timer counter
  36. \param[in] none
  37. \param[out] none
  38. \retval none
  39. */
  40. void fwdgt_enable(void)
  41. {
  42. FWDGT_CTL = FWDGT_KEY_ENABLE;
  43. }
  44. /*!
  45. \brief configure counter reload value, and prescaler divider value
  46. \param[in] reload_value: specify reload value(0x0000 - 0x0FFF)
  47. \param[in] prescaler_div: FWDGT prescaler value
  48. \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4
  49. \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8
  50. \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16
  51. \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32
  52. \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64
  53. \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128
  54. \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256
  55. \param[out] none
  56. \retval ErrStatus: ERROR or SUCCESS
  57. */
  58. ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div)
  59. {
  60. uint32_t timeout = FWDGT_PSC_TIMEOUT;
  61. uint32_t flag_status = RESET;
  62. /* enable write access to FWDGT_PSC,and FWDGT_RLD */
  63. FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE;
  64. /* wait until the PUD flag to be reset */
  65. do{
  66. flag_status = FWDGT_STAT & FWDGT_STAT_PUD;
  67. }while((--timeout > 0U) && ((uint32_t)RESET != flag_status));
  68. if ((uint32_t)RESET != flag_status){
  69. return ERROR;
  70. }
  71. /* configure FWDGT */
  72. FWDGT_PSC = (uint32_t)prescaler_div;
  73. timeout = FWDGT_RLD_TIMEOUT;
  74. /* wait until the RUD flag to be reset */
  75. do{
  76. flag_status = FWDGT_STAT & FWDGT_STAT_RUD;
  77. }while((--timeout > 0U) && ((uint32_t)RESET != flag_status));
  78. if ((uint32_t)RESET != flag_status){
  79. return ERROR;
  80. }
  81. FWDGT_RLD = RLD_RLD(reload_value);
  82. /* reload the counter */
  83. FWDGT_CTL = FWDGT_KEY_RELOAD;
  84. return SUCCESS;
  85. }
  86. /*!
  87. \brief get flag state of FWDGT
  88. \param[in] flag: flag to get
  89. \arg FWDGT_FLAG_PUD: a write operation to FWDGT_PSC register is on going
  90. \arg FWDGT_FLAG_RUD: a write operation to FWDGT_RLD register is on going
  91. \param[out] none
  92. \retval FlagStatus: SET or RESET
  93. */
  94. FlagStatus fwdgt_flag_get(uint16_t flag)
  95. {
  96. if(FWDGT_STAT & flag){
  97. return SET;
  98. }
  99. return RESET;
  100. }