关于基本定时器的注释,各个详细的点都说明了,很适合初学者
void TIM3_Init(void)
{
/* 初始化定时器时钟 apb1最大频率是42MHZ */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //开定时器3时钟
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
/*
TIM_CounterMode_Up 边沿对齐模式。计数器依据方向位(DIR)向上计数
TIM_CounterMode_Down 边沿对齐模式。计数器依据 或向下计数。
TIM_CounterMode_CenterAligned1 中央对齐模式1。计数器交替地向上和向下计数。
产生下溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向下计数时被设置。
TIM_CounterMode_CenterAligned2 中央对齐模式2。计数器交替地向上和向下计数。
产生上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,只在计数器向上计数时被设置。
TIM_CounterMode_CenterAligned3 中央对齐模式3。计数器交替地向上和向下计数。
产生下溢和上溢中断,配置为输出的通道(TIMx_CCMRx寄存器中CCxS=00)的输出比较中断标志位,在计数器向上和向下计数时均被设置。
*/
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Down;
/* 取值范围:This parameter must be a number between 0x0000 and 0xFFFF.
下边配置的是1ms一次,向下计数,1000-1就是1s
*/
TIM_TimeBaseInitStruct.TIM_Period = 1000-1;
/* apb1最大频率是42MHZ 所以这里分频42-1就是1MZH/s 就是1us计数一次
如果分频42000-1 就是1ms计数一次 */
TIM_TimeBaseInitStruct.TIM_Prescaler = 42000-1;
/*这里也就是不分频
@arg TIM_CKD_DIV1: TDTS = Tck_tim
@arg TIM_CKD_DIV2: TDTS = 2*Tck_tim
@arg TIM_CKD_DIV4: TDTS = 4*Tck_tim
*/
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
/* 初始化定时器 */
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
/* 中断结构体 */
NVIC_InitTypeDef NVIC_InitStruct;
/*定时器中断参数设置*/
TIM3->SR &= 0xFFFE; //清除update中断标志位,否则会出现刚配置完中断就进入中断服务函数的问题
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); //配置为更新中断
/* 选择初始化哪个外设中断 */
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;
/* 中断优先级组 一般这个不在这里初始化 这里提示一下 因为是定时器介绍,
中断这里就提示一下*/
/*NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4)*/
/* 抢占优先级 可以打断别的中断*/
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 2;
/* 响应优先级 不可以打断,但是如果同时中断,谁的优先级高就谁进中断 */
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0;
/* 中断使能 */
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;
/* 中断初始化 */
NVIC_Init(&NVIC_InitStruct);
/* 使能定时器 */
TIM_Cmd(TIM3, ENABLE);
return;
}