码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • stm32f4xx-定时器


    文章目录

    • 一、硬件定时器
      • 1、定义
      • 2、STM32F407的定时器有以下特征
        • a.所有的定时器都能实现最基本的定时功能
        • b.基本定时器是专门提供给音频的输出接口
        • c.计数器模式:向上,向下,向上下
        • d.DMA(直接存储器访问)请求:传输数据只需要通过DMA,不用经过CPU,减少CPU的占用
        • e.PWM是脉冲宽度调制,在工业应用领域用途非常广泛
        • f.16位可编程分频器,用于对计数器时钟频率进行分频(运行时修改),分频系数1~65536之间
        • 注:
      • 3、计数模式
    • 二、定时计算
        • 1、如果APB预分频器为1,定时器时钟频率等于APB域(APB1和APB2)的频率(一般预分频器不可能为1)
        • 2、否则,等于APB域(APB1和APB2)的频率的两倍
      • 3、定时器硬件时钟
      • 4.定时500ms
    • 三、库函数
      • test

    一、硬件定时器

    1、定义

    ​ 设置等待时间,到达后则执行指定的操作的硬件

    2、STM32F407的定时器有以下特征

    在这里插入图片描述

    ​ 具有基本的定时功能,也有PWM输出(灯光的亮度控制、电机的转速)、脉冲捕获功能(红外捕捉)

    2个高级定时器、10个通用定时器和2个基本定时器

    高级定时器(TIM1 和 TIM8 ),挂载到APB2

    ​ 具有16位定时器功能,也具有PWM输出高级控制功能

    通用定时器(TIM2 到 TIM5),挂载到APB1

    ​ 具有16位定时器功能,也具有PWM输出控制功能

    通用定时器(TIM9 到 TIM14 ),挂载到APB1和APB2

    ​ 具有16位定时器功能,也具有PWM输出控制功能

    基本定时器:(TIM6 和 TIM7),挂载到APB1

    ​ 具有16位定时器功能

    a.所有的定时器都能实现最基本的定时功能

    b.基本定时器是专门提供给音频的输出接口

    c.计数器模式:向上,向下,向上下

    d.DMA(直接存储器访问)请求:传输数据只需要通过DMA,不用经过CPU,减少CPU的占用

    e.PWM是脉冲宽度调制,在工业应用领域用途非常广泛

    f.16位可编程分频器,用于对计数器时钟频率进行分频(运行时修改),分频系数1~65536之间

    注:

    TIM是TIMER单词的缩写

    通用定时器与高级定时器(CH表示输出通道)

    3、计数模式

    在这里插入图片描述

    二、定时计算

    《STM32F4XX中文参考手册.pdf》108页

    STM32F405xx/07xx和STM32F415xx/17xx的定时器时钟频率由硬件自动设置。分为两种情况:

    1、如果APB预分频器为1,定时器时钟频率等于APB域(APB1和APB2)的频率(一般预分频器不可能为1)

    2、否则,等于APB域(APB1和APB2)的频率的两倍

    关于APB1与APB2预分频值得说明在system_stm32f4xx.c文件的头部,详细描述如下
    在这里插入图片描述

    关于APB1和APB2预分频值设置在system_stm32f4xx.c文件,详细代码如下:

    在这里插入图片描述

    3、定时器硬件时钟

    在这里插入图片描述

    4.定时500ms

    //计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒
    
    TIM_TimeBaseStructure.TIM_Period = (10000/2)-1; 
    
    TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;   //预分频值 8400-1 + 1 = 8400 
    
    //向上计数的方法
    
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        
    
    8400 
    
    //向上计数的方法
    
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        
    
    TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    三、库函数

    使能定时器硬件时钟

    在这里插入图片描述

    定时器初始化

    在这里插入图片描述

    配置定时器

    在这里插入图片描述

    定时器使能

    在这里插入图片描述

    1.使能定时器硬件时钟

    2.定时器的硬件配置

    3.配置定时器分频值、计数值等

    4.使能定时器更新定时器的中断触发

    5.配置定时器中断nvic优先级

    6.定时器中断服务函数

    test

    void tim3_init(void)
    {
    	//使能TIM3的硬件时钟
    	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
     
    	//TIM3的硬件配置
    	//配置定时器3分频值、技术值等等
    	TIM_TimeBaseStructure.TIM_Period = (10000/2)-1;	//计数值 84000000/8400 = 10000hz/2,决定定时时间1/2秒
    	TIM_TimeBaseStructure.TIM_Prescaler = 8400-1;	//预分频值 8400-1 + 1 = 8400 
    	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;		//向上计数的方法	
    //	TIM_TimeBaseStructure.TIM_ClockDivision = 0;	//在F407是不支持
    	
    	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);
    	
    	//配置定时器3中断的触发方式:时间更新
    	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    	
    	//开启TIM3的NVIC中断
    	NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn;				//定时器3的请求通道
    	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x02;	//抢占优先级
    	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x02;			//响应优先级
    	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;				//使能该通道中断
    	NVIC_Init(&NVIC_InitStruct);
    	
    	
    	//使能定时器3工作
    	TIM_Cmd(TIM3, ENABLE);
    }
    
    //定时器3中断服务函数
    void TIM3_IRQHandler(void)
    {
    	//判断TIM3是否有中断请求
    	if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
    	{
    		PFout(9) ^= 1;
    		
    		//清空标志位,告诉CPU,已经完成当前中断处理,可以响应新的中断请求
    		TIM_ClearITPendingBit(TIM3, TIM_IT_Update);			
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    百度地图有感
    测试开发——禅道
    Netty之数据解码
    零基础转行软件测试岗位有哪些一定要注意的地方?
    c++面试题目汇总-1-57
    ASP.NET Core 6框架揭秘实例演示[41]:跨域资源的共享(CORS)N种用法
    godoc安装与go文档查询
    LSF如何看job预留slot是否合理?
    一图读懂融云出海 & 全球化通信方案
    Android 内存泄漏分析思路和案例剖析
  • 原文地址:https://blog.csdn.net/qq_45698138/article/details/126669875
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号