board_config.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430
  1. /**********************************
  2. * 文件名称: board_config.c
  3. * 功能描述: 硬件初始化配置文件
  4. * 主要功能:
  5. * 1. 系统时钟配置
  6. * 2. GPIO端口初始化
  7. * 3. Hall传感器配置
  8. * 4. PWM输出配置
  9. * 5. DMA配置(用于ADC3规则组)
  10. * 6. ADC采样配置(三相电流用注入组,其他用ADC3规则组)
  11. * 7. 按键输入配置
  12. * 8. 中断优先级配置
  13. *
  14. * 注意事项:
  15. * - 三相电流使用注入组:
  16. * - ADC1注入组:A相电流
  17. * - ADC2注入组:B相电流
  18. * - ADC3注入组:C相电流
  19. * - ADC3规则组(5通道:U/V/W电压 + 温度 + 母线电压),使用DMA循环传输
  20. * - PWM使用TIM1,频率为10kHz
  21. * - Hall传感器使用TIM5进行捕获
  22. **********************************/
  23. #include "main.h"
  24. #include "board_config.h"
  25. /**********************************
  26. * 系统时钟配置
  27. * 硬件平台: 正点原子 STM32F407 电机开发板
  28. * 外部晶振: 8MHz (关键!必须与实际硬件匹配)
  29. * 系统时钟: 168MHz
  30. **********************************/
  31. #include "stm32f4xx.h"
  32. /**
  33. * @brief 系统时钟配置函数
  34. */
  35. static void SystemClock_Config(void)
  36. {
  37. RCC_ClocksTypeDef RCC_ClocksStatus;
  38. RCC_DeInit();
  39. RCC_HSEConfig(RCC_HSE_ON);
  40. while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {}
  41. RCC_HCLKConfig(RCC_SYSCLK_Div1);
  42. RCC_PCLK2Config(RCC_HCLK_Div2);
  43. RCC_PCLK1Config(RCC_HCLK_Div4);
  44. RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 2, 7);
  45. RCC_PLLCmd(ENABLE);
  46. while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
  47. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
  48. while (RCC_GetSYSCLKSource() != 0x08) {}
  49. RCC_GetClocksFreq(&RCC_ClocksStatus);
  50. SystemCoreClock = RCC_ClocksStatus.SYSCLK_Frequency;
  51. FLASH_SetLatency(FLASH_Latency_5);
  52. FLASH_PrefetchBufferCmd(ENABLE);
  53. FLASH_InstructionCacheCmd(ENABLE);
  54. FLASH_DataCacheCmd(ENABLE);
  55. }
  56. /**
  57. * @brief 硬件初始化函数
  58. */
  59. void hard_init(void)
  60. {
  61. GPIO_InitTypeDef GPIO_InitStructure;
  62. TIM_TimeBaseInitTypeDef PWM_TIM_TimeBaseStructure;
  63. TIM_OCInitTypeDef PWM_TIM_OCInitStructure;
  64. TIM_BDTRInitTypeDef PWM_TIM_BDTRInitStructure;
  65. NVIC_InitTypeDef NVIC_InitStructure;
  66. DMA_InitTypeDef DMA_InitStructure;
  67. ADC_InitTypeDef ADC_InitStructure;
  68. ADC_InitTypeDef ADC3_InitStructure;
  69. ADC_CommonInitTypeDef ADC_CommonInitStructure;
  70. EXTI_InitTypeDef EXTI_InitStructure;
  71. TIM_TimeBaseInitTypeDef TIM_HALLTimeBaseInitStructure;
  72. TIM_ICInitTypeDef TIM_HALLICInitStructure;
  73. RCC_ClocksTypeDef RCC_Clocks;
  74. /* ==================== 1. 系统时钟配置 ==================== */
  75. SystemClock_Config();
  76. RCC_GetClocksFreq(&RCC_Clocks);
  77. /* ==================== 2. GPIO 时钟使能 ==================== */
  78. RCC_AHB1PeriphClockCmd(KEY_1_GPIO_CLK|KEY_2_GPIO_CLK|KEY_3_GPIO_CLK, ENABLE);
  79. RCC_AHB1PeriphClockCmd(PWM_AH_GPIO_CLK|PWM_BH_GPIO_CLK|PWM_CH_GPIO_CLK, ENABLE);
  80. RCC_AHB1PeriphClockCmd(PWM_AL_GPIO_CLK|PWM_BL_GPIO_CLK|PWM_CL_GPIO_CLK, ENABLE);
  81. RCC_AHB1PeriphClockCmd(HALL_CH1_GPIO_CLK|HALL_CH2_GPIO_CLK|HALL_CH3_GPIO_CLK, ENABLE);
  82. RCC_AHB1PeriphClockCmd(A_CURRENT_ADC_GPIO_CLK|B_CURRENT_ADC_GPIO_CLK|C_CURRENT_ADC_GPIO_CLK, ENABLE);
  83. RCC_AHB1PeriphClockCmd(VBUS_ADC_GPIO_CLK|TEMPERATURE_ADC_GPIO_CLK, ENABLE);
  84. RCC_AHB1PeriphClockCmd(U_VOLT_ADC_GPIO_CLK|V_VOLT_ADC_GPIO_CLK|W_VOLT_ADC_GPIO_CLK, ENABLE);
  85. RCC_AHB1PeriphClockCmd(USER_LED1_GPIO_CLK|USER_LED2_GPIO_CLK, ENABLE);
  86. RCC_AHB1PeriphClockCmd(USER_EN_GPIO_CLK,ENABLE);
  87. /* ==================== 3. 外设时钟使能 ==================== */
  88. RCC_APB2PeriphClockCmd(PWM_TIM_CLK, ENABLE);
  89. RCC_APB2PeriphClockCmd(SAMPLE_ADC1_CLK, ENABLE); // ADC1
  90. RCC_APB2PeriphClockCmd(SAMPLE_ADC2_CLK, ENABLE); // ADC2
  91. RCC_APB2PeriphClockCmd(SAMPLE_ADC3_CLK, ENABLE); // ADC3
  92. RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
  93. RCC_APB1PeriphClockCmd(HALL_TIM_CLK, ENABLE);
  94. RCC_AHB1PeriphClockCmd(DMA2_CLK, ENABLE);
  95. /* ==================== 4. SysTick 配置 ==================== */
  96. SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
  97. /* ==================== 5. Hall 传感器配置 ==================== */
  98. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  99. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  100. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  101. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  102. GPIO_InitStructure.GPIO_Pin = HALL_CH1_PIN;
  103. GPIO_Init(HALL_CH1_GPIO_PORT, &GPIO_InitStructure);
  104. GPIO_InitStructure.GPIO_Pin = HALL_CH2_PIN;
  105. GPIO_Init(HALL_CH2_GPIO_PORT, &GPIO_InitStructure);
  106. GPIO_InitStructure.GPIO_Pin = HALL_CH3_PIN;
  107. GPIO_Init(HALL_CH3_GPIO_PORT, &GPIO_InitStructure);
  108. GPIO_PinAFConfig(HALL_CH1_GPIO_PORT, HALL_CH1_SOURCE, HALL_CH1_AF);
  109. GPIO_PinAFConfig(HALL_CH2_GPIO_PORT, HALL_CH2_SOURCE, HALL_CH2_AF);
  110. GPIO_PinAFConfig(HALL_CH3_GPIO_PORT, HALL_CH3_SOURCE, HALL_CH3_AF);
  111. TIM_DeInit(HALL_TIM);
  112. TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);
  113. TIM_HALLTimeBaseInitStructure.TIM_Period = 0xffffffff;
  114. TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  115. TIM_TimeBaseInit(HALL_TIM, &TIM_HALLTimeBaseInitStructure);
  116. TIM_ICStructInit(&TIM_HALLICInitStructure);
  117. TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1;
  118. TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
  119. TIM_HALLICInitStructure.TIM_ICFilter = 0x0f;
  120. TIM_ICInit(HALL_TIM, &TIM_HALLICInitStructure);
  121. TIM_PrescalerConfig(HALL_TIM, 0, TIM_PSCReloadMode_Immediate);
  122. TIM_InternalClockConfig(HALL_TIM);
  123. TIM_SelectHallSensor(HALL_TIM, ENABLE);
  124. TIM_SelectInputTrigger(HALL_TIM, TIM_TS_TI1FP1);
  125. TIM_SelectSlaveMode(HALL_TIM, TIM_SlaveMode_Reset);
  126. TIM_ClearFlag(HALL_TIM, TIM_FLAG_Update | TIM_FLAG_CC1 | TIM_FLAG_CC2 |
  127. TIM_FLAG_CC3 | TIM_FLAG_CC4 | TIM_FLAG_Trigger |
  128. TIM_FLAG_CC1OF | TIM_FLAG_CC2OF | TIM_FLAG_CC3OF | TIM_FLAG_CC4OF);
  129. TIM_ITConfig(HALL_TIM, TIM_IT_CC1, ENABLE);
  130. TIM_SetCounter(HALL_TIM, 0);
  131. TIM_Cmd(HALL_TIM, ENABLE);
  132. /* ==================== 6. LED 指示灯配置 ==================== */
  133. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  134. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  135. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  136. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  137. GPIO_InitStructure.GPIO_Pin = USER_LED1_PIN;
  138. GPIO_Init(USER_LED1_GPIO_PORT, &GPIO_InitStructure);
  139. GPIO_InitStructure.GPIO_Pin = USER_LED2_PIN;
  140. GPIO_Init(USER_LED2_GPIO_PORT, &GPIO_InitStructure);
  141. /* ==================== 7. PWM 配置 ==================== */
  142. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
  143. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  144. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  145. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  146. GPIO_InitStructure.GPIO_Pin = PWM_AH_PIN;
  147. GPIO_Init(PWM_AH_GPIO_PORT, &GPIO_InitStructure);
  148. GPIO_InitStructure.GPIO_Pin = PWM_AL_PIN;
  149. GPIO_Init(PWM_AL_GPIO_PORT, &GPIO_InitStructure);
  150. GPIO_InitStructure.GPIO_Pin = PWM_BH_PIN;
  151. GPIO_Init(PWM_BH_GPIO_PORT, &GPIO_InitStructure);
  152. GPIO_InitStructure.GPIO_Pin = PWM_BL_PIN;
  153. GPIO_Init(PWM_BL_GPIO_PORT, &GPIO_InitStructure);
  154. GPIO_InitStructure.GPIO_Pin = PWM_CH_PIN;
  155. GPIO_Init(PWM_CH_GPIO_PORT, &GPIO_InitStructure);
  156. GPIO_InitStructure.GPIO_Pin = PWM_CL_PIN;
  157. GPIO_Init(PWM_CL_GPIO_PORT, &GPIO_InitStructure);
  158. GPIO_PinAFConfig(PWM_AH_GPIO_PORT, PWM_AH_SOURCE, PWM_AH_AF);
  159. GPIO_PinAFConfig(PWM_AL_GPIO_PORT, PWM_AL_SOURCE, PWM_AL_AF);
  160. GPIO_PinAFConfig(PWM_BH_GPIO_PORT, PWM_BH_SOURCE, PWM_BH_AF);
  161. GPIO_PinAFConfig(PWM_BL_GPIO_PORT, PWM_BL_SOURCE, PWM_BL_AF);
  162. GPIO_PinAFConfig(PWM_CH_GPIO_PORT, PWM_CH_SOURCE, PWM_CH_AF);
  163. GPIO_PinAFConfig(PWM_CL_GPIO_PORT, PWM_CL_SOURCE, PWM_CL_AF);
  164. TIM_DeInit(PWM_TIM);
  165. TIM_TimeBaseStructInit(&PWM_TIM_TimeBaseStructure);
  166. PWM_TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
  167. PWM_TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
  168. PWM_TIM_TimeBaseStructure.TIM_Period = PWM_TIM_PULSE;
  169. PWM_TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  170. PWM_TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  171. TIM_TimeBaseInit(PWM_TIM, &PWM_TIM_TimeBaseStructure);
  172. TIM_OCStructInit(&PWM_TIM_OCInitStructure);
  173. PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  174. PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  175. PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  176. PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE >> 1;
  177. PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  178. PWM_TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
  179. PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  180. PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  181. TIM_OC1Init(PWM_TIM, &PWM_TIM_OCInitStructure);
  182. TIM_OC2Init(PWM_TIM, &PWM_TIM_OCInitStructure);
  183. TIM_OC3Init(PWM_TIM, &PWM_TIM_OCInitStructure);
  184. PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  185. PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  186. PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  187. PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE;
  188. PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  189. PWM_TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  190. PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  191. PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  192. TIM_OC4Init(PWM_TIM, &PWM_TIM_OCInitStructure);
  193. PWM_TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
  194. PWM_TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
  195. PWM_TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
  196. PWM_TIM_BDTRInitStructure.TIM_DeadTime = PWM_DEAD_TIME;
  197. PWM_TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  198. PWM_TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
  199. PWM_TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
  200. TIM_BDTRConfig(PWM_TIM, &PWM_TIM_BDTRInitStructure);
  201. TIM_Cmd(PWM_TIM, ENABLE);
  202. PWM_TIM->CCR1 = PWM_TIM_PULSE >> 1;
  203. PWM_TIM->CCR2 = PWM_TIM_PULSE >> 1;
  204. PWM_TIM->CCR3 = PWM_TIM_PULSE >> 1;
  205. PWM_TIM->CCR4 = PWM_TIM_PULSE - 1;
  206. /* ==================== 8. DMA 配置(用于 ADC3 规则组) ==================== */
  207. // ADC3 规则组使用 DMA2_Stream1, Channel_2
  208. DMA_DeInit(DMA2_Stream1);
  209. DMA_InitStructure.DMA_Channel = DMA_CHANNEL2;
  210. DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_ADDRESS;
  211. DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValue;
  212. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
  213. DMA_InitStructure.DMA_BufferSize = ADC3_DMA_BUFFER_SIZE; // 5个通道
  214. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  215. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
  216. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  217. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  218. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  219. DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  220. DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
  221. DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
  222. DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
  223. DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
  224. DMA_Init(DMA2_Stream1, &DMA_InitStructure);
  225. DMA_Cmd(DMA2_Stream1, ENABLE);
  226. /* ==================== 9. ADC 引脚配置 ==================== */
  227. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
  228. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  229. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  230. // ADC1 引脚 (A相电流)
  231. GPIO_InitStructure.GPIO_Pin = A_CURRENT_ADC_PIN;
  232. GPIO_Init(A_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
  233. // ADC2 引脚 (B相电流)
  234. GPIO_InitStructure.GPIO_Pin = B_CURRENT_ADC_PIN;
  235. GPIO_Init(B_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
  236. // ADC3 引脚 (C相电流 + U/V/W电压 + 温度 + 母线电压)
  237. GPIO_InitStructure.GPIO_Pin = C_CURRENT_ADC_PIN;
  238. GPIO_Init(C_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
  239. GPIO_InitStructure.GPIO_Pin = U_VOLT_ADC_PIN;
  240. GPIO_Init(U_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
  241. GPIO_InitStructure.GPIO_Pin = V_VOLT_ADC_PIN;
  242. GPIO_Init(V_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
  243. GPIO_InitStructure.GPIO_Pin = W_VOLT_ADC_PIN;
  244. GPIO_Init(W_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
  245. GPIO_InitStructure.GPIO_Pin = TEMPERATURE_ADC_PIN;
  246. GPIO_Init(TEMPERATURE_ADC_GPIO_PORT, &GPIO_InitStructure);
  247. GPIO_InitStructure.GPIO_Pin = VBUS_ADC_PIN;
  248. GPIO_Init(VBUS_ADC_GPIO_PORT, &GPIO_InitStructure);
  249. /* ==================== 9.1 ADC1 配置(注入组:A相电流) ==================== */
  250. ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
  251. ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
  252. ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
  253. ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
  254. ADC_CommonInit(&ADC_CommonInitStructure);
  255. ADC_StructInit(&ADC_InitStructure);
  256. ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
  257. ADC_InitStructure.ADC_ScanConvMode = DISABLE;
  258. ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  259. ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  260. ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  261. ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  262. ADC_InitStructure.ADC_NbrOfConversion = 0;
  263. ADC_Init(SAMPLE_ADC1, &ADC_InitStructure);
  264. // ADC1 注入组配置(A相电流)
  265. ADC_InjectedSequencerLengthConfig(SAMPLE_ADC1, 1);
  266. ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC1, ADC_ExternalTrigInjecConv_T1_CC4);
  267. ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC1, ADC_ExternalTrigInjecConvEdge_Rising);
  268. ADC_InjectedChannelConfig(SAMPLE_ADC1, A_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
  269. ADC_ITConfig(SAMPLE_ADC1, ADC_IT_JEOC, ENABLE);
  270. ADC_ClearFlag(SAMPLE_ADC1, ADC_FLAG_JEOC);
  271. ADC_Cmd(SAMPLE_ADC1, ENABLE);
  272. /* ==================== 9.2 ADC2 配置(注入组:B相电流) ==================== */
  273. ADC_Init(SAMPLE_ADC2, &ADC_InitStructure);
  274. ADC_InjectedSequencerLengthConfig(SAMPLE_ADC2, 1);
  275. ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC2, ADC_ExternalTrigInjecConv_T1_CC4);
  276. ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC2, ADC_ExternalTrigInjecConvEdge_Rising);
  277. ADC_InjectedChannelConfig(SAMPLE_ADC2, B_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
  278. ADC_ITConfig(SAMPLE_ADC2, ADC_IT_JEOC, ENABLE);
  279. ADC_ClearFlag(SAMPLE_ADC2, ADC_FLAG_JEOC);
  280. ADC_Cmd(SAMPLE_ADC2, ENABLE);
  281. /* ==================== 9.3 ADC3 配置(注入组:C相电流 + 规则组:其他5路) ==================== */
  282. // ADC3 配置
  283. ADC_StructInit(&ADC3_InitStructure);
  284. ADC3_InitStructure.ADC_ContinuousConvMode = ENABLE;
  285. ADC3_InitStructure.ADC_ScanConvMode = ENABLE;
  286. ADC3_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  287. ADC3_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
  288. ADC3_InitStructure.ADC_Resolution = ADC_Resolution_12b;
  289. ADC3_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
  290. ADC3_InitStructure.ADC_NbrOfConversion = ADC3_DMA_BUFFER_SIZE; // 规则组5个通道
  291. ADC_Init(SAMPLE_ADC3, &ADC3_InitStructure);
  292. // ADC3 注入组配置(C相电流)
  293. ADC_InjectedSequencerLengthConfig(SAMPLE_ADC3, 1);
  294. ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC3, ADC_ExternalTrigInjecConv_T1_CC4);
  295. ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC3, ADC_ExternalTrigInjecConvEdge_Rising);
  296. ADC_InjectedChannelConfig(SAMPLE_ADC3, C_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
  297. ADC_ITConfig(SAMPLE_ADC3, ADC_IT_JEOC, ENABLE);
  298. ADC_ClearFlag(SAMPLE_ADC3, ADC_FLAG_JEOC);
  299. // ADC3 规则组通道配置(U/V/W电压 + 温度 + 母线电压)
  300. ADC_RegularChannelConfig(SAMPLE_ADC3, U_VOLT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
  301. ADC_RegularChannelConfig(SAMPLE_ADC3, V_VOLT_ADC_CHANNEL, 2, ADC_SampleTime_15Cycles);
  302. ADC_RegularChannelConfig(SAMPLE_ADC3, W_VOLT_ADC_CHANNEL, 3, ADC_SampleTime_15Cycles);
  303. ADC_RegularChannelConfig(SAMPLE_ADC3, TEMPERATURE_ADC_CHANNEL, 4, ADC_SampleTime_15Cycles);
  304. ADC_RegularChannelConfig(SAMPLE_ADC3, VBUS_ADC_CHANNEL, 5, ADC_SampleTime_15Cycles);
  305. // DMA 相关
  306. ADC_DMACmd(SAMPLE_ADC3, ENABLE);
  307. ADC_DMARequestAfterLastTransferCmd(SAMPLE_ADC3, ENABLE);
  308. // 使能ADC3并启动转换
  309. ADC_Cmd(SAMPLE_ADC3, ENABLE);
  310. ADC_SoftwareStartConv(SAMPLE_ADC3);
  311. /* ==================== 10. 按键配置 ==================== */
  312. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
  313. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
  314. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
  315. GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
  316. GPIO_Init(KEY_1_GPIO_PORT, &GPIO_InitStructure);
  317. GPIO_InitStructure.GPIO_Pin = KEY_2_PIN;
  318. GPIO_Init(KEY_2_GPIO_PORT, &GPIO_InitStructure);
  319. GPIO_InitStructure.GPIO_Pin = KEY_3_PIN;
  320. GPIO_Init(KEY_3_GPIO_PORT, &GPIO_InitStructure);
  321. SYSCFG_EXTILineConfig(KEY_1_EXTI_GPIO_PORT, KEY_1_EXTI_SOURCE);
  322. SYSCFG_EXTILineConfig(KEY_2_EXTI_GPIO_PORT, KEY_2_EXTI_SOURCE);
  323. SYSCFG_EXTILineConfig(KEY_3_EXTI_GPIO_PORT, KEY_3_EXTI_SOURCE);
  324. EXTI_InitStructure.EXTI_Line = KEY_1_EXTI_LINE | KEY_2_EXTI_LINE | KEY_3_EXTI_LINE;
  325. EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  326. EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
  327. EXTI_InitStructure.EXTI_LineCmd = ENABLE;
  328. EXTI_Init(&EXTI_InitStructure);
  329. // EN PIN
  330. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
  331. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
  332. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  333. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
  334. GPIO_InitStructure.GPIO_Pin = USER_EN_PIN;
  335. GPIO_Init(USER_EN_GPIO_PORT, &GPIO_InitStructure);
  336. GPIO_ResetBits(USER_EN_GPIO_PORT, USER_EN_PIN);
  337. /* ==================== 11. 中断优先级配置 ==================== */
  338. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  339. // ADC1/ADC2/ADC3 注入组中断(共用ADC_IRQn)
  340. NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
  341. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
  342. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  343. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  344. NVIC_Init(&NVIC_InitStructure);
  345. // DMA2 Stream1 中断
  346. NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
  347. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  348. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  349. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  350. NVIC_Init(&NVIC_InitStructure);
  351. DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE);
  352. // 按键中断
  353. NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
  354. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
  355. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
  356. NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  357. NVIC_Init(&NVIC_InitStructure);
  358. NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
  359. NVIC_Init(&NVIC_InitStructure);
  360. NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
  361. NVIC_Init(&NVIC_InitStructure);
  362. // TIM5 霍尔中断
  363. NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
  364. NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
  365. NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  366. NVIC_Init(&NVIC_InitStructure);
  367. }