概述
STM32F103系列MCU提供定时器有SysTick定时器(系统滴答定时器)、基本定时器、通用定时器和高级定时器。
1.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); //清除中断标志位
}
文中的代码来自艾克姆的开发板,由于我比较懒,不想对相关代码进行重新编辑,如果觉得我侵犯了权益,请联系我。
我是初学者,欢迎对我的文章提出您的意见和建议。非常期待您与我交流。
最后
以上就是谨慎牛排为你收集整理的STM32定时与计数器总结 第一部分的全部内容,希望文章能够帮你解决STM32定时与计数器总结 第一部分所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复