/********************************** * 文件名称: 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); }