gd32_bkp.c 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "gd32_bkp.h"
  2. static uint8_t g_bkp_first = 0;
  3. void gd32_bkp_init(void){
  4. if (POWER_FIRSTFLAG_VALUE != bkp_read_data(POWER_FIRSTFLAG_REG)){
  5. /* enable PMU and BKPI clocks */
  6. rcu_periph_clock_enable(RCU_BKPI);
  7. rcu_periph_clock_enable(RCU_PMU);
  8. /* allow access to BKP domain */
  9. pmu_backup_write_enable();
  10. /* reset backup domain */
  11. bkp_deinit();
  12. rcu_osci_on(RCU_IRC40K);
  13. rcu_osci_stab_wait(RCU_IRC40K);
  14. bkp_write_data(POWER_FIRSTFLAG_REG, POWER_FIRSTFLAG_VALUE);
  15. g_bkp_first = 1;
  16. }else{
  17. /* allow access to BKP domain */
  18. rcu_periph_clock_enable(RCU_BKPI);
  19. rcu_periph_clock_enable(RCU_PMU);
  20. pmu_backup_write_enable();
  21. g_bkp_first = 0;
  22. }
  23. }
  24. bool gd32_bkp_first_startup(void){
  25. if(g_bkp_first == 1)
  26. return TRUE;
  27. else
  28. return FALSE;
  29. }
  30. bool gd32_bkp_btrace_valid(void){
  31. if( bkp_read_data(BACK_TRACE_MAIGC_REG) == BACK_TRACE_MAIGC_VALUE)
  32. return TRUE;
  33. else
  34. return FALSE;
  35. }
  36. void gd32_bkp_save_backtrace(uint32_t *backtrace, uint32_t stack_over, uint32_t stack_dep, uint16_t line){
  37. uint16_t value = ((stack_over << 8) & 0xFF00) | (stack_dep & 0x00FF);
  38. uint32_t index;
  39. bkp_data_register_enum trace_reg = BACK_TRACE_CALLTRACE_START_REG;
  40. bkp_write_data(BACK_TRACE_MAIGC_REG, BACK_TRACE_MAIGC_VALUE);
  41. bkp_write_data(BACK_TRACE_INFO_REG, value);
  42. for (index = 0; index < stack_dep; index ++){
  43. uint32_t value = (backtrace[index] >> 16) & 0xFFFF;
  44. bkp_write_data(trace_reg, (uint16_t)value);
  45. trace_reg ++;
  46. value = backtrace[index] & 0xFFFF;
  47. bkp_write_data(trace_reg, (uint16_t)value);
  48. trace_reg ++;
  49. }
  50. bkp_write_data(BACK_TRACE_LINE_REG, line);
  51. }
  52. void gd32_bkp_get_backtrace(uint32_t *backtrace, uint32_t *stack_over, uint32_t *stack_dep, uint16_t *line){
  53. uint16_t value = bkp_read_data(BACK_TRACE_INFO_REG);
  54. uint32_t index;
  55. *stack_over = (value >> 8) & 0xFF;
  56. *stack_dep = value & 0xFF;
  57. *stack_dep = *stack_dep > 16 ? 16 : *stack_dep;
  58. bkp_data_register_enum trace_reg = BACK_TRACE_CALLTRACE_START_REG;
  59. for (index = 0; index < *stack_dep; index++){
  60. uint32_t t_h = bkp_read_data(trace_reg);
  61. trace_reg ++;
  62. uint32_t t_l = bkp_read_data(trace_reg);
  63. trace_reg ++;
  64. backtrace[index] = (t_h << 16 & 0xFFFF0000) | (t_l & 0xFFFF);
  65. }
  66. *line = bkp_read_data(BACK_TRACE_LINE_REG);
  67. }
  68. uint32_t gd32_get_reset_source(void)
  69. {
  70. uint32_t reset_source = RCU_RSTSCK;
  71. rcu_all_reset_flag_clear();
  72. return reset_source;
  73. }