#if 0 #include "hard_sbusout_af_pump.h" #include "stm32f4xx.h" #define SBUSOUT_AF_PUMP_PERIOD 20000 // subsout复用为水泵输出 #define PUMP_DEF_VALUE 1000 static void sbusout_af_pump_gpio_config(void); static void sbusout_af_pump_timer_config(void); /**************************实现函数******************************************** *函数原型: void sbusout_af_pump_init(void) *功  能: PWM输出 初始化。 *******************************************************************************/ void sbusout_af_pump_init(void) { sbusout_af_pump_gpio_config(); sbusout_af_pump_timer_config(); } /**************************实现函数******************************************** *函数原型: static void sbusout_af_pump_gpio_config(void) *功  能: 配置PWM引脚为输出,并开启相应的时钟信号 和引脚复用时钟信号 *******************************************************************************/ static void sbusout_af_pump_gpio_config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* GPIOA and GPIOB and GPIOC clock enable */ RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_25MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_PinAFConfig(GPIOA, GPIO_PinSource2, GPIO_AF_TIM9); } /**************************实现函数******************************************** *函数原型: static void sbusout_af_pump_timer_config(void) *功  能: 配置PWM的对应定时器 //通用定时器3中断初始化,使用定时器3的溢出中断来确定HZ数 //TIM_Period:自动重装值。 //TIM_Prescaler:时钟预分频数 //定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us. //Ft=定时器工作频率,单位:Mhz //这里使用的是定时器3! //来自STM32F4手册:高速APB2域的最大允许频率是84MHZ,低速APB1域的最大允许频率是42MHZ *******************************************************************************/ static void sbusout_af_pump_timer_config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; //开定时器时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9, ENABLE); //=============Time base configuration======================== // PWM周期,2.5ms,400hz TIM_TimeBaseStructure.TIM_Period = SBUSOUT_AF_PUMP_PERIOD; //设置预分频:即为1MHz。1ms = 1000次计数 TIM_TimeBaseStructure.TIM_Prescaler = 168 - 1; //设置时钟分频系数:不分频 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //初始化定时器 TIM_TimeBaseStructure.TIM_Period = SBUSOUT_AF_PUMP_PERIOD; // PWM周期 TIM_TimeBaseInit(TIM9, &TIM_TimeBaseStructure); //===================TIM_OCInitStructure base //configuration================== //配置为PWM模式1 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //设置跳变值,当计数器计数到大于这个值时,电平发生跳变 //,,TIMx->CCRx的值,设置占空比,在更新电机的地方实时更新这个值 TIM_OCInitStructure.TIM_Pulse = PUMP_DEF_VALUE; //当定时器计数值小于CCR1_Val时为高电平 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //=================================================================================== //* PA2 TIM9_CHA //* //* 每一个通用定时器可以产生四路频率一致占空比可调节的独立的PWM波形, //* TIM_OC1Init 1通道 TIM_OC2Init 2通道 TIM_OC3Init 3通道 TIM_OC4Init //4通道 //* //* 哪个管脚对应哪个TIM的哪个CH由硬件设计已经决定 //======================================================================================== //=================使能通道================================= TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // TIME9的通道1 SUBSOUT_AF_PWM TIM_OC1Init(TIM9, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable); //使能TIMx重载寄存器ARR TIM_ARRPreloadConfig(TIM9, ENABLE); //使能定时器x TIM_Cmd(TIM9, ENABLE); } #endif