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