hwsetup.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: hwsetup.c
  4. Partner Filename: hwsetup.h
  5. Description: Hardware setup
  6. Complier: IAR Embedded Workbench for ARM 8.40.2
  7. CPU TYPE : GD32F30x
  8. *************************************************************************
  9. Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. *************************************************************************/
  19. #ifndef _HWSETUP_C_
  20. #define _HWSETUP_C_
  21. #endif
  22. /************************************************************************
  23. Included File
  24. *************************************************************************/
  25. /*#include "user.h"
  26. #include "FuncLayerAPI.h"
  27. #include "can.h"*/
  28. #include "hwsetup.h"
  29. /************************************************************************
  30. Constant Table (N/A)
  31. *************************************************************************/
  32. /*************************************************************************
  33. Exported Functions:
  34. *************************************************************************/
  35. /*************************************************************************
  36. Function: hw_voHardwareSetup;
  37. Description: Hardware Setup function.
  38. Call by: main();
  39. Input Variables: All HW registers
  40. Output/Return Variables: All HW registers
  41. Subroutine Call: ...;
  42. Reference: N/A
  43. *************************************************************************/
  44. void hw_voHardwareSetup1(void)
  45. {
  46. // Initialize System Control registers, WatchDog to a know state
  47. hw_voInitSysCtrl();
  48. // Select GPIO for the device or for the specific application:
  49. hw_voInitGPIO();
  50. }
  51. void hw_voHardwareSetup2(void)
  52. {
  53. // Initialize all the Device Peripherals to a known state:
  54. hw_voInitPeri();
  55. // Initialize interrupt priority of peripherals:
  56. hw_voInitInt();
  57. hw_voEnInt();
  58. }
  59. /*************************************************************************
  60. Local Functions (N/A)
  61. *************************************************************************/
  62. /*************************************************************************
  63. Function: hw_voInitPWM;
  64. Description: MTU Setup function.
  65. Call by: main();
  66. Input Variables: MTU HW registers
  67. Output/Return Variables: MTU HW registers
  68. Subroutine Call: ...;
  69. Reference: N/A
  70. *************************************************************************/
  71. void hw_voInitPeri(void)
  72. {
  73. // Initialize SysTick
  74. hw_voInitSysTick();
  75. // Initialize CAN
  76. hw_voInitCAN();
  77. }
  78. /*************************************************************************
  79. Function:
  80. Description:
  81. Call by:
  82. Input Variables:
  83. Output/Return Variables:
  84. Subroutine Call:
  85. Reference:
  86. *************************************************************************/
  87. void hw_voInitSysCtrl(void)
  88. {
  89. /* Enable the Alternate Function clock */
  90. rcu_periph_clock_enable(RCU_AF);
  91. /* Enable the GPIOA clock */
  92. rcu_periph_clock_enable(RCU_GPIOA);
  93. /* Enable the GPIOB clock */
  94. rcu_periph_clock_enable(RCU_GPIOB);
  95. /* Enable the GPIOC clock */
  96. rcu_periph_clock_enable(RCU_GPIOC);
  97. /* Enable the GPIOF clock */
  98. rcu_periph_clock_enable(RCU_GPIOF);
  99. /* Enable the CAN clock */
  100. rcu_periph_clock_enable(RCU_CAN0);
  101. }
  102. /*************************************************************************
  103. Function:
  104. Description:
  105. Call by:
  106. Input Variables:
  107. Output/Return Variables:
  108. Subroutine Call:
  109. Reference:
  110. *************************************************************************/
  111. void hw_voInitGPIO(void)
  112. {
  113. /*=======================================================================
  114. GPIO A
  115. =======================================================================*/
  116. gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_12); /* CAN STB */
  117. gpio_bit_reset(GPIOA, GPIO_PIN_12);
  118. /* Dont config PA13, for it is used for SWDIO FOR DEBUG*/
  119. /* Dont config PA14, for it is used for SWCLK FOR DEBUG*/
  120. gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ, GPIO_PIN_15); /* ASSIST STATE IN */
  121. gpio_bit_reset(GPIOA, GPIO_PIN_15);
  122. /*=======================================================================
  123. GPIO B
  124. =======================================================================*/
  125. /* Remap CAN0 GPIO */
  126. gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP,ENABLE);
  127. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_8); /* CAN_RX */
  128. gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9); /* CAN_TX*/
  129. /*=======================================================================
  130. GPIO C
  131. =======================================================================*/
  132. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); /* IO control*/
  133. gpio_bit_set(GPIOC, GPIO_PIN_1);
  134. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_15|GPIO_PIN_8); /* Light Enable */
  135. }
  136. /*************************************************************************
  137. Function:
  138. Description:
  139. Call by:
  140. Input Variables:
  141. Output/Return Variables:
  142. Subroutine Call:
  143. Reference:
  144. *************************************************************************/
  145. void hw_voInitCAN()
  146. {
  147. can_parameter_struct can_parameter;
  148. can_filter_parameter_struct can_filter;
  149. can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
  150. can_struct_para_init(CAN_INIT_STRUCT, &can_filter);
  151. /* initialize CAN register */
  152. can_deinit(CAN0);
  153. /* initialize CAN */
  154. can_parameter.time_triggered = DISABLE;
  155. can_parameter.auto_bus_off_recovery = ENABLE;
  156. can_parameter.auto_wake_up = DISABLE;
  157. can_parameter.auto_retrans = ENABLE;
  158. can_parameter.rec_fifo_overwrite = DISABLE;
  159. can_parameter.trans_fifo_order = ENABLE;
  160. can_parameter.working_mode = CAN_NORMAL_MODE;
  161. can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
  162. can_parameter.time_segment_1 = CAN_BT_BS1_6TQ;
  163. can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
  164. /* baudrate 1Mbps */
  165. can_parameter.prescaler = 18; //36M/((1+6+1)*18)=250K
  166. can_init(CAN0, &can_parameter);
  167. /* initialize filter 0 */
  168. can_filter.filter_number = 0;
  169. can_filter.filter_mode = CAN_FILTERMODE_MASK;
  170. can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  171. can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_TO_MC_FILTER << 21) & 0xFFFF0000) >> 16);
  172. can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_TO_MC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;
  173. can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_TO_MC_MASK << 21) & 0xFFFF0000) >> 16);
  174. can_filter.filter_mask_low = ((ID_TO_MC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA;
  175. can_filter.filter_fifo_number = CAN_FIFO0;
  176. can_filter.filter_enable = ENABLE;
  177. can_filter_init(&can_filter);
  178. /* initialize filter 1 */
  179. // can_filter.filter_number = 1;
  180. // can_filter.filter_mode = CAN_FILTERMODE_MASK;
  181. // can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  182. // can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_BC_FILTER << 21) & 0xFFFF0000) >> 16);
  183. // can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_BC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;
  184. // can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000) >> 16);
  185. // can_filter.filter_mask_low = ((ID_BC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA;
  186. // can_filter.filter_fifo_number = CAN_FIFO0;
  187. // can_filter.filter_enable = ENABLE;
  188. // can_filter_init(&can_filter);
  189. }
  190. /*************************************************************************
  191. Function:
  192. Description:
  193. Call by:
  194. Input Variables:
  195. Output/Return Variables:
  196. Subroutine Call:
  197. Reference:
  198. *************************************************************************/
  199. #define FSYSTICK_HZ 1000
  200. void hw_voInitSysTick(void)
  201. {
  202. /* Setup systick timer interrupts */
  203. /* Do not exceed 2^24-1=16777215 */
  204. SysTick_Config(SystemCoreClock / FSYSTICK_HZ);
  205. }
  206. volatile static uint32_t delay;
  207. /*!
  208. \brief delay a time in milliseconds
  209. \param[in] count: count in milliseconds
  210. \param[out] none
  211. \retval none
  212. */
  213. void delay_1ms(uint32_t count)
  214. {
  215. delay = count;
  216. while(0U != delay){
  217. }
  218. }
  219. /*!
  220. \brief delay decrement
  221. \param[in] none
  222. \param[out] none
  223. \retval none
  224. */
  225. void delay_decrement(void)
  226. {
  227. if (0U != delay){
  228. delay--;
  229. }
  230. }
  231. extern void Period_Stick(void);
  232. /*!
  233. \brief this function handles SysTick exception
  234. \param[in] none
  235. \param[out] none
  236. \retval none
  237. */
  238. void SysTick_Handler(void)
  239. {
  240. delay_decrement();
  241. Period_Stick();
  242. }
  243. /*************************************************************************
  244. Function:
  245. Description:
  246. Call by:
  247. Input Variables:
  248. Output/Return Variables:
  249. Subroutine Call:
  250. Reference:
  251. *************************************************************************/
  252. void hw_voInitInt(void)
  253. {
  254. /* Set the priority group */
  255. nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  256. /* CAN0 RX0 interrupt */
  257. nvic_irq_enable(CAN0_RX0_IRQn, 3, 0);
  258. // NVIC->ISER[1]=0xFFFF;
  259. /* CAN0 RX1 interrupt */
  260. nvic_irq_enable(CAN0_RX1_IRQn, 3, 0);
  261. }
  262. /*************************************************************************
  263. Function:
  264. Description:
  265. Call by:
  266. Input Variables:
  267. Output/Return Variables:
  268. Subroutine Call:
  269. Reference:
  270. *************************************************************************/
  271. void hw_voEnInt(void)
  272. {
  273. /* CAN0 receive FIFO0 not empty interrupt */
  274. can_interrupt_enable(CAN0, CAN_INT_RFNE0);
  275. /* CAN0 receive FIFO0 overfull interrupt */
  276. can_interrupt_enable(CAN0, CAN_INT_RFO0);
  277. /* CAN0 receive FIFO1 not empty interrupt */
  278. can_interrupt_enable(CAN0, CAN_INT_RFNE1);
  279. /* CAN0 receive FIFO1 overfull interrupt */
  280. can_interrupt_enable(CAN0, CAN_INT_RFO1);
  281. /* CAN0 error interrupt */
  282. can_interrupt_enable(CAN0, CAN_INT_ERR);
  283. /* CAN0 bus-off interrupt */
  284. can_interrupt_enable(CAN0, CAN_INT_BO);
  285. /* CAN0 warning error interrupt */
  286. can_interrupt_enable(CAN0, CAN_INT_WERR);
  287. /* CAN0 passive error interrupt */
  288. can_interrupt_enable(CAN0, CAN_INT_PERR);
  289. // can_interrupt_enable(CAN0, CAN_INT_RFF0);
  290. }
  291. /*************************************************************************
  292. Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
  293. All rights reserved.
  294. *************************************************************************/
  295. #ifdef _HWSETUP_C_
  296. #undef _HWSETUP_C_
  297. #endif
  298. /************************************************************************
  299. End of this File (EOF)!
  300. Do not put anything after this part!
  301. *************************************************************************/