drv_common.c 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /**************************************************************************//**
  2. *
  3. * @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0
  6. *
  7. * Change Logs:
  8. * Date Author Notes
  9. * 2022-3-15 Wayne First version
  10. *
  11. ******************************************************************************/
  12. #include <rtconfig.h>
  13. #include <rtthread.h>
  14. #include "NuMicro.h"
  15. #include "drv_uart.h"
  16. #include "drv_gpio.h"
  17. #include "board.h"
  18. #include "nutool_modclkcfg.h"
  19. #define LOG_TAG "drv.common"
  20. #undef DBG_ENABLE
  21. #define DBG_SECTION_NAME LOG_TAG
  22. #define DBG_LEVEL LOG_LVL_DBG
  23. #define DBG_COLOR
  24. #include <rtdbg.h>
  25. extern void nutool_pincfg_init(void);
  26. /**
  27. * This function will initial.
  28. */
  29. rt_weak void rt_hw_board_init(void)
  30. {
  31. uint32_t u32RegLockBackup = SYS_IsRegLocked();
  32. /* Unlock protected registers */
  33. SYS_UnlockReg();
  34. /* Init System/modules clock */
  35. nutool_modclkcfg_init();
  36. /* Init all pin function setting */
  37. nutool_pincfg_init();
  38. /* Configure SysTick */
  39. SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND);
  40. /* Update System Core Clock */
  41. /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */
  42. SystemCoreClockUpdate();
  43. #if defined(BSP_USING_EADC)
  44. /* Vref connect to internal */
  45. SYS->VREFCTL = (SYS->VREFCTL & ~SYS_VREFCTL_VREFCTL_Msk) | SYS_VREFCTL_VREF_3_0V;
  46. #endif
  47. if (u32RegLockBackup)
  48. {
  49. /* Lock protected registers */
  50. SYS_LockReg();
  51. }
  52. #ifdef RT_USING_HEAP
  53. rt_system_heap_init(HEAP_BEGIN, HEAP_END);
  54. #endif /* RT_USING_HEAP */
  55. #if defined(BSP_USING_UART)
  56. rt_hw_uart_init();
  57. #endif
  58. #if defined(RT_USING_CONSOLE) && defined(RT_USING_DEVICE)
  59. rt_console_set_device(RT_CONSOLE_DEVICE_NAME);
  60. #endif
  61. NVIC_SetPriorityGrouping(7);
  62. #ifdef RT_USING_COMPONENTS_INIT
  63. rt_components_board_init();
  64. #endif
  65. }
  66. /**
  67. * The time delay function.
  68. *
  69. * @param microseconds.
  70. */
  71. void rt_hw_us_delay(rt_uint32_t us)
  72. {
  73. rt_uint32_t ticks;
  74. rt_uint32_t told, tnow, tcnt = 0;
  75. rt_uint32_t reload = SysTick->LOAD;
  76. ticks = us * reload / (1000000 / RT_TICK_PER_SECOND);
  77. told = SysTick->VAL;
  78. while (1)
  79. {
  80. tnow = SysTick->VAL;
  81. if (tnow != told)
  82. {
  83. if (tnow < told)
  84. {
  85. tcnt += told - tnow;
  86. }
  87. else
  88. {
  89. tcnt += reload - tnow + told;
  90. }
  91. told = tnow;
  92. if (tcnt >= ticks)
  93. {
  94. break;
  95. }
  96. }
  97. }
  98. }
  99. #define NU_MFP_POS(PIN) ((PIN % 4) * 8)
  100. #define NU_MFP_MSK(PIN) (0x1ful << NU_MFP_POS(PIN))
  101. void nu_pin_set_function(rt_base_t pin, int data)
  102. {
  103. uint32_t GPx_MFPx_org;
  104. uint32_t pin_index = NU_GET_PINS(pin);
  105. uint32_t port_index = NU_GET_PORT(pin);
  106. __IO uint32_t *GPx_MFPx = ((__IO uint32_t *) &SYS->GPA_MFP0) + port_index * 4 + (pin_index / 4);
  107. uint32_t MFP_Msk = NU_MFP_MSK(pin_index);
  108. GPx_MFPx_org = *GPx_MFPx;
  109. *GPx_MFPx = (GPx_MFPx_org & (~MFP_Msk)) | data;
  110. //rt_kprintf("Port[%d]-Pin[%d] Addr[%08x] Data[%08x] %08x -> %08x\n", port_index, pin_index, GPx_MFPx, data, GPx_MFPx_org, *GPx_MFPx);
  111. }
  112. /**
  113. * This is the timer interrupt service routine.
  114. *
  115. */
  116. void SysTick_Handler(void)
  117. {
  118. /* enter interrupt */
  119. rt_interrupt_enter();
  120. rt_tick_increase();
  121. /* leave interrupt */
  122. rt_interrupt_leave();
  123. }
  124. void rt_hw_cpu_reset(void)
  125. {
  126. SYS_UnlockReg();
  127. SYS->IPRST0 |= SYS_IPRST0_CHIPRST_Msk;
  128. }
  129. int reboot(int argc, char **argv)
  130. {
  131. rt_hw_cpu_reset();
  132. return 0;
  133. }
  134. MSH_CMD_EXPORT(reboot, Reboot System);
  135. void devmem(int argc, char *argv[])
  136. {
  137. volatile unsigned int u32Addr;
  138. unsigned int value = 0, mode = 0;
  139. if (argc < 2 || argc > 3)
  140. {
  141. goto exit_devmem;
  142. }
  143. if (argc == 3)
  144. {
  145. if (sscanf(argv[2], "0x%x", &value) != 1)
  146. goto exit_devmem;
  147. mode = 1; //Write
  148. }
  149. if (sscanf(argv[1], "0x%x", &u32Addr) != 1)
  150. goto exit_devmem;
  151. else if (!u32Addr || u32Addr & (4 - 1))
  152. goto exit_devmem;
  153. if (mode)
  154. {
  155. *((volatile uint32_t *)u32Addr) = value;
  156. }
  157. rt_kprintf("0x%08x\n", *((volatile uint32_t *)u32Addr));
  158. return;
  159. exit_devmem:
  160. rt_kprintf("Read: devmem <physical address in hex>\n");
  161. rt_kprintf("Write: devmem <physical address in hex> <value in hex format>\n");
  162. return;
  163. }
  164. MSH_CMD_EXPORT(devmem, dump device registers);
  165. void devmem2(int argc, char *argv[])
  166. {
  167. volatile unsigned int u32Addr;
  168. unsigned int value = 0, word_count = 1;
  169. if (argc < 2 || argc > 3)
  170. {
  171. goto exit_devmem;
  172. }
  173. if (argc == 3)
  174. {
  175. if (sscanf(argv[2], "%d", &value) != 1)
  176. goto exit_devmem;
  177. word_count = value;
  178. }
  179. if (sscanf(argv[1], "0x%x", &u32Addr) != 1)
  180. goto exit_devmem;
  181. else if (!u32Addr || u32Addr & (4 - 1))
  182. goto exit_devmem;
  183. if ( word_count > 0 )
  184. {
  185. LOG_HEX("devmem", 16, (void *)u32Addr, word_count*sizeof(rt_base_t));
  186. }
  187. return;
  188. exit_devmem:
  189. rt_kprintf("devmem2: <physical address in hex> <count in dec>\n");
  190. return;
  191. }
  192. MSH_CMD_EXPORT(devmem2, dump device registers);