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;
}