bsp.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. #include "bsp/bsp.h"
  2. #include "bsp/bsp_driver.h"
  3. #include "libs/logger.h"
  4. #include "os/os_types.h"
  5. #include "version.h"
  6. static void wdog_enable(void);
  7. #define DGB_TIM1_STOP (1<<10)
  8. #define DGB_TIM8_STOP (1<<17)
  9. static void dbg_stop_tim1_8(void) {
  10. __IO uint32_t *p = (uint32_t*)0xE0042004;
  11. *p |= DGB_TIM1_STOP;
  12. *p |= DGB_TIM8_STOP;
  13. }
  14. void bsp_init(void){
  15. wdog_enable();
  16. SystemCoreClockUpdate();
  17. dbg_stop_tim1_8();
  18. systick_open();
  19. task_ticks_enable();
  20. gpio_pin_init();
  21. shark_uart_init(SHARK_UART0);
  22. }
  23. void system_reboot(void){
  24. NVIC_SystemReset();
  25. }
  26. void systick_close(void)
  27. {
  28. SysTick->CTRL &= ~SysTick_CTRL_ENABLE_Msk;
  29. }
  30. void systick_open(void)
  31. {
  32. SysTick_Config(SystemCoreClock / 1000);
  33. }
  34. u8 mcu_chip_id(u8 *buff)
  35. {
  36. u32 values[] = { REG32(0x1FFFF7E8), REG32(0x1FFFF7EC), REG32(0x1FFFF7F0), REG32(0x1FFFF7E0) };
  37. memcpy(buff, values, sizeof(values));
  38. return sizeof(values);
  39. }
  40. static u32 _mcu_rst_status = 0xFFFFFFFF;
  41. u32 get_mcu_reset_source(void)
  42. {
  43. if (_mcu_rst_status == 0xFFFFFFFF) {
  44. _mcu_rst_status = RCC->CTRLSTS;
  45. RCC_ClrFlag();
  46. }
  47. return _mcu_rst_status;
  48. }
  49. void wdog_reload(void){
  50. #if CONFIG_DEBUG == 0
  51. IWDG_ReloadKey();
  52. #endif
  53. }
  54. static void wdog_enable(void)
  55. {
  56. #if CONFIG_DEBUG == 0
  57. /* IWDG timeout equal to 250 ms (the timeout may varies due to LSI frequency
  58. dispersion) */
  59. /* Enable write access to IWDG_PR and IWDG_RLR registers */
  60. IWDG_WriteConfig(IWDG_WRITE_ENABLE);
  61. /* IWDG counter clock: LSI/32 */
  62. IWDG_SetPrescalerDiv(IWDG_PRESCALER_DIV128);
  63. /* Set counter reload value to obtain 250ms IWDG TimeOut.
  64. Counter Reload Value = 250ms/IWDG counter clock period
  65. = 250ms / (LSI/32)
  66. = 0.25s / (LsiFreq/32)
  67. = LsiFreq/(32 * 4)
  68. = LsiFreq/128
  69. */
  70. IWDG_CntReload(1600);
  71. /* Reload IWDG counter */
  72. IWDG_ReloadKey();
  73. /* Enable IWDG (the LSI oscillator will be enabled by hardware) */
  74. IWDG_Enable();
  75. #endif
  76. }
  77. int wdog_set_timeout(int wdog_time)
  78. {
  79. return 0;
  80. }