基于标准库开发STM32F1系列 ——通用定时器初始化
void Timer_Config(void)
{
//定时器相关结构体
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
//开启定时器相关时钟 stm32f10x_rcc.h
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/*** ***********计算公式**************
1、PSC(TIM_Prescaler) = 72-1,定时器频率=72M/(PSC+1)=1MHZ
2、ARR(TIM_Period) = 1000-1,从0计数到999,则计了1000次
3、中断周期T = 1000 *1/1000000 = 1mS
***/
//外部输入时钟分频因子,基本定时器没有 可以不配置
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
//计数模式,基本定时器只能向上计数 也可以不进行配置
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
//自动重载值
TIM_TimeBaseInitStructure.TIM_Period = 999;
//分频因子
TIM_TimeBaseInitStructure.TIM_Prescaler = (72 - 1);
//重复计数器 高级定时器专用
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
//去初始化定时器2
TIM_DeInit(TIM2);
//初始化定时器2
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//清楚标志位 保证程序严谨性
TIM_ClearFlag(TIM2, TIM_FLAG_Update);
//开启计数器中断
TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
//使能计数器
TIM_Cmd(TIM2, ENABLE);
}
配置NVIC
void Timer_NVIC(void)
{
//NVIC相关结构体 函数 在 misc.c中
NVIC_InitTypeDef NVIC_InitStructure;
//设置中断组为0
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//配置中断来源
NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
//配置主优先级 数越小优先级越高
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//配置抢占优先级
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_Init(&NVIC_InitStructure);
}
/******************************************************************************/
/*中断服务子程序的函数名称必须与startup_stm32f10x_hd.s中的名称相同 */
/************************函数写在stm32f10x_it.c********************************/
/******************************************************************************/
/* STM32F10x Peripherals Interrupt Handlers */
/* Add here the Interrupt Handler for the used peripheral(s) (PPP), for the */
/* available peripheral interrupt handler's name please refer to the startup */
/* file (startup_stm32f10x_xx.s). */
/******************************************************************************/
void TIM2_IRQHandler(void)
{
//检测TIM2的TIM_IT_Update标志位 当TIM_IT_Update标志位置位时表示一次计数已经完成 即1ms
if( TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
{
//外部引用变量time 在主函数main中定义
time++;
//清楚标志位以等待下次标志位置位
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
}
}
初学笔记,有错误大佬即使指出,欢迎讨论。