STM32F429通用定时器(TIM)

2023-11-19

目录

一、通用定时器是什么?

1.计数模式

2.工作过程​编辑

3.内部时钟选择

二、通用定时器HAL库函数流程

三、小实验程序要求

四、代码实现

1.TIM.h

2.TIM.c

3.main.c


一、通用定时器是什么?

        通用定时器包含一个 16 位或 32 位自动重载计数器( CNT),该计数器由可编程预分频器( PSC) 驱动。 STM32F429 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。 STM32F429 的每个通用定时器都是完全独立的,没有互相共享的任何资源。

1.计数模式

        通用定时器可以向上计数,向下计数、向上向下双向计数模式。

        ①向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。

        ②向下计数模式:计数器从自动加载值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。

        ③中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。

2.工作过程

        红色框作用就是产生CK_PSC时钟,之后经过CK_PSC预分频器,到CNT计数器,可以通过触发控制器里的从模式控制器来使CNT复位、使能、递增/递减等等。

        四种来源产生CK_PSC时钟(计数器时钟可以由以下时钟源提供):

        1.内部时钟(CK_INT);

        2.TIMx_ETR(外部时钟来源);

        3.ITR0-ITR4(定时器级联:输出的定时器可以作为输入)(内部触发输入口)经过选择器选择哪一路,一路到触发控制器;

        4.通过外部通道引脚TIMx_CH1和TIMx_CH2,经过Tl1FP1和Tl2FP2选择器到达触发控制器。   

3.内部时钟选择

       

        如果APB1分频系数是1,则CK_INT就是×1倍,就该是多是是多少;如果APB1分频系数是2或者4或者其他的系数,则CK_INT就得×2倍。

        对于F407,配置系统时钟为:

        SYSCLK = 168M;        AHB时钟 = 168M;        APB1时钟 = 42M;

        APB1分频系数 = AHB / APB1 = 4,所以通用定时器CK_INT = 2 * 42M = 48

二、通用定时器HAL库函数流程

        1.TIMx时钟使能(x:2~5)        拿TIM3为例

        HAL_RCC_TIM3_CLK_ENABLE();        // 使能TIM3时钟

        2.初始化定时器参数,设置自动重装值,分频系数,计数方式等

        HAL_TIM_Base_Init();

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

        HAL_TIM_Base_Start_IT;        // 使能句柄指定的定时器更新中断

        HAL_TIM_Base_Start;           // 使能句柄指定的定时器

       

        4.TIM3中断优先级设置

        HAL_NVIC_SetPriority(TIM3_IRQn, x, x);

        HAL_NVIC_EnableIRQ(TIM3_IRQn);

       

        5.编写中断服务函数(也要编写中断回调函数)

        void HAL_TIM_IRQHandler();        // 中断服务函数

        HAL_TIM_IRQHandler();                // 中断处理入口函数

        void HAL_TIM_PeriodElapseCallback();        // 定时器更新中断回调函数

三、小实验程序要求

        通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED1实现LED1状态取反。LED0在主函数利用delay_ms实现1s一次反转。

                                公式:Tout(溢出时间) = (ARR + 1)(PSC + 1) / Tclk

例如500ms:

        ARR + 1 = 5000        PSC + 1 = 9000        Tclk = 90M(STM32F429)

        Tout = 500ms

四、代码实现

1.TIM.h

#ifndef __TIM3_H
#define __TIM3_H

#include "sys.h"

void TIM3_Init(void);
#endif

2.TIM.c

#include "TIM3.h"
#include "led.h"

TIM_HandleTypeDef TIM3_Handler;                         // TIM句柄

void TIM3_Init(void)
{

    TIM3_Handler.Instance = TIM3;
    TIM3_Handler.Init.Period = 4999;                    // 自动装载值,公式中会自动加1                         
    TIM3_Handler.Init.Prescaler = 8999;                 // 预分频器,公式中会自动加1                     
    TIM3_Handler.Init.CounterMode = TIM_COUNTERMODE_UP;

    HAL_TIM_Base_Init(&TIM3_Handler);                   // TIM初始化

    HAL_TIM_Base_Start_IT(&TIM3_Handler);               // 使能定时器3,并且开启更新中断

}

void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)      // Init回调函数
{

    if (htim->Instance == TIM3)                          // 定时器中得判断是否为TIM3,也可也用else if来判断其他的定时器
    {

        __HAL_RCC_TIM3_CLK_ENABLE();                    // 时钟使能
    
        HAL_NVIC_EnableIRQ(TIM3_IRQn);                      // 使能TIM3中断
        HAL_NVIC_SetPriority(TIM3_IRQn, 2, 3);              // 中断优先级

    }
    
}

void TIM3_IRQHandler(void)         // 中断服务函数
{

    HAL_TIM_IRQHandler(&TIM3_Handler);                  // 中断处理入口函数

}

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)     // 中断回调函数
{

    if (htim->Instance == TIM3)                         
    {

        LED1 = !LED1;                                       // LED1反转

    }
    
}

3.main.c

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "TIM3.h"

int main()
{

    HAL_Init();
    Stm32_Clock_Init(360, 25, 2, 8);
    delay_init(180);
    uart_init(115200);
    led_Init();  
    TIM3_Init();

    while (1)
    {
         LED0 = !LED0;
         delay_ms(1000);
    }
    

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

STM32F429通用定时器(TIM) 的相关文章

随机推荐

  • python自动化测试添加日志_Python自动化测试之日志记录

    前言 在任何一个软件开发过程中 日志记录都是一个必须要做的事 记录日志 有助于问题排查 后续的大数据统计也要需要使用日志提供原始数据 Python日志库 logging Python 的日志记录工具 这是Python官方提供的日志记录库 优
  • JSP数据交互(application、cookie)

    关于作用域的对比 page
  • AWS SAA C003 S3 Type

    A solutions architect is using Amazon S3 to design the storage architecture of a new digital media application The media
  • cicd 04--构建自动化发布流程

    cicd 04 构建自动化发布流程 1 简介 2 构建过程 2 1 功能说明 2 2 jenkins gitlab 配置 2 3 测试结果 3 注意事项 4 说明 1 简介 在实际项目中 为了提高开发人员的服务发布效率 避免用户手动buil
  • ethercat foe字节对齐解决方案

    发现ecat从站的代码没实现字节对齐 头是3字节 在转换foe数据会丢数数据 修改前 brief Mailbox header typedef struct MBX STRUCT PACKED START UINT16 Length lt
  • web学习笔记

    常用属性 1 Html基础 3 常用快捷键 3 认识大前端
  • 大规模分布式消息中间件简介

    大规模分布式消息中间件简介 当前各种 RPC 中间件技术已经广泛应用于各个领域 其中 服务器之间消息通讯这种功能广泛应用于这些中间件中 于是 将这种面向消息的中间件 Message Oriented Middleware MOM 抽象出来
  • Unity Shader之——UV旋转动画

    Unity中通过Shader实现UV旋转动画 实现一个旋转效果 并且可以控制速度 方法是 以纹理中心为旋转中心 直接上代码如下 Shader Custom Simple Properties Color Color Color 1 1 1
  • How do I develop a service?

    CXF provides you with many options to build services This guide is meant to give you a quick overview of those options a
  • Failed to convert value of type ‘java.lang.String’ to required type ‘java.util.Date’

    springboot项目在接收时间类型的时候 报Failed to convert value of type java lang String to required type java util Date 的错误 这句话的意思是 把字符
  • matplotlib基础作图方法总结

    学习过程中稍微总结一下 有问题的话各位大佬可以指出来 用jupyter作图 代码如下 import numpy as np import matplotlib pyplot as plt 在jupyter中画图时 想要显示图需要 matpl
  • Java中的魔法值和解决方法

    目录 一 什么是魔法值 二 解决方法 一 什么是魔法值 魔法数值 魔法数字 魔法值 这是一个东西 不同的叫法 所谓魔法值 是指在代码中直接出现的数值 只有在这个数值记述的那部分代码中才能明确了解其含义 数字意义必须通过阅读其他代码才能推断出
  • “AI+算力”组合的潜力和机遇

    随着人工智能技术的飞速发展 AI 算力 的结合应用已成为科技行业的热点话题 甚至诞生出 AI 算力 最强龙头 的网络热门等式 这个结合不仅可以提高计算效率 还可以为各行各业带来更强大的数据处理和分析能力 从而推动创新和增长 在我看来 这个时
  • 【深度学习】yolov5 tag7.0 实例分割 从0到1的体会,从模型训练,到量化完成,bug避坑

    这里记录下yolov5 tag7 0的实例分割 因为也用过paddle家族的实例分割 能够训练出来 但是开放restiful api时遇到点小问题 还是yolov爽啊 通过这篇博文 您可以一步步的搭建自己的分割网络 文章目录 前言 一 小试
  • maxwell小白入门

    执行同步binlog数据命令路径 maxwell安装目录下执行启动命令 增量同步命令 bin maxwell config conf meituan 文件目录 具体配置文件名 properties daemon 采集历史数据 bin max
  • Thief in a Shop 【CodeForces - 632E】【背包】

    题目链接 给了N个物品 每个物品无限个 我们要的是求刚好我们拿了K个物品的时候 能组成哪几种数 我们可以想个办法去填充 那么就需要有一个所谓的0状态 然后假如不足K个的时候 就可以拿这个所谓的0状态来填充了 所以 我们把所有的数排序 然后都
  • @FeignClient注解属性

    FeignClient value run product fallback ProductClientServiceFallBack class FeignClient name runClient url localhost 8001
  • Python安装(MacOS )

    1 打开网址 Welcome to Python org 2 点击下载 downloads 2023年7月3日 最新版本 3 11 4 点击macOS 如图所示 点击会跳转到另一个界面 下滑至末尾 点击即可安装 64位的 3 得到一个pkg
  • GLSL常见函数[转]

    radians x 角度转弧度 degrees x 弧度转角度 sin x 正弦函数 传入值为弧度 三角函数与js相同 有cos余弦函数 tan正切函数 asin反正弦 acos反余弦 atan反正切等 pow x y xy exp x e
  • STM32F429通用定时器(TIM)

    目录 一 通用定时器是什么 1 计数模式 2 工作过程 编辑 3 内部时钟选择 二 通用定时器HAL库函数流程 三 小实验程序要求 四 代码实现 1 TIM h 2 TIM c 3 main c 一 通用定时器是什么 通用定时器包含一个 1