| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #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
|