STM32F429时钟树,定时器PWM,PWM转DAC
STM32F429时钟树
定时器PWM
从STM32F4的内部时钟树可知,
(1)高级定时器timer1, timer8以及通用定时器timer9, timer10, timer11的时钟来源是APB2总线
(2)通用定时器timer2-timer5,通用定时器timer12-timer14以及基本定时器timer6,timer7的时钟来源是APB1总线
(3)当APB1和APB2分频数为1的时候,TIM1、TIM8-TIM11的时钟为APB2的时钟,TIM2-TIM7、TIM12-TIM14的时钟为APB1的时钟;
(4)而如果APB1和APB2分频数不为1,那么TIM1、TIM8-TIM11的时钟为APB2的时钟的两倍,TIM2-TIM7、TIM12-TIM14的时钟为APB1的时钟的两倍。
PWM计算
PWM频率 = 定时器频率/(分频系数 x 自动重装载值)
PWM占空比 = CCRx / 自动重装载值。
#include "pwmdac.h"
TIM_HandleTypeDef TIM4_Handler; //定时器4 PWM句柄
TIM_OC_InitTypeDef TIM4_CH2Handler; //定时器9通道2句柄
//PWM DAC初始化(也就是TIM4通道2初始化)
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM4_CH2_PWM_Init(u16 arr,u16 psc)
{
TIM4_Handler.Instance=TIM4; //定时器9
TIM4_Handler.Init.Prescaler=psc; //定时器分频
TIM4_Handler.Init.CounterMode=TIM_COUNTERMODE_UP;//向上计数模式
TIM4_Handler.Init.Period=arr; //自动重装载值
TIM4_Handler.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;
HAL_TIM_PWM_Init(&TIM4_Handler); //初始化PWM
TIM4_CH2Handler.OCMode=TIM_OCMODE_PWM1; //模式选择PWM1
TIM4_CH2Handler.Pulse=arr/2; //设置比较值,此值用来确定占空比,默认比较值为自动重装载值的一半,即占空比为50%
TIM4_CH2Handler.OCPolarity=TIM_OCPOLARITY_HIGH; //输出比较极性为高
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_2);//配置TIM9通道2
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_1);//配置TIM9通道2
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_2);//开启PWM通道2
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_1);//开启PWM通道2
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_3);//配置TIM9通道2
HAL_TIM_PWM_ConfigChannel(&TIM4_Handler,&TIM4_CH2Handler,TIM_CHANNEL_4);//配置TIM9通道2
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_3);//开启PWM通道2
HAL_TIM_PWM_Start(&TIM4_Handler,TIM_CHANNEL_4);//开启PWM通道2
}
//定时器底层驱动,时钟使能,引脚配置
//此函数会被HAL_TIM_PWM_Init()调用
//htim:定时器句柄
void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef *htim)
{
GPIO_InitTypeDef GPIO_Initure;
__HAL_RCC_TIM4_CLK_ENABLE(); //使能定时器9
__HAL_RCC_GPIOD_CLK_ENABLE(); //开启GPIOA时钟
GPIO_Initure.Pin=GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15; //PA3
GPIO_Initure.Mode=GPIO_MODE_AF_PP; //复用推完输出
GPIO_Initure.Pull=GPIO_PULLUP; //上拉
GPIO_Initure.Speed=GPIO_SPEED_HIGH; //高速
GPIO_Initure.Alternate= GPIO_AF2_TIM4; //PA3复用为TIM9_CH2
HAL_GPIO_Init(GPIOD,&GPIO_Initure);
}
//设置TIM通道2的占空比
//TIM_TypeDef:定时器
//compare:比较值
void TIM_SetTIM4Compare2(u32 compare)
{
TIM4->CCR1=compare;
TIM4->CCR2=compare;
TIM4->CCR3=compare;
TIM4->CCR4=compare;
}