赞
踩
基于标准库开发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); } }
初学笔记,有错误大佬即使指出,欢迎讨论。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。