赞
踩
STM32F103系列MCU提供定时器有SysTick定时器(系统滴答定时器)、基本定时器、通用定时器和高级定时器。
该定时器是一个 24 位的倒计数定时器。当计到 0 时该定时器就会从 LOAD 寄存器中自动重装载定时初值。只 要不把 CTRL 寄存器中的 ENABLE 位清 0,SysTick 定时器就一直工作下去。
- void SysTick_Init(void)
- {
- /* SysTick_Config会选择SysTick定时器时钟是HCLK,打开SysTick定时器并开启中断 */
- SysTick_Config(72000); //需要减一,重装值设为71999
-
- // SysTick_Config(72000/8); //重装值设为8999
- // SysTick->CTRL &= ~SysTick_CTRL_CLKSOURCE_Msk; //选择SysTick定时器时钟是HCLK/8
- }
-
- /**************************************************************************************
- * 描 述 : SysTick中断服务函数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************************/
- void SysTick_Handler(void)
- {
- if(timecount>1000)
- {
- timecount=0; //变量timecount清零
- led_toggle(LED_1); //1s执行一次翻转指示灯D1的操作
- }
- else
- {
- timecount++; //变量timecount累加1
- }
- }
2.基本定时器(TIM6和TIM7)
STM32F103 系列 MCU 基本定时器用计数器只可向上计数,向上计数最大到 65535。 计数器从 0 累加计数到自动重装载数值(TIMx_ARR 寄存器)后重新从 0 开始计数并产生 一个计数器溢出事件。
基本定时器用计数器的时钟频率计算公式:
基本定时器溢出时间计算公式:
TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定时器和高级定时器声明的。
TIM_ITConfig 库函数是 TIM 中断使能函数,作用是使能或禁止指定的 TIM 中断。
基本定时器的配置步骤
- /**************************************************************************************
- * 描 述 : 初始化TIM6并配置TIM6中断优先级
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************************/
- void TIM6_Init(void)
- {//TIM_TimeBaseInitTypeDef 结构体是针对基本定时器、通用定
- //时器和高级定时器声明的
- TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
- NVIC_InitTypeDef NVIC_InitStructure;
-
- RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6 , ENABLE); //打开外设TIM6时钟
-
- TIM_DeInit(TIM6); //将外设TIM6寄存器重设为缺省值
-
- //TIM6是基本定时器,只需配置TIM_Period和TIM_Prescaler即可
- TIM_TimeBaseInitStruct.TIM_Period = 9999 ; //设置计数器自动重装载值,取值范围0x0000~0xFFFF
- TIM_TimeBaseInitStruct.TIM_Prescaler = 7199 ; //设置预分频器数值,取值范围0x0000~0xFFFF
- TIM_TimeBaseInit(TIM6, &TIM_TimeBaseInitStruct ) ;
-
- TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除TIM6的待处理标志位
- TIM_ITConfig(TIM6, TIM_IT_Update,ENABLE); //使能TIM6中断
- TIM_Cmd(TIM6, ENABLE); //使能TIM6外设
-
- NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //NVIC_Group:先占优先级2位,从优先级2位
- NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn; //配置为TIM6中断
- NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //先占优先级为1
- NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //从优先级为2
- NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //使能中断通道
- NVIC_Init(&NVIC_InitStructure);
- }
-
- /**************************************************************************************
- * 描 述 : TIM6中断服务函数
- * 入 参 : 无
- * 返回值 : 无
- **************************************************************************************/
- void TIM6_IRQHandler(void)
- {
- led_toggle(LED_1); //1s执行一次翻转指示灯D1的操作
- TIM_ClearFlag(TIM6, TIM_FLAG_Update); //清除中断标志位
- }
文中的代码来自艾克姆的开发板,由于我比较懒,不想对相关代码进行重新编辑,如果觉得我侵犯了权益,请联系我。
我是初学者,欢迎对我的文章提出您的意见和建议。非常期待您与我交流。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。