当前位置: 首页 > news >正文

day 8 TIM定时器

一、STM32 定时器概述

1. 定时器的概述定时器的基本功能,但是 STM32 的定时器除了具有定时功能之外,也具有定时器中断功能,还具有输入捕获(检测外部信号)以及输出比较功能(输出不同的脉冲),可以利用 STM32定时器输出某种频率的脉冲信号来控制产品(控制灯的亮度、控制直流电机的转速、控制舵机的角度.......)

2. 定时器的种类STM32 由于资源丰富,所以提供了多种定时器,一共提供 14 个定时器(不包含系统定时器、不包含看门狗定时器),分为高级定时器(TIM1 和 TIM8)、通用定时器(TIM2~TIM5 +TIM9~TIM14,一共 10 个)、基本定时器(TIM6 和 TIM7)

3. 定时器的使用

基本定时器STM32 提供 TIM6 和 TIM7 作为基本定时器,属于 STM32 内部资源,都是 16bit 定时器,并没有和 GPIO 引脚连接,TIM6 和 TIM7 都挂载在 APB1 总线下,而 APB1 定时器时钟频率为84MHZ。     

 时基单元包括:

1计数器寄存器         CNT       记录当前计数的次数

2预分频器寄存器        PSC        设置计数一次的周期

3自动重装载寄存器    ARR            设置定时的次数(定时时间)

TIM6 的时钟频率为 84MHZ,如果想要降低频率,公式:1MHZ = 84MHZ /(83+1),频率就降为 1MHZ,也就意味着 TIM_CNT 寄存器累计计数 1 次的时间是 1us,如果打算利用TIM6 定时 1ms,也就是说 TIM_ARR 寄存器的值应该设置为 1000-1,只要 TIM_CNT == TIM_ARR,
就说明时间到了,如果时间到了则 TIM_CNT 清 0,然后重新开始计数

对时钟进行分频的目的就是为了延长定时时间

1设置定时器的分频系数 TIM_Prescaler 范围 0x0000 and 0xFFFF

设置分频n,分频系数n-1

2设置定时器的计数模式TIM_CounterMode 基本定时器只能选择向上计数

3设置定时器的计数周期 TIM_Period 指的是重载寄存器中的值 0x0000 and 0xFFFF

4设置定时器的时钟分频因子 TIM_ClockDivision 在输入捕获的采样使用 不需要设置

5设置定时器的重复计数器 TIM_RepetitionCounter 只有高级定时器需要设置

设置中断源函数:

void TIM_ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState)

函数参数参数一:TIMx 打算产生中断的定时器号 如 TIM6

参数二:TIM_IT 指定定时器的中断源 一般为 TIM_IT_Update 表示更新时中断

参数三:NewState 打开或关闭中断源 ENABLE or DISABLE

初始化定时器:

可以调用 TIM_TimeBaseInit 函数实现函数原型

voidTIM_TimeBaseInit(TIM_TypeDef* TIMx, TIM_TimeBaseInitTypeDef*TIM_TimeBaseInitStruct)函数参数参数一:TIMx 打算配置参数的定时器号 如 TIM6

参数二:TIM_TimeBaseInitStruct 指的是配置的参数信息 记得取地址 &

#include "stm32f4xx.h"  

__IO uint32_t TimingDelay;

//LED初始化
void LED_Init(void)
{
    GPIO_InitTypeDef   GPIO_InitStructure;

    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);
    
    GPIO_InitStructure.GPIO_Mode     = GPIO_Mode_OUT;            //输出模式
    GPIO_InitStructure.GPIO_OType    = GPIO_OType_PP;            //推挽输出
    GPIO_InitStructure.GPIO_Speed    = GPIO_Speed_100MHz;        //输出速率
    GPIO_InitStructure.GPIO_PuPd     = GPIO_PuPd_NOPULL;            //无上下拉
    GPIO_InitStructure.GPIO_Pin     = GPIO_Pin_9;                //引脚编号
    GPIO_Init(GPIOF, &GPIO_InitStructure);
    
    GPIO_SetBits(GPIOF,GPIO_Pin_9); //默认不亮

}
//TIM6定时器的初始化
void TIM6_Init(void)
{
    TIM_TimeBaseInitTypeDef    TIM_TimeBaseStructure ;
    
    NVIC_InitTypeDef   NVIC_InitStructure ;
//1.打开时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6, ENABLE);
//2.配置定时时间,定时200ms,APB1定时时钟84MHZ  1us数84次  200ms:  84*1000*200(次)
//                定时200ms,经过8400分频,8400us数84次,即100us数1次,1ms=1000us,10次即可,200ms 2000次

    TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;//预分频
    TIM_TimeBaseStructure.TIM_Period = 2000-1;//计数周期
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数模式,向上计数
    TIM_TimeBaseInit ( TIM6 , &TIM_TimeBaseStructure);
    
//3.配置NVIC (中断通道+优先级)    
    NVIC_InitStructure.NVIC_IRQChannel = TIM6_DAC_IRQn;//中断通道去f4xx.h里面找
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;//抢占优先级
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;//响应优先级
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能中断通道
    NVIC_Init(&NVIC_InitStructure);
    
//4.选择TIM6的中断源
 TIM_ITConfig(TIM6,TIM_IT_Update, ENABLE);//更新事件
 
 //5.使能定时器
 TIM_Cmd(TIM6,ENABLE);

}

void Delay_ms(__IO uint32_t nTime)
{
    TimingDelay=nTime;
    while(TimingDelay);

}

int main()
{
    //1.硬件初始化
    LED_Init();
    TIM6_Init();
    

    
    
    //2.进入死循环
    while(1)
    {
        
    }
    
}

void TIM6_DAC_IRQHandler(void)
{
    //检测中断是否发生
    if (TIM_GetITStatus(TIM6, TIM_IT_CC1) != RESET)
    {
        TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);//清空中断标志
        //异常处理

        GPIO_ToggleBits(GPIOF,GPIO_Pin_9);//翻转
    }

}
 

优化:

 通用定时器

STM32 一共提供 10 个通用定时器(TIM2~TIM5、TIM9~TIM14),TIM2 和 TIM5 是 32bit 定时器,其他的定时器都是 16bit 定时器。

     TIM2~TIM5 的计数方式有多种可以选择,分别为递增计数、递减计数、递增/递减计数。

递增计数:计数器从 0 计数到自动重载值(TIMx_ARR 寄存器的内容),然后重新从 0 开始计数并生成计数器上溢事件。

递减计数:计数器从自动重载值(TIMx_ARR 寄存器的内容)开始递减计数到 0,然后重新从自动重载值开始计数并生成计数器下溢事件。

中心对齐:计数器从 0 开始计数到自动重载值(TIMx_ARR 寄存器的内容)— 1,生成计数器上溢事件;然后从自动重载值开始向下计数到 1 并生成计数器下溢事件。之后从 0 开始重新计数。  

http://www.dtcms.com/a/113701.html

相关文章:

  • 第八章 Python基础进阶-数据可视化(终)
  • FfreeRTOS有阻塞作用的API
  • 12款字重国外法国风格复古报纸日历设计衬线英文字体安装包 Claire Font Family
  • docker swarm常用命令
  • python爬虫爬取淘宝热销(热门)男装商品信息(课程设计;提供源码、使用说明文档及相关文档;售后可联系博主)
  • Rust切片、结构体、枚举
  • macOS下SourceInsight的替代品
  • 前端工程化之模块化开发 webpack
  • 完整的Python程序,它能够根据两个Excel表格(假设在同一个Excel文件的不同sheet中)中的历史数据来预测未来G列数字
  • #C8# UVM中的factory机制 #S8.1.1# 多态的实现方式(三)
  • LeetCode-98. 验证二叉搜索树
  • java流程控制06:While循环
  • HeidiSQL:多数据库管理工具
  • LeeCode题库第1695题
  • 架构下的按钮效果设置
  • Linux网络套接字
  • 【C++11】lambda
  • C# WPF 命令机制(关闭CanExecute自动触发,改手动)
  • Apifox接口测试工具详细解析
  • C# 多线程并发编程基础
  • 【Block总结】PagFM,像素注意力引导融合模块|即插即用
  • 基于STM32的智能门禁系统设计与实现
  • 05-Spring Security 认证与授权机制源码解析
  • python爬虫爬取淘宝热销(热门)零食商品加数据清洗、销量、店铺及词云数据分析_源码及相关说明文档;售后可私博主
  • 【学Rust写CAD】27 双线性插值函数(bilinear_interpolation.rs)
  • python爬虫:DrissionPage实战教程
  • 基于FAN网络的图像识别系统设计与实现
  • 【软考-高级】【信息系统项目管理师】【论文基础】范围管理过程输入输出及工具技术的使用方法
  • linux提取 Suid提权入门 Sudo提权入门
  • (二)使用Android Studio开发基于Java+xml的安卓app之环境搭建