hwsetup.c 48 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385
  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 "syspar.h"
  26. #include "user.h"
  27. #include "FuncLayerAPI.h"
  28. #include "can.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. }
  58. /*************************************************************************
  59. Local Functions (N/A)
  60. *************************************************************************/
  61. /*************************************************************************
  62. Function: hw_voInitPWM;
  63. Description: MTU Setup function.
  64. Call by: main();
  65. Input Variables: MTU HW registers
  66. Output/Return Variables: MTU HW registers
  67. Subroutine Call: ...;
  68. Reference: N/A
  69. *************************************************************************/
  70. void hw_voInitPeri(void)
  71. {
  72. // Initialize Exti
  73. hw_voInitEXTI();
  74. // Initialize DMA
  75. hw_voInitDMA();
  76. // Initialize ADC
  77. hw_voInitADC();
  78. // Initialize Timer0
  79. hw_voInitTim0();
  80. // Initialize Timer1
  81. hw_voInitTim1();
  82. // Initialize Timer3
  83. hw_voInitTim2();
  84. // Initialize Timer4
  85. hw_voInitTim3();
  86. // Initialize Timer6
  87. hw_voInitTim5();
  88. // Initialize Timer16
  89. hw_voInitTim6();
  90. // Initialize USART
  91. hw_voInitUART3();
  92. // Initialize SPI2
  93. hw_voInitSPI2();
  94. // Initialize I2C1
  95. hw_voInitI2C0();
  96. // Initialize SysTick
  97. hw_voInitSysTick();
  98. // Initialize CAN
  99. hw_voInitCAN();
  100. }
  101. /*************************************************************************
  102. Function:
  103. Description:
  104. Call by:
  105. Input Variables:
  106. Output/Return Variables:
  107. Subroutine Call:
  108. Reference:
  109. *************************************************************************/
  110. void hw_voInitSysCtrl(void)
  111. {
  112. /* Enable the DMA0 clock */
  113. rcu_periph_clock_enable(RCU_DMA0);
  114. /* Enable the DMA1 clock */
  115. rcu_periph_clock_enable(RCU_DMA1);
  116. /* Enable the Alternate Function clock */
  117. rcu_periph_clock_enable(RCU_AF);
  118. /* Enable the GPIOA clock */
  119. rcu_periph_clock_enable(RCU_GPIOA);
  120. /* Enable the GPIOB clock */
  121. rcu_periph_clock_enable(RCU_GPIOB);
  122. /* Enable the GPIOC clock */
  123. rcu_periph_clock_enable(RCU_GPIOC);
  124. /* Enable the GPIOD clock */
  125. rcu_periph_clock_enable(RCU_GPIOD);
  126. /* Enable the GPIOF clock */
  127. rcu_periph_clock_enable(RCU_GPIOF);
  128. /* Enable the ADC0 ADC1 clock */
  129. rcu_periph_clock_enable(RCU_ADC0);
  130. rcu_periph_clock_enable(RCU_ADC1);
  131. rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV2);
  132. /* Enable the TIM1 clock */
  133. rcu_periph_clock_enable(RCU_TIMER0);
  134. /* Enable the TIM2 clock */
  135. rcu_periph_clock_enable(RCU_TIMER1);
  136. /* Enable the TIM3 clock */
  137. rcu_periph_clock_enable(RCU_TIMER2);
  138. /* Enable the TIM4 clock */
  139. rcu_periph_clock_enable(RCU_TIMER3);
  140. /* Enable the TIM6 clock */
  141. rcu_periph_clock_enable(RCU_TIMER5);
  142. /* Enable the TIM16 clock */
  143. rcu_periph_clock_enable(RCU_TIMER6);
  144. /* Enable the UART3 clock */
  145. rcu_periph_clock_enable(RCU_UART3);
  146. /* Enable the SPI2 clock */
  147. rcu_periph_clock_enable(RCU_SPI2);
  148. /* Enable the I2C0 clock */
  149. rcu_periph_clock_enable(RCU_I2C0);
  150. /* Enable the CAN clock */
  151. rcu_periph_clock_enable(RCU_CAN0);
  152. }
  153. /*************************************************************************
  154. Function:
  155. Description:
  156. Call by:
  157. Input Variables:
  158. Output/Return Variables:
  159. Subroutine Call:
  160. Reference:
  161. *************************************************************************/
  162. void hw_voInitGPIO(void)
  163. {
  164. /*=======================================================================
  165. GPIO A
  166. =======================================================================*/
  167. gpio_init(GPIOA,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); /* ADC01_IN0,1,2,3: Iu, Iv, Iw, Torque*/
  168. gpio_init(GPIOA,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); /* ADC01_IN4,5,6,7: Ibus Ubus U_6V U_5V*/
  169. gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10); /* TIM0_CH0,1,2: UH, VH, WH */
  170. gpio_init(GPIOA,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_11); /* TIM0_CH3: ADC Trigger */
  171. //gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_11);
  172. gpio_init(GPIOA,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_12); /* CAN STB */
  173. gpio_bit_reset(GPIOA, GPIO_PIN_12);
  174. /* Dont config PA13, for it is used for SWDIO FOR DEBUG*/
  175. /* Dont config PA14, for it is used for SWCLK FOR DEBUG*/
  176. gpio_init(GPIOA,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ, GPIO_PIN_15); /* ASSIST STATE IN */
  177. gpio_bit_reset(GPIOA, GPIO_PIN_12);
  178. /*=======================================================================
  179. GPIO B
  180. =======================================================================*/
  181. gpio_init(GPIOB,GPIO_MODE_IPD,GPIO_OSPEED_50MHZ,GPIO_PIN_0|GPIO_PIN_1); /* Position Sensor Magnet Error Detect: LO, HI*/
  182. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_2); /* Cadence direction */
  183. /* JTAG-DP disabled and SW-DP enabled, so SPI2 can use PB3 and PB4*/
  184. gpio_pin_remap_config(GPIO_SWJ_SWDPENABLE_REMAP,ENABLE);
  185. gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_5); /* SPI2_SCK, SPI2_MOSI*/
  186. gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4); /* SPI2_MISO */
  187. gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); /* I2C0_SCL, I2C0_SDA*/
  188. /* Remap CAN0 GPIO */
  189. gpio_pin_remap_config(GPIO_CAN0_PARTIAL_REMAP,ENABLE);
  190. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_8); /* CAN_RX */
  191. gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_9); /* CAN_TX*/
  192. /* Remap Timer1 GPIO */
  193. gpio_pin_remap_config(GPIO_TIMER1_FULL_REMAP,ENABLE);
  194. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_10); /* TIM1_CH2: Capture For Candence Frequency */
  195. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_11); /* TIM1_CH3: Capture For Bike Speed */
  196. gpio_init(GPIOB,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_12); /* TIM0_BRKIN */
  197. gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15); /* TIM0_CH0N,1N,2N: UL, VL, WL */
  198. /*=======================================================================
  199. GPIO C
  200. =======================================================================*/
  201. gpio_init(GPIOC,GPIO_MODE_IPD,GPIO_OSPEED_50MHZ,GPIO_PIN_0); /* Switch State */
  202. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); /* Power Lock */
  203. gpio_init(GPIOC,GPIO_MODE_AIN,GPIO_OSPEED_50MHZ, GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); /* ADC01_IN12,13,14,15: U_12V, Throttle, PCB_Temp, Motor_Temp */
  204. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8); /* Test Pins*/
  205. //gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ, GPIO_PIN_6|GPIO_PIN_7|GPIO_PIN_8); /* TIM2_CH0,1,2: HallA, HallB, HallC */
  206. gpio_pin_remap_config(GPIO_TIMER2_FULL_REMAP,ENABLE);
  207. gpio_init(GPIOC,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_9); /* TIM2_CH3: 70KHz For Torque Sensor*/
  208. gpio_init(GPIOC,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_10); /* UART3_TX*/
  209. gpio_init(GPIOC,GPIO_MODE_IN_FLOATING,GPIO_OSPEED_50MHZ,GPIO_PIN_11); /* UART3_RX */
  210. // gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_10); // test
  211. //
  212. // gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_11); // test
  213. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_12); /* I2C0 Write Protect*/
  214. gpio_init(GPIOC,GPIO_MODE_IPD,GPIO_OSPEED_50MHZ,GPIO_PIN_14); /* Bike Brake */
  215. gpio_init(GPIOC,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_15); /* Light Enable */
  216. /*=======================================================================
  217. GPIO D
  218. =======================================================================*/
  219. gpio_init(GPIOD,GPIO_MODE_OUT_PP,GPIO_OSPEED_50MHZ, GPIO_PIN_2); /* SPI Chip Select */
  220. gpio_bit_set(GPIOD, GPIO_PIN_2);
  221. }
  222. /*************************************************************************
  223. Function:
  224. Description:
  225. Call by:
  226. Input Variables:
  227. Output/Return Variables:
  228. Subroutine Call:
  229. Reference:E:\General Software Platform\GD32F30x_Firmware_Library_V2.1.4\Examples\I2C\I2C_EEPROM_dma\at24cxx.c
  230. E:\General Software Platform\GD32F30x_Firmware_Library_V2.1.4\Examples\EXTI\Key_external_interrupt_mode\gd32f30x_it.c
  231. ***************************************E:\General Software Platform\GD32F30x_Firmware_Library_V2.1.4\Examples\I2C\I2C_EEPROM_dma\at24cxx.c
  232. E:\General Software Platform\GD32F30x_Firmware_Library_V2.1.4\Examples\EXTI\Key_external_interrupt_mode\gd32f30x_it.c**********************************/
  233. void hw_voInitEXTI(void)
  234. {
  235. // EXTI_InitTypeDef EXTI_InitStructure;
  236. //
  237. // SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOC, EXTI_PinSource14); // Break extern interrupt extern interrupt trigger source PIN
  238. // EXTI_InitStructure.EXTI_Line = EXTI_Line14;
  239. // EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  240. // EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  241. // EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  242. // EXTI_Init(&EXTI_InitStructure);
  243. }
  244. /*************************************************************************
  245. Function:
  246. Description:
  247. Call by:
  248. Input Variables:
  249. Output/Return Variables:
  250. Subroutine Call:
  251. Reference:
  252. *************************************************************************/
  253. void hw_voInitDMA(void)
  254. {
  255. dma_parameter_struct dma_init_struct;
  256. /*=======================================================================
  257. DMA0 Ch4 for Timer0
  258. =======================================================================*/
  259. dma_deinit(DMA0,DMA_CH4);
  260. dma_init_struct.periph_addr = (uint32_t)(&TIMER_DMATB(TIMER0));
  261. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  262. dma_init_struct.memory_addr = (uint32_t)(hw_uwPWMCmpr);
  263. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  264. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  265. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
  266. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  267. dma_init_struct.number = TIM1_DMA_NUM;
  268. dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH;
  269. dma_init(DMA0,DMA_CH4,&dma_init_struct);
  270. dma_circulation_enable(DMA0,DMA_CH4);
  271. /* enable DMA0 channel4 */
  272. //dma_channel_enable(DMA0,DMA_CH4);
  273. /*=======================================================================
  274. DMA0 Ch0 for ADC0
  275. =======================================================================*/
  276. dma_deinit(DMA0, DMA_CH0);
  277. /* initialize DMA single data mode */
  278. dma_init_struct.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
  279. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  280. dma_init_struct.memory_addr = (uint32_t)(hw_uwADC0);
  281. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  282. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  283. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
  284. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  285. dma_init_struct.number = ADC0_DMA_NUM;
  286. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  287. dma_init(DMA0, DMA_CH0, &dma_init_struct);
  288. dma_circulation_enable(DMA0, DMA_CH0);
  289. /* enable DMA0 channel0 */
  290. dma_channel_enable(DMA0, DMA_CH0);
  291. /*=======================================================================
  292. DMA1 Ch4 for ADC1
  293. =======================================================================*/
  294. /////////// !!!no dma for adc1
  295. // dma_deinit(DMA1, DMA_CH4);
  296. //
  297. // /* initialize DMA single data mode */
  298. // dma_init_struct.periph_addr = (ULONG)(&ADC_RDATA(ADC1));
  299. // dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  300. // dma_init_struct.memory_addr = (ULONG)(hw_uwADC2);
  301. // dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  302. // dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
  303. // dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT;
  304. // dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  305. // dma_init_struct.number = ADC2_DMA_NUM;
  306. // dma_init_struct.priority = DMA_PRIORITY_HIGH;
  307. // dma_init(DMA1, DMA_CH4, &dma_init_struct);
  308. //
  309. // dma_circulation_enable(DMA1, DMA_CH4);
  310. //
  311. // /* enable DMA1 channel4 */
  312. // dma_channel_enable(DMA1, DMA_CH4);
  313. /*=======================================================================
  314. DMA0 Ch5 for I2C0 transmission
  315. =======================================================================*/
  316. dma_deinit(DMA0, DMA_CH5);
  317. dma_init_struct.periph_addr = (uint32_t)(&I2C_DATA(I2C0));
  318. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  319. dma_init_struct.memory_addr = (uint32_t)(I2C_ubWriteBuffer);
  320. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  321. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  322. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  323. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  324. dma_init_struct.number = I2C1_TX_DMA_NUM;
  325. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  326. dma_init(DMA0, DMA_CH5, &dma_init_struct);
  327. dma_circulation_disable(DMA0, DMA_CH5);
  328. /* enable DMA0 channel5 */
  329. //dma_channel_enable(DMA0, DMA_CH5);
  330. /*=======================================================================
  331. DMA0 Ch6 for I2C0 receive
  332. =======================================================================*/
  333. dma_deinit(DMA0, DMA_CH6);
  334. dma_init_struct.periph_addr = (uint32_t)(&I2C_DATA(I2C0));
  335. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  336. dma_init_struct.memory_addr = (uint32_t)(I2C_ubReadBuffer[0]);
  337. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  338. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  339. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  340. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  341. dma_init_struct.number = I2C1_RX_DMA_NUM;
  342. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  343. dma_init(DMA0, DMA_CH6, &dma_init_struct);
  344. dma_circulation_disable(DMA0, DMA_CH6);
  345. /* enable DMA0 channel6 */
  346. //dma_channel_enable(DMA0, DMA_CH6);
  347. /*=======================================================================
  348. DMA1 Ch4 for UART3 transmission
  349. =======================================================================*/
  350. dma_deinit(DMA1, DMA_CH4);
  351. dma_init_struct.periph_addr = (uint32_t)(&USART_DATA(UART3));
  352. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  353. dma_init_struct.memory_addr = (uint32_t)(UART_pWriteBuffer);
  354. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  355. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  356. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  357. dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL;
  358. dma_init_struct.number = 64;
  359. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  360. dma_init(DMA1, DMA_CH4, &dma_init_struct);
  361. dma_circulation_disable(DMA1, DMA_CH4);
  362. /* enable DMA1 channel4 */
  363. //dma_channel_enable(DMA1, DMA_CH4);
  364. /*=======================================================================
  365. DMA1 Ch2 for UART3 receive
  366. =======================================================================*/
  367. dma_deinit(DMA1, DMA_CH2);
  368. dma_init_struct.periph_addr = (uint32_t)(&USART_DATA(UART3));
  369. dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
  370. dma_init_struct.memory_addr = (uint32_t)(UART_ubReadBuffer);
  371. dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
  372. dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT;
  373. dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT;
  374. dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY;
  375. dma_init_struct.number = 22;
  376. dma_init_struct.priority = DMA_PRIORITY_HIGH;
  377. dma_init(DMA1, DMA_CH2, &dma_init_struct);
  378. dma_circulation_disable(DMA1, DMA_CH2);
  379. /* enable DMA1 channel2 */
  380. dma_channel_enable(DMA1, DMA_CH2);
  381. }
  382. /*************************************************************************
  383. Function:
  384. Description:
  385. Call by:
  386. Input Variables:
  387. Output/Return Variables:
  388. Subroutine Call:
  389. Reference:
  390. *************************************************************************/
  391. void hw_voInitADC(void)
  392. {
  393. /*=======================================================================
  394. ADC0
  395. =======================================================================*/
  396. /* ADC reset */
  397. adc_deinit(ADC0);
  398. /* ADC mode config */
  399. adc_mode_config(ADC_MODE_FREE);
  400. /* ADC special function config */
  401. adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
  402. adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
  403. /* ADC data alignment config */
  404. adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
  405. /* ADC channel length config */
  406. adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 8);
  407. adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 3);
  408. /* ADC regular channel config */
  409. adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_5, ADC_SAMPLETIME_7POINT5); //PA5 Ubus
  410. adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_6, ADC_SAMPLETIME_7POINT5); //PA6 U_6V
  411. adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_7, ADC_SAMPLETIME_7POINT5); //PA7 U_5V
  412. adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_14, ADC_SAMPLETIME_7POINT5); //PC4 PCB_Temp
  413. adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_15, ADC_SAMPLETIME_7POINT5); //PC5 Motor_Temp
  414. adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_12, ADC_SAMPLETIME_7POINT5); //PC2 U_12V
  415. adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_13, ADC_SAMPLETIME_7POINT5); //PC3 Throtttle
  416. adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_3, ADC_SAMPLETIME_7POINT5); //PA3 Torque
  417. /* 8· = 0.55*8 = 4.44us */
  418. /* ADC inserted channel config */
  419. adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_7POINT5); //PA0 Iu
  420. adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_7POINT5); //PA1 Iv
  421. adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_7POINT5); //PA2 Iw
  422. /* ADC trigger config */
  423. adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
  424. adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T0_CH3);
  425. /* ADC external trigger enable */
  426. adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
  427. adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE);
  428. /* ADC DMA function enable */
  429. adc_dma_mode_enable(ADC0);
  430. /* enable ADC interface */
  431. adc_enable(ADC0);
  432. /* ADC calibration and reset calibration */
  433. adc_calibration_enable(ADC0);
  434. /* ADC software trigger enable */
  435. adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
  436. /*=======================================================================
  437. ADC1
  438. =======================================================================*/
  439. /* ADC reset */
  440. adc_deinit(ADC1);
  441. /* ADC special function config */
  442. adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE);
  443. adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, DISABLE);
  444. /* ADC data alignment config */
  445. adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT);
  446. /* ADC channel length config */
  447. adc_channel_length_config(ADC1, ADC_INSERTED_CHANNEL, 1);
  448. /* ADC inserted channel config */
  449. adc_inserted_channel_config(ADC1, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_7POINT5); //PA4 Ibus
  450. /* ADC trigger config */
  451. adc_external_trigger_source_config(ADC1, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T0_CH3);
  452. /* ADC external trigger enable */
  453. adc_external_trigger_config(ADC1, ADC_INSERTED_CHANNEL, ENABLE);
  454. /* enable ADC interface */
  455. adc_enable(ADC1);
  456. /* ADC calibration and reset calibration */
  457. adc_calibration_enable(ADC1);
  458. }
  459. /*************************************************************************
  460. Function:
  461. Description:
  462. Call by:
  463. Input Variables:
  464. Output/Return Variables:
  465. Subroutine Call:
  466. Reference:
  467. *************************************************************************/
  468. void hw_voInitTim0(void)
  469. {
  470. timer_oc_parameter_struct timer_ocintpara;
  471. timer_parameter_struct timer_initpara;
  472. timer_break_parameter_struct timer_breakpara;
  473. /* Timer reset */
  474. timer_deinit(TIMER0);
  475. timer_struct_para_init(&timer_initpara); // must init, or timer_initpara.counterdirection will be arbitrary
  476. /* TIMER0 configuration */
  477. timer_initpara.prescaler = 0;
  478. timer_initpara.alignedmode = TIMER_COUNTER_CENTER_BOTH;
  479. timer_initpara.period = HW_HPWM_PERIOD;
  480. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  481. timer_initpara.repetitioncounter = 0;
  482. timer_init(TIMER0,&timer_initpara);
  483. /* CH0, CH1 and CH2 configuration as PWM complementary output */
  484. timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  485. timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
  486. timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  487. timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
  488. timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  489. timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  490. timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);
  491. timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocintpara);
  492. timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocintpara);
  493. timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, HW_HHPWM_PERIOD);
  494. timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM1);
  495. timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE);
  496. timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_1, HW_HHPWM_PERIOD);
  497. timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM1);
  498. timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE);
  499. timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_2, HW_HHPWM_PERIOD);
  500. timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM1);
  501. timer_channel_output_shadow_config(TIMER0, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE);
  502. /* CH3 configuration as ADC trigger signal */
  503. timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  504. timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  505. timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  506. timer_channel_output_config(TIMER0, TIMER_CH_3, &timer_ocintpara);
  507. timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, 200);
  508. timer_channel_output_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_PWM1);
  509. //timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);
  510. timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_ENABLE);
  511. /* automatic output enable, break, dead time and lock configuration*/
  512. timer_breakpara.runoffstate = TIMER_ROS_STATE_ENABLE;
  513. timer_breakpara.ideloffstate = TIMER_IOS_STATE_ENABLE ;
  514. timer_breakpara.deadtime = cp_stControlPara.swIPMDeadTimeNs / 100 * TIM0CLK_KHZ / 1000 / 10;;
  515. timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW;
  516. timer_breakpara.outputautostate = TIMER_OUTAUTO_DISABLE;
  517. timer_breakpara.protectmode = TIMER_CCHP_PROT_OFF;
  518. timer_breakpara.breakstate = TIMER_BREAK_ENABLE;
  519. timer_break_config(TIMER0,&timer_breakpara);
  520. /* TIMER0 primary output enable */
  521. timer_primary_output_config(TIMER0,ENABLE);
  522. /* TIMER0 update DMA request enable */
  523. timer_dma_transfer_config(TIMER0,TIMER_DMACFG_DMATA_CH0CV,TIMER_DMACFG_DMATC_3TRANSFER);
  524. //timer_dma_enable(TIMER0,TIMER_DMA_UPD);
  525. /* auto-reload preload enable */
  526. timer_auto_reload_shadow_enable(TIMER0);
  527. /* select the master slave mode */
  528. timer_master_slave_mode_config(TIMER0, TIMER_MASTER_SLAVE_MODE_ENABLE);
  529. /* Update event is used as trigger output */
  530. timer_master_output_trigger_source_select(TIMER0, TIMER_TRI_OUT_SRC_UPDATE);
  531. /* TIMER0 counter enable */
  532. ////timer_enable(TIMER0);
  533. }
  534. /*************************************************************************
  535. Function:
  536. Description:
  537. Call by:
  538. Input Variables:
  539. Output/Return Variables:
  540. Subroutine Call:
  541. Reference:
  542. *************************************************************************/
  543. void hw_voInitTim1(void)
  544. {
  545. timer_ic_parameter_struct timer_icinitpara;
  546. timer_parameter_struct timer_initpara;
  547. timer_deinit(TIMER1);
  548. /* TIMER1 configuration */
  549. timer_initpara.prescaler = 99;
  550. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  551. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  552. timer_initpara.period = TIM1CLK_KHZ * 1000 / (1000 / 25); // period = 25ms
  553. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  554. timer_initpara.repetitioncounter = 0;
  555. timer_init(TIMER1,&timer_initpara);
  556. /* TIMER1 CH0 input capture configuration */
  557. timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING;
  558. timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI;
  559. timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1;
  560. timer_icinitpara.icfilter = 0x0;
  561. timer_input_capture_config(TIMER1,TIMER_CH_2,&timer_icinitpara);
  562. timer_input_capture_config(TIMER1,TIMER_CH_3,&timer_icinitpara);
  563. /* auto-reload preload enable */
  564. timer_auto_reload_shadow_enable(TIMER1);
  565. /* TIMER1 counter enable */
  566. ////timer_enable(TIMER1);
  567. }
  568. /*************************************************************************
  569. Function:
  570. Description:
  571. Call by:
  572. Input Variables:
  573. Output/Return Variables:
  574. Subroutine Call:
  575. Reference:
  576. *************************************************************************/
  577. void hw_voInitTim2(void)
  578. {
  579. timer_oc_parameter_struct timer_ocintpara;
  580. timer_parameter_struct timer_initpara;
  581. /* Timer reset */
  582. timer_deinit(TIMER2);
  583. /* TIMER2 configuration */
  584. timer_initpara.prescaler = 0;
  585. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  586. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  587. timer_initpara.period = TIM2CLK_KHZ / 70; // 70kHz for torque sensor
  588. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  589. timer_initpara.repetitioncounter = 0;
  590. timer_init(TIMER2,&timer_initpara);
  591. /* CH3 configuration for 70kHz output */
  592. timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  593. timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
  594. timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH;
  595. timer_ocintpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH;
  596. timer_ocintpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW;
  597. timer_ocintpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW;
  598. timer_channel_output_config(TIMER2, TIMER_CH_3, &timer_ocintpara);
  599. timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_3, (1028>>1));
  600. timer_channel_output_mode_config(TIMER2, TIMER_CH_3, TIMER_OC_MODE_PWM1);
  601. timer_channel_output_shadow_config(TIMER2, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE);
  602. /* TIMER2 primary output enable */
  603. timer_primary_output_config(TIMER2,ENABLE);
  604. /* auto-reload preload enable */
  605. timer_auto_reload_shadow_enable(TIMER2);
  606. /* TIMER2 counter enable */
  607. ////timer_enable(TIMER2);
  608. }
  609. /*************************************************************************
  610. Function:
  611. Description:
  612. Call by:
  613. Input Variables:
  614. Output/Return Variables:
  615. Subroutine Call:
  616. Reference:
  617. *************************************************************************/
  618. void hw_voInitTim3(void)
  619. {
  620. timer_parameter_struct timer_initpara;
  621. timer_deinit(TIMER3);
  622. /* TIMER configuration */
  623. timer_initpara.prescaler = 0;
  624. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  625. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  626. timer_initpara.period = (FTBC_HZ<<2)/FTBS_HZ-1;
  627. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  628. timer_initpara.repetitioncounter = 0;
  629. timer_init(TIMER3,&timer_initpara);
  630. /* auto-reload preload enable */
  631. timer_auto_reload_shadow_enable(TIMER3);
  632. /* slave mode selection: TIMER3 */
  633. timer_slave_mode_select(TIMER3, TIMER_SLAVE_MODE_EXTERNAL0);
  634. timer_input_trigger_source_select(TIMER3, TIMER_SMCFG_TRGSEL_ITI0);
  635. /* select the master slave mode */
  636. timer_master_slave_mode_config(TIMER3, TIMER_MASTER_SLAVE_MODE_ENABLE);
  637. /* TIMER3 counter enable */
  638. ////timer_enable(TIMER3);
  639. }
  640. /*************************************************************************
  641. Function:
  642. Description:
  643. Call by:
  644. Input Variables:
  645. Output/Return Variables:
  646. Subroutine Call:
  647. Reference:
  648. *************************************************************************/
  649. void hw_voInitTim5(void)
  650. {
  651. timer_parameter_struct timer_initpara;
  652. /* Timer reset */
  653. timer_deinit(TIMER5);
  654. /* TIMER5 configuration */
  655. timer_initpara.prescaler = 1;
  656. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  657. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  658. timer_initpara.period = HW_1MS_PERIOD;
  659. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  660. timer_initpara.repetitioncounter = 0;
  661. timer_init(TIMER5,&timer_initpara);
  662. /* auto-reload preload enable */
  663. timer_auto_reload_shadow_enable(TIMER5);
  664. /* TIMER5 counter enable */
  665. ////timer_enable(TIMER5);
  666. }
  667. /*************************************************************************
  668. Function:
  669. Description:
  670. Call by:
  671. Input Variables:
  672. Output/Return Variables:
  673. Subroutine Call:
  674. Reference:
  675. *************************************************************************/
  676. void hw_voInitTim6(void)
  677. {
  678. timer_parameter_struct timer_initpara;
  679. /* Timer reset */
  680. timer_deinit(TIMER6);
  681. /* configuration */
  682. timer_initpara.prescaler = 0;
  683. timer_initpara.alignedmode = TIMER_COUNTER_EDGE;
  684. timer_initpara.counterdirection = TIMER_COUNTER_UP;
  685. timer_initpara.period = (HW_PWM_PERIOD << 1) - 1;
  686. timer_initpara.clockdivision = TIMER_CKDIV_DIV1;
  687. timer_initpara.repetitioncounter = 0;
  688. timer_init(TIMER6,&timer_initpara);
  689. /* auto-reload preload enable */
  690. timer_auto_reload_shadow_enable(TIMER6);
  691. /* counter enable */
  692. ////timer_enable(TIMER6);
  693. }
  694. /*************************************************************************
  695. Function:
  696. Description:
  697. Call by:
  698. Input Variables:
  699. Output/Return Variables:
  700. Subroutine Call:
  701. Reference:
  702. *************************************************************************/
  703. void hw_voInitUART3(void)
  704. {
  705. /* reset USART */
  706. usart_deinit(UART3);
  707. /* configure USART baud rate value */
  708. usart_baudrate_set(UART3, 1500000U);
  709. /* configure USART parity function */
  710. usart_parity_config(UART3, USART_PM_NONE);
  711. /* configure USART word length */
  712. usart_word_length_set(UART3, USART_WL_8BIT);
  713. /* configure USART stop bit length */
  714. usart_stop_bit_set(UART3, USART_STB_1BIT);
  715. /* configure USART transmitter */
  716. usart_transmit_config(UART3, USART_TRANSMIT_ENABLE);
  717. /* configure USART receiver */
  718. usart_receive_config(UART3, USART_RECEIVE_ENABLE);
  719. /* USART DMA enable for transmission and receive */
  720. usart_dma_transmit_config(UART3, USART_DENT_ENABLE);
  721. usart_dma_receive_config(UART3, USART_DENR_ENABLE);
  722. /* enable USART */
  723. usart_enable(UART3);
  724. }
  725. /*************************************************************************
  726. Function:
  727. Description:
  728. Call by:
  729. Input Variables:
  730. Output/Return Variables:
  731. Subroutine Call:
  732. Reference:
  733. *************************************************************************/
  734. void hw_voInitSPI2(void)
  735. {
  736. spi_parameter_struct spi_init_struct;
  737. /* reset SPI */
  738. spi_i2s_deinit(SPI2);
  739. /* SPI2 parameter config */
  740. spi_init_struct.device_mode = SPI_MASTER;
  741. spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX;
  742. spi_init_struct.frame_size = SPI_FRAMESIZE_16BIT;
  743. spi_init_struct.nss = SPI_NSS_SOFT;
  744. spi_init_struct.endian = SPI_ENDIAN_MSB;
  745. spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE;
  746. spi_init_struct.prescale = SPI_PSC_8; // 36M/8=4.5Mhz
  747. spi_init(SPI2, &spi_init_struct);
  748. /* configure SPI CRC function */
  749. spi_crc_polynomial_set(SPI2, 7);
  750. spi_crc_on(SPI2);
  751. /* SPI DMA enable */
  752. // spi_dma_enable(SPI2, SPI_DMA_TRANSMIT);
  753. // spi_dma_enable(SPI2, SPI_DMA_RECEIVE);
  754. /* SPI enable */
  755. spi_enable(SPI2);
  756. }
  757. /*************************************************************************
  758. Function:
  759. Description:
  760. Call by:
  761. Input Variables:
  762. Output/Return Variables:
  763. Subroutine Call:
  764. Reference:
  765. *************************************************************************/
  766. void hw_voInitI2C0(void)
  767. {
  768. i2c_deinit(I2C0);
  769. /* configure I2C0 clock */
  770. i2c_clock_config(I2C0, 100000, I2C_DTCY_2);
  771. /* configure I2C0 address */
  772. i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C_SLAVEADDR_BLOCK3);
  773. /* enable acknowledge */
  774. i2c_ack_config(I2C0, I2C_ACK_ENABLE);
  775. // /* enable I2C0 DMA */
  776. // i2c_dma_config(I2C0, I2C_DMA_ON);
  777. /* enable I2C0 */
  778. i2c_enable(I2C0);
  779. }
  780. /*************************************************************************
  781. Function:
  782. Description:
  783. Call by:
  784. Input Variables:
  785. Output/Return Variables:
  786. Subroutine Call:
  787. Reference:
  788. *************************************************************************/
  789. void hw_voInitCAN(void)
  790. {
  791. can_parameter_struct can_parameter;
  792. can_filter_parameter_struct can_filter;
  793. can_struct_para_init(CAN_INIT_STRUCT, &can_parameter);
  794. can_struct_para_init(CAN_INIT_STRUCT, &can_filter);
  795. /* initialize CAN register */
  796. can_deinit(CAN0);
  797. /* initialize CAN */
  798. can_parameter.time_triggered = DISABLE;
  799. can_parameter.auto_bus_off_recovery = ENABLE;
  800. can_parameter.auto_wake_up = DISABLE;
  801. can_parameter.auto_retrans = DISABLE;
  802. can_parameter.rec_fifo_overwrite = DISABLE;
  803. can_parameter.trans_fifo_order = DISABLE;
  804. can_parameter.working_mode = CAN_NORMAL_MODE;
  805. can_parameter.resync_jump_width = CAN_BT_SJW_1TQ;
  806. can_parameter.time_segment_1 = CAN_BT_BS1_4TQ;
  807. can_parameter.time_segment_2 = CAN_BT_BS2_1TQ;
  808. /* baudrate 1Mbps */
  809. can_parameter.prescaler = 24; //36M/((1+4+1)*24)=250K
  810. can_init(CAN0, &can_parameter);
  811. /* initialize filter 0 */
  812. can_filter.filter_number = 0;
  813. can_filter.filter_mode = CAN_FILTERMODE_MASK;
  814. can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  815. can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_TO_MC_FILTER << 21) & 0xFFFF0000U) >> 16);
  816. can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_TO_MC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;
  817. can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_TO_MC_MASK << 21) & 0xFFFF0000U) >> 16);
  818. can_filter.filter_mask_low = (uint16_t)((((uint32_t)ID_TO_MC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA);
  819. can_filter.filter_fifo_number = CAN_FIFO0;
  820. can_filter.filter_enable = ENABLE;
  821. can_filter_init(&can_filter);
  822. /* initialize filter 1 */
  823. can_filter.filter_number = 1;
  824. can_filter.filter_mode = CAN_FILTERMODE_MASK;
  825. can_filter.filter_bits = CAN_FILTERBITS_32BIT;
  826. can_filter.filter_list_high = (uint16_t)((((uint32_t)ID_BC_FILTER << 21) & 0xFFFF0000U) >> 16);
  827. can_filter.filter_list_low = (uint16_t)(((uint32_t)ID_BC_FILTER << 21) | CAN_FF_STANDARD | CAN_FT_DATA) & 0xFFFF;
  828. can_filter.filter_mask_high = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF0000U) >> 16);
  829. can_filter.filter_mask_low = (uint16_t)((((uint32_t)ID_BC_MASK << 21) & 0xFFFF) | CAN_FF_STANDARD | CAN_FT_DATA);
  830. can_filter.filter_fifo_number = CAN_FIFO0;
  831. can_filter.filter_enable = ENABLE;
  832. can_filter_init(&can_filter);
  833. }
  834. /*************************************************************************
  835. Function:
  836. Description:
  837. Call by:
  838. Input Variables:
  839. Output/Return Variables:
  840. Subroutine Call:
  841. Reference:
  842. *************************************************************************/
  843. void hw_voInitSysTick(void)
  844. {
  845. /* Setup systick timer interrupts */
  846. /* Do not exceed 2^24-1=16777215 */
  847. SysTick_Config(SystemCoreClock / FSYSTICK_HZ);
  848. }
  849. /*************************************************************************
  850. Function:
  851. Description:
  852. Call by:
  853. Input Variables:
  854. Output/Return Variables:
  855. Subroutine Call:
  856. Reference:
  857. *************************************************************************/
  858. void hw_voInitInt(void)
  859. {
  860. /* Set the priority group */
  861. nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
  862. /* ADC, CMP0 and CMP1 interrupts */
  863. nvic_irq_enable((uint8_t)ADC0_1_IRQn, 0, 3);
  864. /* TIMER0 break, update, trigger and commutation interrupts */
  865. nvic_irq_enable((uint8_t)TIMER0_UP_TIMER9_IRQn, 1, 1);
  866. /* TIMER1 interrupt: CAP */
  867. nvic_irq_enable((uint8_t)TIMER1_IRQn, 2, 1);
  868. /* TIMER3 interrupt: TBS */
  869. nvic_irq_enable((uint8_t)TIMER3_IRQn, 3, 2);
  870. /* TIMER5 interrupt: 1ms */
  871. nvic_irq_enable((uint8_t)TIMER5_IRQn, 2, 3);
  872. //nvic_irq_enable(DMA0_Channel4_IRQn, 0, 1); // test
  873. /* DMA1 CH2 interrupt: Uart */
  874. nvic_irq_enable((uint8_t)DMA1_Channel2_IRQn, 3, 3);
  875. /* DMA1 CH4 interrupt: Uart */
  876. nvic_irq_enable((uint8_t)DMA1_Channel4_IRQn, 3, 3);
  877. /* CAN0 RX0 interrupt */
  878. nvic_irq_enable((uint8_t)CAN0_RX0_IRQn, 3, 3);
  879. /* CAN0 RX1 interrupt */
  880. nvic_irq_enable((uint8_t)CAN0_RX1_IRQn, 3, 3);
  881. nvic_irq_enable((uint8_t)EXTI10_15_IRQn, 3, 3);
  882. }
  883. /*************************************************************************
  884. Function:
  885. Description:
  886. Call by:
  887. Input Variables:
  888. Output/Return Variables:
  889. Subroutine Call:
  890. Reference:
  891. *************************************************************************/
  892. void hw_voEnInt(void)
  893. {
  894. /* ADC group conversion Interrupts enable */
  895. if(cp_stFlg.CurrentSampleModelSelect == SINGLERESISITANCE)
  896. {
  897. adc_interrupt_enable(ADC1 , ADC_INT_EOIC);
  898. }
  899. else if(cp_stFlg.CurrentSampleModelSelect == RDSON)
  900. {
  901. adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
  902. }
  903. else if(cp_stFlg.CurrentSampleModelSelect == COMBINATION)
  904. {
  905. adc_interrupt_enable(ADC0 , ADC_INT_EOIC);
  906. adc_interrupt_enable(ADC1 , ADC_INT_EOIC);
  907. //adc_interrupt_enable(ADC1 , ADC_INT_EOC);
  908. }
  909. else
  910. {
  911. //do nothing
  912. }
  913. /* TIM0 Interrupts enable */
  914. timer_interrupt_enable(TIMER0,TIMER_INT_UP);
  915. /* TIM1 Interrupts enable */
  916. timer_interrupt_enable(TIMER1,TIMER_INT_UP);
  917. timer_interrupt_enable(TIMER1,TIMER_INT_CH2);
  918. timer_interrupt_enable(TIMER1,TIMER_INT_CH3);
  919. /* TIM3 Interrupts enable */
  920. timer_interrupt_enable(TIMER3,TIMER_INT_UP);
  921. /* TIM5 Interrupts enable */
  922. timer_interrupt_enable(TIMER5,TIMER_INT_UP);
  923. //dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF);/* test */
  924. /* DMA1 channel2 full transfer finish interrupt */
  925. dma_interrupt_enable(DMA1, DMA_CH2, DMA_INT_FTF);
  926. /* DMA1 channel4 full transfer finish interrupt */
  927. dma_interrupt_enable(DMA1, DMA_CH4, DMA_INT_FTF);
  928. /* CAN0 receive FIFO0 not empty interrupt */
  929. can_interrupt_enable(CAN0, CAN_INT_RFNE0);
  930. /* CAN0 receive FIFO0 overfull interrupt */
  931. can_interrupt_enable(CAN0, CAN_INT_RFO0);
  932. /* CAN0 receive FIFO1 not empty interrupt */
  933. can_interrupt_enable(CAN0, CAN_INT_RFNE1);
  934. /* CAN0 receive FIFO1 overfull interrupt */
  935. can_interrupt_enable(CAN0, CAN_INT_RFO1);
  936. /* CAN0 error interrupt */
  937. can_interrupt_enable(CAN0, CAN_INT_ERR);
  938. /* CAN0 bus-off interrupt */
  939. can_interrupt_enable(CAN0, CAN_INT_BO);
  940. /* CAN0 warning error interrupt */
  941. can_interrupt_enable(CAN0, CAN_INT_WERR);
  942. /* CAN0 passive error interrupt */
  943. can_interrupt_enable(CAN0, CAN_INT_PERR);
  944. // CAN_ITConfig(CAN1, CAN_IT_FMP0, ENABLE); // FIFO 0 message pending Interrupt
  945. // CAN_ITConfig(CAN1, CAN_IT_FOV0, ENABLE); // FIFO 0 overrun Interrupt
  946. // CAN_ITConfig(CAN1, CAN_IT_FMP1, ENABLE); // FIFO 1 message pending Interrupt
  947. // CAN_ITConfig(CAN1, CAN_IT_FOV1, ENABLE); // FIFO 1 overrun Interrupt
  948. // //CAN_ITConfig(CAN1, CAN_IT_ERR, ENABLE); // Error Interrupt
  949. // CAN_ITConfig(CAN1, CAN_IT_LEC, ENABLE); // Last error code Interrupt
  950. // //CAN_ITConfig(CAN1, CAN_IT_BOF, ENABLE); // Bus-off Interrupt
  951. // //CAN_ITConfig(CAN1, CAN_IT_EPV, ENABLE); // Error passive Interrupt
  952. // //CAN_ITConfig(CAN1, CAN_IT_EWG, ENABLE); // Error warning Interrupt
  953. }
  954. /*************************************************************************
  955. Function:
  956. Description:
  957. Call by:
  958. Input Variables:
  959. Output/Return Variables:
  960. Subroutine Call:
  961. Reference:
  962. *************************************************************************/
  963. void hw_voTimEn(void)
  964. {
  965. /* TIMER0 counter enable */
  966. timer_enable(TIMER0);
  967. /* TIMER1 counter enable */
  968. timer_enable(TIMER1);
  969. /* TIMER2 counter enable */
  970. timer_enable(TIMER2);
  971. /* TIMER3 counter enable */
  972. timer_enable(TIMER3);
  973. /* TIMER5 counter enable */
  974. timer_enable(TIMER5);
  975. /* counter enable */
  976. timer_enable(TIMER6);
  977. }
  978. void hw_voPWMInit(void)
  979. {
  980. /* Set 50% duty */
  981. pwm_stGenOut.uwNewTIM1COMPR[0] = HW_HHPWM_PERIOD;
  982. pwm_stGenOut.uwNewTIM1COMPR[1] = HW_HHPWM_PERIOD;
  983. pwm_stGenOut.uwNewTIM1COMPR[2] = HW_HHPWM_PERIOD;
  984. pwm_stGenOut.uwNewTIM1COMPR[3] = HW_HHPWM_PERIOD;
  985. pwm_stGenOut.uwNewTIM1COMPR[4] = HW_HHPWM_PERIOD;
  986. pwm_stGenOut.uwNewTIM1COMPR[5] = HW_HHPWM_PERIOD;
  987. /* PWM off */
  988. hw_voPWMOff();
  989. /* Charge init */
  990. hw_uwChrgCt = 0;
  991. hw_blChrgOvrFlg = FALSE;
  992. }
  993. void hw_voPWMOn(void)
  994. {
  995. #if (0)
  996. timer_oc_parameter_struct timer_ocintpara;
  997. if (hw_blPWMOnFlg == FALSE)
  998. {
  999. /* CH0, CH1 and CH2 output enable */
  1000. timer_ocintpara.outputstate = TIMER_CCX_ENABLE;
  1001. timer_ocintpara.outputnstate = TIMER_CCXN_ENABLE;
  1002. timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);
  1003. timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocintpara);
  1004. timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocintpara);
  1005. /* Flag set */
  1006. hw_blPWMOnFlg = TRUE;
  1007. }
  1008. #endif
  1009. if (hw_blPWMOnFlg == FALSE)
  1010. {
  1011. /* CH0, CH1 set to "PWM mode 2" */
  1012. TIMER_CHCTL0(TIMER0) |= 0x7070;
  1013. /* CH2, CH3 set to "PWM mode 2" */
  1014. TIMER_CHCTL1(TIMER0) |= 0x7070;
  1015. /* CH0, CH1 and CH2, CH3 output enable */
  1016. TIMER_CHCTL2(TIMER0) |= 0x5555;
  1017. /* Flag set */
  1018. hw_blPWMOnFlg = TRUE;
  1019. }
  1020. }
  1021. void hw_voPWMOff(void)
  1022. {
  1023. #if (0)
  1024. timer_oc_parameter_struct timer_ocintpara;
  1025. if (hw_blPWMOnFlg == TRUE)
  1026. {
  1027. /* CH0, CH1 and CH2 output disable */
  1028. timer_ocintpara.outputstate = TIMER_CCX_DISABLE;
  1029. timer_ocintpara.outputnstate = TIMER_CCXN_DISABLE;
  1030. timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocintpara);
  1031. timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocintpara);
  1032. timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocintpara);
  1033. /* Flag set */
  1034. hw_blPWMOnFlg = FALSE;
  1035. }
  1036. #endif
  1037. if (hw_blPWMOnFlg == TRUE)
  1038. {
  1039. /* CH0, CH1 set to "Frozen" */
  1040. TIMER_CHCTL0(TIMER0) &= ~0x7070;
  1041. /* CH2, CH3 set to "Frozen" */
  1042. TIMER_CHCTL1(TIMER0) &= ~0x7070;
  1043. /* CH0, CH1 set to "Force inactive level" */
  1044. TIMER_CHCTL0(TIMER0) |= 0x4040;
  1045. /* CH2, CH3 set to "Force inactive level" */
  1046. TIMER_CHCTL1(TIMER0) |= 0x4040;
  1047. /* CH0, CH1 and CH2 complementary output disable */
  1048. TIMER_CHCTL2(TIMER0) &= ~0x0444;
  1049. /* Flag set */
  1050. hw_blPWMOnFlg = FALSE;
  1051. }
  1052. }
  1053. void hw_voCharge(void)
  1054. {
  1055. /* Set 50% duty */
  1056. pwm_stGenOut.uwNewTIM1COMPR[0] = HW_HHPWM_PERIOD;
  1057. pwm_stGenOut.uwNewTIM1COMPR[1] = HW_HHPWM_PERIOD;
  1058. pwm_stGenOut.uwNewTIM1COMPR[2] = HW_HHPWM_PERIOD;
  1059. pwm_stGenOut.uwNewTIM1COMPR[3] = HW_HHPWM_PERIOD;
  1060. pwm_stGenOut.uwNewTIM1COMPR[4] = HW_HHPWM_PERIOD;
  1061. pwm_stGenOut.uwNewTIM1COMPR[5] = HW_HHPWM_PERIOD;
  1062. /* PWM on */
  1063. hw_voPWMOn();
  1064. ++hw_uwChrgCt;
  1065. if (hw_uwChrgCt > cp_stControlPara.swIPMHvicChrgMs)
  1066. {
  1067. hw_uwChrgCt = 0;
  1068. hw_blChrgOvrFlg = TRUE;
  1069. }
  1070. }
  1071. /* Three phase short */
  1072. void hw_voThrPhsShrt(void)
  1073. {
  1074. /* Set 0% duty */
  1075. pwm_stGenOut.uwNewTIM1COMPR[0] = HW_HPWM_PERIOD;
  1076. pwm_stGenOut.uwNewTIM1COMPR[1] = HW_HPWM_PERIOD;
  1077. pwm_stGenOut.uwNewTIM1COMPR[2] = HW_HPWM_PERIOD;
  1078. pwm_stGenOut.uwNewTIM1COMPR[3] = HW_HPWM_PERIOD;
  1079. pwm_stGenOut.uwNewTIM1COMPR[4] = HW_HPWM_PERIOD;
  1080. pwm_stGenOut.uwNewTIM1COMPR[5] = HW_HPWM_PERIOD;
  1081. pwm_stGenOut.uwFirstTrigCOMPR = HW_HHHPWM_PERIOD;
  1082. pwm_stGenOut.uwSecondTrigCOMPR = HW_HPWM_PERIOD - HW_HHHPWM_PERIOD;
  1083. /* PWM on */
  1084. hw_voPWMOn();
  1085. }
  1086. /*************************************************************************
  1087. Function
  1088. Description: Initialize UART
  1089. Call by: ;
  1090. Input Variables: N/A
  1091. Output/Return Variables: N/A
  1092. Subroutine Call: ...;
  1093. Reference: N/A
  1094. ****************************************************************/
  1095. void hw_voIWDGInit(UWORD prer, UWORD rlr)
  1096. {
  1097. /* enable RCU_IRC40K */
  1098. rcu_osci_on(RCU_IRC40K);
  1099. /* wait till RCU_IRC40K is ready */
  1100. rcu_osci_stab_wait(RCU_IRC40K);
  1101. fwdgt_write_enable();
  1102. fwdgt_prescaler_value_config(prer);
  1103. fwdgt_reload_value_config(rlr);
  1104. fwdgt_counter_reload();
  1105. fwdgt_enable();
  1106. }
  1107. /*************************************************************************
  1108. Copyright (c) 2022 Welling Motor Technology(Shanghai) Co. Ltd.
  1109. All rights reserved.
  1110. *************************************************************************/
  1111. #ifdef _HWSETUP_C_
  1112. #undef _HWSETUP_C_ /* parasoft-suppress MISRA2004-19_6 "本项目中无法更改,后续避免使用" */
  1113. #endif
  1114. /************************************************************************
  1115. End of this File (EOF)!
  1116. Do not put anything after this part!
  1117. *************************************************************************/