| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430 |
- /**********************************
- * 文件名称: board_config.c
- * 功能描述: 硬件初始化配置文件
- * 主要功能:
- * 1. 系统时钟配置
- * 2. GPIO端口初始化
- * 3. Hall传感器配置
- * 4. PWM输出配置
- * 5. DMA配置(用于ADC3规则组)
- * 6. ADC采样配置(三相电流用注入组,其他用ADC3规则组)
- * 7. 按键输入配置
- * 8. 中断优先级配置
- *
- * 注意事项:
- * - 三相电流使用注入组:
- * - ADC1注入组:A相电流
- * - ADC2注入组:B相电流
- * - ADC3注入组:C相电流
- * - ADC3规则组(5通道:U/V/W电压 + 温度 + 母线电压),使用DMA循环传输
- * - PWM使用TIM1,频率为10kHz
- * - Hall传感器使用TIM5进行捕获
- **********************************/
- #include "main.h"
- #include "board_config.h"
- /**********************************
- * 系统时钟配置
- * 硬件平台: 正点原子 STM32F407 电机开发板
- * 外部晶振: 8MHz (关键!必须与实际硬件匹配)
- * 系统时钟: 168MHz
- **********************************/
- #include "stm32f4xx.h"
- /**
- * @brief 系统时钟配置函数
- */
- static void SystemClock_Config(void)
- {
- RCC_ClocksTypeDef RCC_ClocksStatus;
-
- RCC_DeInit();
- RCC_HSEConfig(RCC_HSE_ON);
-
- while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET) {}
-
- RCC_HCLKConfig(RCC_SYSCLK_Div1);
- RCC_PCLK2Config(RCC_HCLK_Div2);
- RCC_PCLK1Config(RCC_HCLK_Div4);
-
- RCC_PLLConfig(RCC_PLLSource_HSE, 8, 336, 2, 7);
- RCC_PLLCmd(ENABLE);
-
- while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) {}
-
- RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
-
- while (RCC_GetSYSCLKSource() != 0x08) {}
-
- RCC_GetClocksFreq(&RCC_ClocksStatus);
- SystemCoreClock = RCC_ClocksStatus.SYSCLK_Frequency;
-
- FLASH_SetLatency(FLASH_Latency_5);
- FLASH_PrefetchBufferCmd(ENABLE);
- FLASH_InstructionCacheCmd(ENABLE);
- FLASH_DataCacheCmd(ENABLE);
- }
- /**
- * @brief 硬件初始化函数
- */
- void hard_init(void)
- {
- GPIO_InitTypeDef GPIO_InitStructure;
- TIM_TimeBaseInitTypeDef PWM_TIM_TimeBaseStructure;
- TIM_OCInitTypeDef PWM_TIM_OCInitStructure;
- TIM_BDTRInitTypeDef PWM_TIM_BDTRInitStructure;
- NVIC_InitTypeDef NVIC_InitStructure;
- DMA_InitTypeDef DMA_InitStructure;
- ADC_InitTypeDef ADC_InitStructure;
- ADC_InitTypeDef ADC3_InitStructure;
- ADC_CommonInitTypeDef ADC_CommonInitStructure;
- EXTI_InitTypeDef EXTI_InitStructure;
- TIM_TimeBaseInitTypeDef TIM_HALLTimeBaseInitStructure;
- TIM_ICInitTypeDef TIM_HALLICInitStructure;
- RCC_ClocksTypeDef RCC_Clocks;
-
- /* ==================== 1. 系统时钟配置 ==================== */
- SystemClock_Config();
- RCC_GetClocksFreq(&RCC_Clocks);
-
- /* ==================== 2. GPIO 时钟使能 ==================== */
- RCC_AHB1PeriphClockCmd(KEY_1_GPIO_CLK|KEY_2_GPIO_CLK|KEY_3_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(PWM_AH_GPIO_CLK|PWM_BH_GPIO_CLK|PWM_CH_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(PWM_AL_GPIO_CLK|PWM_BL_GPIO_CLK|PWM_CL_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(HALL_CH1_GPIO_CLK|HALL_CH2_GPIO_CLK|HALL_CH3_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(A_CURRENT_ADC_GPIO_CLK|B_CURRENT_ADC_GPIO_CLK|C_CURRENT_ADC_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(VBUS_ADC_GPIO_CLK|TEMPERATURE_ADC_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(U_VOLT_ADC_GPIO_CLK|V_VOLT_ADC_GPIO_CLK|W_VOLT_ADC_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(USER_LED1_GPIO_CLK|USER_LED2_GPIO_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(USER_EN_GPIO_CLK,ENABLE);
-
- /* ==================== 3. 外设时钟使能 ==================== */
- RCC_APB2PeriphClockCmd(PWM_TIM_CLK, ENABLE);
- RCC_APB2PeriphClockCmd(SAMPLE_ADC1_CLK, ENABLE); // ADC1
- RCC_APB2PeriphClockCmd(SAMPLE_ADC2_CLK, ENABLE); // ADC2
- RCC_APB2PeriphClockCmd(SAMPLE_ADC3_CLK, ENABLE); // ADC3
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
- RCC_APB1PeriphClockCmd(HALL_TIM_CLK, ENABLE);
- RCC_AHB1PeriphClockCmd(DMA2_CLK, ENABLE);
-
- /* ==================== 4. SysTick 配置 ==================== */
- SysTick_Config(RCC_Clocks.HCLK_Frequency / 1000);
-
- /* ==================== 5. Hall 传感器配置 ==================== */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-
- GPIO_InitStructure.GPIO_Pin = HALL_CH1_PIN;
- GPIO_Init(HALL_CH1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = HALL_CH2_PIN;
- GPIO_Init(HALL_CH2_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = HALL_CH3_PIN;
- GPIO_Init(HALL_CH3_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_PinAFConfig(HALL_CH1_GPIO_PORT, HALL_CH1_SOURCE, HALL_CH1_AF);
- GPIO_PinAFConfig(HALL_CH2_GPIO_PORT, HALL_CH2_SOURCE, HALL_CH2_AF);
- GPIO_PinAFConfig(HALL_CH3_GPIO_PORT, HALL_CH3_SOURCE, HALL_CH3_AF);
-
- TIM_DeInit(HALL_TIM);
- TIM_TimeBaseStructInit(&TIM_HALLTimeBaseInitStructure);
- TIM_HALLTimeBaseInitStructure.TIM_Period = 0xffffffff;
- TIM_HALLTimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- TIM_TimeBaseInit(HALL_TIM, &TIM_HALLTimeBaseInitStructure);
-
- TIM_ICStructInit(&TIM_HALLICInitStructure);
- TIM_HALLICInitStructure.TIM_Channel = TIM_Channel_1;
- TIM_HALLICInitStructure.TIM_ICPolarity = TIM_ICPolarity_BothEdge;
- TIM_HALLICInitStructure.TIM_ICFilter = 0x0f;
- TIM_ICInit(HALL_TIM, &TIM_HALLICInitStructure);
-
- TIM_PrescalerConfig(HALL_TIM, 0, TIM_PSCReloadMode_Immediate);
- TIM_InternalClockConfig(HALL_TIM);
- TIM_SelectHallSensor(HALL_TIM, ENABLE);
- TIM_SelectInputTrigger(HALL_TIM, TIM_TS_TI1FP1);
- TIM_SelectSlaveMode(HALL_TIM, TIM_SlaveMode_Reset);
- TIM_ClearFlag(HALL_TIM, TIM_FLAG_Update | TIM_FLAG_CC1 | TIM_FLAG_CC2 |
- TIM_FLAG_CC3 | TIM_FLAG_CC4 | TIM_FLAG_Trigger |
- TIM_FLAG_CC1OF | TIM_FLAG_CC2OF | TIM_FLAG_CC3OF | TIM_FLAG_CC4OF);
- TIM_ITConfig(HALL_TIM, TIM_IT_CC1, ENABLE);
- TIM_SetCounter(HALL_TIM, 0);
- TIM_Cmd(HALL_TIM, ENABLE);
-
- /* ==================== 6. LED 指示灯配置 ==================== */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Pin = USER_LED1_PIN;
- GPIO_Init(USER_LED1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = USER_LED2_PIN;
- GPIO_Init(USER_LED2_GPIO_PORT, &GPIO_InitStructure);
-
- /* ==================== 7. PWM 配置 ==================== */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
-
- GPIO_InitStructure.GPIO_Pin = PWM_AH_PIN;
- GPIO_Init(PWM_AH_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PWM_AL_PIN;
- GPIO_Init(PWM_AL_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PWM_BH_PIN;
- GPIO_Init(PWM_BH_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PWM_BL_PIN;
- GPIO_Init(PWM_BL_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PWM_CH_PIN;
- GPIO_Init(PWM_CH_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = PWM_CL_PIN;
- GPIO_Init(PWM_CL_GPIO_PORT, &GPIO_InitStructure);
-
- GPIO_PinAFConfig(PWM_AH_GPIO_PORT, PWM_AH_SOURCE, PWM_AH_AF);
- GPIO_PinAFConfig(PWM_AL_GPIO_PORT, PWM_AL_SOURCE, PWM_AL_AF);
- GPIO_PinAFConfig(PWM_BH_GPIO_PORT, PWM_BH_SOURCE, PWM_BH_AF);
- GPIO_PinAFConfig(PWM_BL_GPIO_PORT, PWM_BL_SOURCE, PWM_BL_AF);
- GPIO_PinAFConfig(PWM_CH_GPIO_PORT, PWM_CH_SOURCE, PWM_CH_AF);
- GPIO_PinAFConfig(PWM_CL_GPIO_PORT, PWM_CL_SOURCE, PWM_CL_AF);
-
- TIM_DeInit(PWM_TIM);
- TIM_TimeBaseStructInit(&PWM_TIM_TimeBaseStructure);
- PWM_TIM_TimeBaseStructure.TIM_Prescaler = 0x0;
- PWM_TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1;
- PWM_TIM_TimeBaseStructure.TIM_Period = PWM_TIM_PULSE;
- PWM_TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;
- PWM_TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
- TIM_TimeBaseInit(PWM_TIM, &PWM_TIM_TimeBaseStructure);
-
- TIM_OCStructInit(&PWM_TIM_OCInitStructure);
- PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
- PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE >> 1;
- PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- PWM_TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
- PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
- PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
-
- TIM_OC1Init(PWM_TIM, &PWM_TIM_OCInitStructure);
- TIM_OC2Init(PWM_TIM, &PWM_TIM_OCInitStructure);
- TIM_OC3Init(PWM_TIM, &PWM_TIM_OCInitStructure);
-
- PWM_TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
- PWM_TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
- PWM_TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
- PWM_TIM_OCInitStructure.TIM_Pulse = PWM_TIM_PULSE;
- PWM_TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
- PWM_TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
- PWM_TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
- PWM_TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
- TIM_OC4Init(PWM_TIM, &PWM_TIM_OCInitStructure);
-
- PWM_TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
- PWM_TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
- PWM_TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
- PWM_TIM_BDTRInitStructure.TIM_DeadTime = PWM_DEAD_TIME;
- PWM_TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
- PWM_TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
- PWM_TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;
- TIM_BDTRConfig(PWM_TIM, &PWM_TIM_BDTRInitStructure);
-
- TIM_Cmd(PWM_TIM, ENABLE);
-
- PWM_TIM->CCR1 = PWM_TIM_PULSE >> 1;
- PWM_TIM->CCR2 = PWM_TIM_PULSE >> 1;
- PWM_TIM->CCR3 = PWM_TIM_PULSE >> 1;
- PWM_TIM->CCR4 = PWM_TIM_PULSE - 1;
-
- /* ==================== 8. DMA 配置(用于 ADC3 规则组) ==================== */
- // ADC3 规则组使用 DMA2_Stream1, Channel_2
- DMA_DeInit(DMA2_Stream1);
- DMA_InitStructure.DMA_Channel = DMA_CHANNEL2;
- DMA_InitStructure.DMA_PeripheralBaseAddr = ADC3_DR_ADDRESS;
- DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)ADC3ConvertedValue;
- DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
- DMA_InitStructure.DMA_BufferSize = ADC3_DMA_BUFFER_SIZE; // 5个通道
- DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
- DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
- DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
- DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
- DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
- DMA_InitStructure.DMA_Priority = DMA_Priority_High;
- DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
- DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;
- DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
- DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
- DMA_Init(DMA2_Stream1, &DMA_InitStructure);
- DMA_Cmd(DMA2_Stream1, ENABLE);
-
- /* ==================== 9. ADC 引脚配置 ==================== */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
-
- // ADC1 引脚 (A相电流)
- GPIO_InitStructure.GPIO_Pin = A_CURRENT_ADC_PIN;
- GPIO_Init(A_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
-
- // ADC2 引脚 (B相电流)
- GPIO_InitStructure.GPIO_Pin = B_CURRENT_ADC_PIN;
- GPIO_Init(B_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
-
- // ADC3 引脚 (C相电流 + U/V/W电压 + 温度 + 母线电压)
- GPIO_InitStructure.GPIO_Pin = C_CURRENT_ADC_PIN;
- GPIO_Init(C_CURRENT_ADC_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = U_VOLT_ADC_PIN;
- GPIO_Init(U_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = V_VOLT_ADC_PIN;
- GPIO_Init(V_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = W_VOLT_ADC_PIN;
- GPIO_Init(W_VOLT_ADC_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = TEMPERATURE_ADC_PIN;
- GPIO_Init(TEMPERATURE_ADC_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = VBUS_ADC_PIN;
- GPIO_Init(VBUS_ADC_GPIO_PORT, &GPIO_InitStructure);
-
- /* ==================== 9.1 ADC1 配置(注入组:A相电流) ==================== */
- ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;
- ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;
- ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled;
- ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;
- ADC_CommonInit(&ADC_CommonInitStructure);
-
- ADC_StructInit(&ADC_InitStructure);
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
- ADC_InitStructure.ADC_ScanConvMode = DISABLE;
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC_InitStructure.ADC_NbrOfConversion = 0;
- ADC_Init(SAMPLE_ADC1, &ADC_InitStructure);
-
- // ADC1 注入组配置(A相电流)
- ADC_InjectedSequencerLengthConfig(SAMPLE_ADC1, 1);
- ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC1, ADC_ExternalTrigInjecConv_T1_CC4);
- ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC1, ADC_ExternalTrigInjecConvEdge_Rising);
- ADC_InjectedChannelConfig(SAMPLE_ADC1, A_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
-
- ADC_ITConfig(SAMPLE_ADC1, ADC_IT_JEOC, ENABLE);
- ADC_ClearFlag(SAMPLE_ADC1, ADC_FLAG_JEOC);
- ADC_Cmd(SAMPLE_ADC1, ENABLE);
-
- /* ==================== 9.2 ADC2 配置(注入组:B相电流) ==================== */
- ADC_Init(SAMPLE_ADC2, &ADC_InitStructure);
-
- ADC_InjectedSequencerLengthConfig(SAMPLE_ADC2, 1);
- ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC2, ADC_ExternalTrigInjecConv_T1_CC4);
- ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC2, ADC_ExternalTrigInjecConvEdge_Rising);
- ADC_InjectedChannelConfig(SAMPLE_ADC2, B_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
-
- ADC_ITConfig(SAMPLE_ADC2, ADC_IT_JEOC, ENABLE);
- ADC_ClearFlag(SAMPLE_ADC2, ADC_FLAG_JEOC);
- ADC_Cmd(SAMPLE_ADC2, ENABLE);
-
- /* ==================== 9.3 ADC3 配置(注入组:C相电流 + 规则组:其他5路) ==================== */
- // ADC3 配置
- ADC_StructInit(&ADC3_InitStructure);
- ADC3_InitStructure.ADC_ContinuousConvMode = ENABLE;
- ADC3_InitStructure.ADC_ScanConvMode = ENABLE;
- ADC3_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
- ADC3_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1;
- ADC3_InitStructure.ADC_Resolution = ADC_Resolution_12b;
- ADC3_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
- ADC3_InitStructure.ADC_NbrOfConversion = ADC3_DMA_BUFFER_SIZE; // 规则组5个通道
- ADC_Init(SAMPLE_ADC3, &ADC3_InitStructure);
-
- // ADC3 注入组配置(C相电流)
- ADC_InjectedSequencerLengthConfig(SAMPLE_ADC3, 1);
- ADC_ExternalTrigInjectedConvConfig(SAMPLE_ADC3, ADC_ExternalTrigInjecConv_T1_CC4);
- ADC_ExternalTrigInjectedConvEdgeConfig(SAMPLE_ADC3, ADC_ExternalTrigInjecConvEdge_Rising);
- ADC_InjectedChannelConfig(SAMPLE_ADC3, C_CURRENT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
-
- ADC_ITConfig(SAMPLE_ADC3, ADC_IT_JEOC, ENABLE);
- ADC_ClearFlag(SAMPLE_ADC3, ADC_FLAG_JEOC);
-
- // ADC3 规则组通道配置(U/V/W电压 + 温度 + 母线电压)
- ADC_RegularChannelConfig(SAMPLE_ADC3, U_VOLT_ADC_CHANNEL, 1, ADC_SampleTime_15Cycles);
- ADC_RegularChannelConfig(SAMPLE_ADC3, V_VOLT_ADC_CHANNEL, 2, ADC_SampleTime_15Cycles);
- ADC_RegularChannelConfig(SAMPLE_ADC3, W_VOLT_ADC_CHANNEL, 3, ADC_SampleTime_15Cycles);
- ADC_RegularChannelConfig(SAMPLE_ADC3, TEMPERATURE_ADC_CHANNEL, 4, ADC_SampleTime_15Cycles);
- ADC_RegularChannelConfig(SAMPLE_ADC3, VBUS_ADC_CHANNEL, 5, ADC_SampleTime_15Cycles);
-
- // DMA 相关
- ADC_DMACmd(SAMPLE_ADC3, ENABLE);
- ADC_DMARequestAfterLastTransferCmd(SAMPLE_ADC3, ENABLE);
-
- // 使能ADC3并启动转换
- ADC_Cmd(SAMPLE_ADC3, ENABLE);
- ADC_SoftwareStartConv(SAMPLE_ADC3);
-
- /* ==================== 10. 按键配置 ==================== */
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
-
- GPIO_InitStructure.GPIO_Pin = KEY_1_PIN;
- GPIO_Init(KEY_1_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = KEY_2_PIN;
- GPIO_Init(KEY_2_GPIO_PORT, &GPIO_InitStructure);
- GPIO_InitStructure.GPIO_Pin = KEY_3_PIN;
- GPIO_Init(KEY_3_GPIO_PORT, &GPIO_InitStructure);
-
- SYSCFG_EXTILineConfig(KEY_1_EXTI_GPIO_PORT, KEY_1_EXTI_SOURCE);
- SYSCFG_EXTILineConfig(KEY_2_EXTI_GPIO_PORT, KEY_2_EXTI_SOURCE);
- SYSCFG_EXTILineConfig(KEY_3_EXTI_GPIO_PORT, KEY_3_EXTI_SOURCE);
-
- EXTI_InitStructure.EXTI_Line = KEY_1_EXTI_LINE | KEY_2_EXTI_LINE | KEY_3_EXTI_LINE;
- EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
- EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
- EXTI_InitStructure.EXTI_LineCmd = ENABLE;
- EXTI_Init(&EXTI_InitStructure);
-
- // EN PIN
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
- GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
- GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
- GPIO_InitStructure.GPIO_Pin = USER_EN_PIN;
- GPIO_Init(USER_EN_GPIO_PORT, &GPIO_InitStructure);
- GPIO_ResetBits(USER_EN_GPIO_PORT, USER_EN_PIN);
-
- /* ==================== 11. 中断优先级配置 ==================== */
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
-
- // ADC1/ADC2/ADC3 注入组中断(共用ADC_IRQn)
- NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- // DMA2 Stream1 中断
- NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream1_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
- DMA_ITConfig(DMA2_Stream1, DMA_IT_TC, ENABLE);
-
- // 按键中断
- NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI3_IRQn;
- NVIC_Init(&NVIC_InitStructure);
-
- NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn;
- NVIC_Init(&NVIC_InitStructure);
-
- // TIM5 霍尔中断
- NVIC_InitStructure.NVIC_IRQChannel = TIM5_IRQn;
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
- NVIC_Init(&NVIC_InitStructure);
- }
|