1. 系统时钟配置
void RCC_Configuration(void)
{
ErrorStatus HSEStartUpStatus;
RCC_DeInit();
RCC_HSEConfig(RCC_HSE_ON);
HSEStartUpStatus = RCC_WaitForHSEStartUp();
if (HSEStartUpStatus == SUCCESS)
{
RCC_HCLKConfig(RCC_SYSCLK_Div1); //设置AHB(HCLK)时钟为系统时钟
RCC_PCLK2Config(RCC_HCLK_Div1); //设置高速AHB时钟(APB2)为HCLK时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //设置低速AHB时钟(APB1)为HCLK的2分频
RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);//选择PLL时钟源为HSE1分频,倍频为
//9,PLLCLK = 8MHz * 9 = 72 MHz
RCC_PLLCmd(ENABLE);
while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
while (RCC_GetSYSCLKSource() != 0x08);
}
}
2. 为产生PWM脉冲的定时器配置
void TIMER2_Cfg(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
TIM_DeInit(TIM2);
TIM_InternalClockConfig(TIM2);
TIM_TimeBaseStructure.TIM_Prescaler = 720-1; //预分频系数, 此时TIMER的频率=100k
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //设置计数器模式为向上计数模式
TIM_TimeBaseStructure.TIM_Period = 1000 - 1; //设置计数溢出大小,每计1000个脉冲就
//产生一个更新事件。TIM_Period时长意味着TIM_Prescaler分频后脉冲频率的再分频。
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //把配置写入寄存器
//以下是TIM2中断配置
TIM_ClearFlag(TIM, TIM_FLAG_Update); //清中断,以免一启用中断后立即产生中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //使能TIM2中断源
}
3. TIM3产生更新时间的中断配置
void NVIC_Cfg(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //设置中断组为1
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn; //更新事件,TIM2中断通道
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //响应优先级1
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //允许中断
NVIC_Init(&NVIC_InitStructure); //写入设置
}
4.定时器初始化
void PWM_Init(void)
{
RCC_Configuration();
TIMER_Cfg();
NVIC_Cfg();
}
7. 打开定时器2
TIM_Cmd(TIM2, ENABLE);
『本文转载自网络,版权归原作者所有,如有侵权请联系删除』