求助大伙帮忙看看通用定时器TIM2 延时不准怎么回事 LED 2秒多闪一次 公式计算72M / 时钟预分频 + 1
#include "stm32f10x.h "
unsigned char Count1;
/*
* GPIO端口配置寄存器子函数
*/
void GPIO_InitStructReadtempCmd(void)
{
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_9 | GPIO_Pin_10 | GPIO_Pin_11;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; //配置线路为推挽式输出
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz; //配置线路速率
GPIO_Init(GPIOD, &GPIO_InitStruct); //初始化
}
/*
* RCC外设时钟配置寄存器子函数
*/
void RCC_APB2PeriphReadtempyCmd(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); //打开GPIOD外设时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 , ENABLE); //打开TIM2定时器外设时钟
}
/*
* 配置中断向量控制器NVIC子函数
*/
void NVIC_InitStructReadtempCmd(void)
{
NVIC_InitTypeDef NVIC_InitStruct;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0); //配置中断分组
NVIC_InitStruct.NVIC_IRQChannel = TIM2_IRQn; //选择中断通道
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0; //配置抢占优先级为0
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0; //配置从占优先级为0
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //打开使能
NVIC_Init(&NVIC_InitStruct); //初始化
}
/*
* TIMX定时器配置寄存器子函数
*/
void TIMX_InitStructReadtempCmd(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_DeInit(TIM2); //重设缺省值
TIM_TimeBaseInitStruct.TIM_Period = 2000; //自动重载寄存器
TIM_TimeBaseInitStruct.TIM_Prescaler = (35999); //时钟预分频
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //时间分割值
TIM_TimeBaseInitStruct.TIM_CounterMode = 0x0000; //配置向上计数
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct); //初始化定时器
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除溢出中断标志
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //打开中断溢出中断
TIM_Cmd(TIM2, ENABLE); //使能TIM2定时器
}
/*
* 函数主体
*/
int main(void)
{
SystemInit(); //初始化系统时钟进入72M主频
RCC_APB2PeriphReadtempyCmd();
GPIO_InitStructReadtempCmd();
NVIC_InitStructReadtempCmd();
TIMX_InitStructReadtempCmd();
while(1)
{
}
}
/*
* TIM2定时器中断服务程序
*/
void TIM2_IRQHandler(void)
{
Count1++;
if(Count1 == 2)
{
Count1 = 0;
}
switch (Count1)
{
case 0:
// GPIO_ResetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_11);
GPIO_SetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10);
break;
case 1:
GPIO_ResetBits(GPIOD, GPIO_Pin_9 | GPIO_Pin_10);
// GPIO_SetBits(GPIOD, GPIO_Pin_8 | GPIO_Pin_11);
break;
default : break;
}
TIM_ClearFlag(TIM2, TIM_FLAG_Update); //清除溢出中断标志
}
|