经过两天的研究,逛各种坛子,不断测试,
发现网上很多代码实际上都只有两三个版本,但是都不工作或者说不正常工作。。。
东拼西凑,不断调试,终于找出了通用定时器的可以工作的配置。
时钟配置不是问题,问题在于TIM的初始化。网上各种资料都不正确。
导至定时器一直只以一个频率工作,而且按资料来说正确范围内的参数实际却不工作。
时钟配置
NVIC_InitTypeDef NVIC_InitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQChannel; /*TIM3中断*/
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; /*先占优先级0级*/
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; /*从优先级3级*/
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; /*IRQ通道被使能*/
NVIC_Init(&NVIC_InitStructure);
TIM初始化设置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); /* 时钟使能 */
/*定时器TIM3初始化*/
TIM_TimeBaseStructure.TIM_Period = 7200;/*周期的值*/
TIM_TimeBaseStructure.TIM_Prescaler = 10000;/* 预分频值 */
//跟据程序实际CNT的取值看,应该TIM_Period才是预分频值
//虽然资料说这两个取值在0x0000~0xFFFF,但是好像取值超过一定值就不工作,具体是多少没测,但是很多数值都不工作。
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;/*设置时钟分割:TDTS = Tck_tim*/
//这里与资料上也不相同,好像设任何值(1,2,4)都不影响计步速度。
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; /* TIM向上计数模式*/
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); /*根据指定的参数初始化TIMx的时间基数单位*/
TIM_PrescalerConfig(TIM3, 7200-1, TIM_PSCReloadMode_Immediate);
//如果不加这句,定时器会以200次/秒 左右的周期溢出,不论前面周期,预分频和时钟如何设置。
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); /*使能指定的TIM3中断,允许更新中断*/
中断配置
if(TIM_GetITStatus(TIM3, TIM_IT_Update) !=RESET)
{
TIM_ClearITPendingBit(TIM3,TIM_FLAG_Update);
/*处理事件。。。*/
}