基本定时器

1.简介

1. 基本定时器 TIM6 和 TIM7 包含一个 16 位自动重载计数器

2. 可以专门用于驱动数模转换器 (DAC), 用于触发 DAC 的同步电路
3. 16 位自动重载递增计数器

4. 16 位可编程预分频器

5. 计数器溢出时, 会触发中断/DMA请求

从上往下看

1.开始RCC供给定时器的时钟

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE); 

2.设置预分频值PSC,重装载值,计数方向

TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV4; 

TIM_TimeBaseInit(BASE_TIMER,&TIM_TimeBaseInitStructure);//初始化TIM6

 注意,对于基本定时器TIM6, TIM 7, TIM_TimeBaseInitStructure.TIM_ClockDivision是无效的, 供给的时钟到预分频器的前面没有分频.在通用定时器和高级定时器中TIMx_CR1的位 9:8 CKD:时钟分频 (Clock division)对输入时钟进行首次分频

3.开启更新中断,使能定时器

  TIM_ITConfig(BASE_TIMER,TIM_IT_Update,ENABLE); //允许定时器3更新中断
  TIM_Cmd(BASE_TIMER,ENABLE); //使能定时器3   

4.设置中断优先级

    NVIC_InitStructure.NVIC_IRQChannel=TIM6_DAC_IRQn; //定时器6中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);

5.例程

#include "./BaseTime/basetime.h"
#include "./LED/led.h"

#define BASE_TIMER              TIM6
#define BASE_TIMER_CLK          RCC_APB1Periph_TIM6
#define BASE_TIME_IRQ           TIM6_DAC_IRQn
#define BASE_TIME_IRQHandler    TIM6_DAC_IRQHandler

void bsTime_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(BASE_TIMER_CLK,ENABLE);  ///使能TIM6时钟

    TIM_TimeBaseInitStructure.TIM_Period = arr; //自动重装载值
    TIM_TimeBaseInitStructure.TIM_Prescaler=psc;  //定时器分频
    TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
    TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV4; 

    TIM_TimeBaseInit(BASE_TIMER,&TIM_TimeBaseInitStructure);//初始化TIM6

    TIM_ITConfig(BASE_TIMER,TIM_IT_Update,ENABLE); //允许定时器3更新中断
    TIM_Cmd(BASE_TIMER,ENABLE); //使能定时器3

    NVIC_InitStructure.NVIC_IRQChannel=BASE_TIME_IRQ; //定时器6中断
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x01; //抢占优先级1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x03; //子优先级3
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}


void BASE_TIME_IRQHandler(void)
{
    if(TIM_GetITStatus(BASE_TIMER,TIM_IT_Update)==SET) //溢出中断
    {
        static char i = 0;
        if(i == 0)
        {
            LED0(1);
            i = 1;
        }
        else
        {
            i = 0;
            LED0(0);
        }
        TIM_ClearITPendingBit(BASE_TIMER,TIM_IT_Update);  //清除中断标志位
    }

}

 注意:这个TIM6非常特殊, 中断号和中断函数都其他的有点不一样.

### CUBEMX 基本定时器使用方法 #### 创建和配置基本定时器 在STM32CubeMX环境中创建一个新的项目,选择目标MCU型号后进入主界面。为了配置基本定时器,在左侧的外设列表中找到TIMx(例如 TIM2),点击右侧箭头展开更多选项。 对于基本定时器的具体配置如下: - **模式**:选择“Basic Timer” - **Prescaler**:设定预分频系数,用于调整计数频率。此值取决于所需的定时精度以及系统时钟速度。 - **Counter Period (ARR)**:自动重装载寄存器值,决定了定时周期长度。 - **Clock Division(CKD)**:可选参数,通常保持默认设置即可[^1]。 完成上述配置之后保存并生成初始化代码至指定IDE环境内继续开发工作流程[^4]。 #### 启动与停止定时器 当硬件资源已经由STM32CubeMX正确分配完毕,则可以在应用程序逻辑里通过API接口来控制定时器的行为。要启动一个之前定义好的基本定时器实例`htim2`,可以调用以下函数: ```c // 开始定时器 if(HAL_OK != HAL_TIM_Base_Start(&htim2)) { // 错误处理... } ``` 同样地,如果想要暂停该定时器的操作,只需要执行相应的关闭命令: ```c // 关闭定时器 if(HAL_OK != HAL_TIM_Base_Stop(&htim2)) { // 错误处理... } ``` #### 定义回调函数 为了让程序能够响应定时事件的发生,还需要实现特定于应用需求的时间溢出中断服务子程序(ISR),即所谓的回调函数。这一步骤是在`main.c`文件中的适当位置重新声明并编写实际功能代码的地方[^3]: ```c void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim) { /* 用户自定义的功能 */ if(htim->Instance==TIM2){ // 当检测到是来自HTIM2触发时所采取的动作 } } ``` 以上就是利用STM32CubeMX配合HAL库操作基本定时器的一个简单介绍及示例教程。希望这些信息能帮助理解如何有效地运用这个特性丰富的组件构建自己的嵌入式解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

入门->放弃

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值