基本概念

STM32中有三种定时器,高级定时器,通用定时器,基本定时器,具体如下图:

发生如下事件将产生中断/DMA

  • 更新:计数器向上溢出/向下溢出,计数器初始化
  • 触发事件:计数器启动、停止、初始化或者由内部/外部触发计数
  • 输入捕获
  • 输出比较
  • 支持针对定位的增量(正交)编码器和霍尔传感器电路
  • 触发事件作为外部时钟或者按周期的电流管理

计数器模式

  1. 向上计数:计数器从0计数到自动加载值ARR,然后重新冲0开始计数并且产生一个计数器溢出事件
  2. 向下计数模式:计数器从自动装入的值ARR开始向下计数到0,然后从自动装载值重新开始,并产生一个计数器向下溢出事件
  3. 终于对齐模式(向上/向下计数):计数器从0开始计数到自动装载值的值-1,产生一个计数器溢出事件,然后向下计数到1并产生一个计数器溢出事件,然后再从0开始重新计数

定时器中断实现步骤

  1. 使能定时器
__HAL_RCC_TIM3_CLK_ENABLE();
  1. 初始化定时器,配置ARR,PSC
HAL_TIM_Base_Init();
  1. 开启定时器中断
HAL_TIM_Base_Start();
HAL_TIM_Base_Start_IT();
  1. 设置中断优先级
HAL_NVIC_SetPriority();
HAL_NVIC_EnableIRQ();
  1. 编写中断服务函数
TIMx_IRQHandler();//中断服务函数
HAL_TIM_IRQHandler();   //HAL库定时器中断通用处理函数
HAL_TIM_PeriodElapsedCallback();    //定时器更新中断回调函数

具体代码

使用TIM3让LED1每500ms亮一次

  1. 使能定时器,我们放在第二步
  2. 初始化定时器,配置ARR,PSC
TIM_HandleTypeDef time_handler;
void time_init(void)
{time_handler.Instance = TIM3;         //可以取TIM1-TIM14time_handler.Init.CounterMode = TIM_COUNTERMODE_UP;     //计数模式,向上/下time_handler.Init.Period = 5000-1;   //自动装载值,即ARR的值time_handler.Init.Prescaler = 9000-1;//预分配系数,即PSC的值            //定时时间=(Period+1)(Prescaler+1)/Tclk=90000000(9Mhz)//time_handler.Init.ClockDivision=           时钟分频因子:定时器时钟与数字滤波器分频比//time_handler.Init.RepetitionCounter=     重复计数次数:高级定时器使用HAL_TIM_Base_Init(&time_handler);
}void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3){__HAL_RCC_TIM3_CLK_ENABLE();HAL_NVIC_EnableIRQ(TIM3_IRQn);HAL_NVIC_SetPriority(TIM3_IRQn,3,3);HAL_TIM_Base_Start_IT(&time_handler);    //开启定时器并更新中断,以后每次更新中断,都会调用TIM3_IRQHandler}}

HAL_TIM_Base_Init初始化定时器后,会调用HAL_TIM_Base_MspInit函数,我们可以在HAL_TIM_Base_MspInit中使能TIM3,HAL_TIM_Base_MspInit还开启TIM3中断以及设置中断优先级

对于Init参数

  • Instance 可以取值TIM1到TIM14,表示使用哪个定时器
  • CounterMode :计数模式,向上/下
  • Period :自动装载值,即ARR的值
  • Prescaler :预分配系数,即PSC的值
  • ClockDivision: 时钟分频因子,定时器时钟与数字滤波器分频比
  • RepetitionCounter:重复计数次数,高级定时器使用

定时时间=(Period+1)(Prescaler+1)/Tclk
Tclk:输入时钟频率,TIM3为90M,计算得出定时时间=0.5s

  1. 开启定时器中断,在步骤2中完成
  2. 设置中断优先级,在步骤2中完成

步骤1-4是配置TIM3定时器中断,步骤5是来处理TIM3定时器中断

  1. 编写中断服务函数
void TIM3_IRQHandler(void)
{HAL_TIM_IRQHandler(&time_handler);     //HAL定时器中断通用函数
}//定时器通用更新中断回调函数
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{if(htim->Instance == TIM3){LED1 = !LED1;}}

当定时器TIM3时间到了时,会调用TIM3_IRQHandler函数,每个定时器都用一个中断服务处理函数,在TIM3_IRQHandler中,我们使用了HAL库定时器通用处理函数HAL_TIM_IRQHandler,HAL_TIM_IRQHandler内部会调用HAL_TIM_PeriodElapsedCallback更新回调函数,我们在HAL_TIM_PeriodElapsedCallback写逻辑处理就可以了

main函数调用time_init即可,具体代码

int main(void)
{//u8 press;HAL_Init();Stm32_Clock_Init(360,25,2,8);delay_init(180);Rcc_Init();LED_Init();KEY_Init();time_init();while(1){}}

定时器--STM32f4--HAL相关推荐

  1. STM32F4 HAL库开发 -- 串口

    一.串口介绍 串口设置包含:开启串口时钟.设置响应的IO口模式.设置波特率.数据位长度.奇偶校验位.DMA等信息. 具体参看:STM32开发 – 串口详解 二.函数 1.串口参数初始化,并使能串口. ...

  2. stm32f4 hal 4位数码管_STM32裸机开发基础篇01开发环境搭建(HAL库)

    前言 众所周知,在32位单片机中,STM32占有重要市场份额,其社区活动频繁,网上相关资料也比较多,无论是学习入门,还是工作使用,都无疑是极好的选择,本节开始,我们将学习如何使用STM32,首先,我们 ...

  3. STM32F4 HAL库开发 -- 独立看门狗(IWDG)

    之前讲过看门狗,参看:STM32开发 – 看门狗详解 一.HAL库配置独立看门狗步骤 1.取消寄存器写保护,设置看门狗预分频系数和重装载值. 首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器 ...

  4. STM32F4 HAL库开发 -- RTC

    一.STM32F407 RTC时钟简介 STM32F407的RTC,是一个独立的BCD定时器/计数器.RTC提供了一个日历时钟(包含年月日时分秒信息).两个可编程闹钟(ALARM A和ALARM B) ...

  5. STM32F4 HAL库开发 -- STM32CubeMX

    一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的 STM32 芯片图形化配置工具, 允许用户使用图形化向导生成 C 初始化代码,可以大大减轻开发工作,时 ...

  6. STM32F4 HAL库开发 --时钟使能和配置

    在STM32F4的HAL库中,外设时钟使能操作都是在RCC相关固件库文件头文件stm32f4xx_hal_rcc.h 定义的.外设时钟使能在HAL库中都是通过宏定义标识符来实现.首先,我们来看看GPI ...

  7. STM32F4 HAL库开发 -- 工程模板解读

    一.关键文件介绍 1.HAL库关键文件 stm32f4xx_hal_ppp.c/.h 基本外设的操作API,ppp代表任意外设.其中stm32f4xx_hal_cortex.c/.h比较特殊,它是一些 ...

  8. STM32F4 HAL库开发 -- 再识

    之前开发都是基于STM32F105 和 STM32F429,使用的是标准库,操作系统是UCOSII操作系统的. 新入职公司,使用的是STM32F407 和 STM32F429,使用的是HAL库的,国产 ...

  9. STM32F4 HAL库开发 -- 温度传感器(DS18B20)

    参看:<嵌入式-STM32开发指南>第三部分 外设篇 - 第2章 温度传感器DS18B20 这篇文章讲的非常详细了. 一.简介 1.概述 DS18B20 是 DALLAS 最新单线数字温度 ...

  10. STM32F4 HAL库开发 -- USB U盘

    主要实现读写 U 盘/读卡器等大容量 USB 存储设备. 一.U盘简介 U盘,全程USB闪存盘,英文名"USB flash disk".它是一种使用USB接口的无需物理驱动器的微型 ...

最新文章

  1. The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp
  2. DHTML中style的display和visibility属性
  3. PLSQL常用方法汇总(转载)
  4. 【实例】销售合同VA41屏幕字段增强实例
  5. 使用宝塔面板进行wordpress建站
  6. 反思本地测试没有问题 但测试服务器存在问题的解决方法:1.文件夹2.分支切换
  7. LeetCode 740. 删除与获得点数(排序+动态规划)
  8. python之函数基础
  9. 计算机组装与维护推荐教材,计算机组装与维护(全国高等专科教育计算机类规划教材)...
  10. MY_0001:添加命令到自定义工具栏
  11. linux安装时路径错误,科学网—安装Linux版的hysplit及相关问题集锦-系统Centos - 周勤迁的博文...
  12. 菜肴百度百科html,酸汤鱼
  13. 利用SPSS对数据转置和数据整理
  14. ECMAScript 语法
  15. Hibernate手动控制事物
  16. 搞中视频搬运赚钱,只因我用了这些方法
  17. GSMA公布2018世界移动大会-上海的最新进展
  18. 高科技恢复展示模式-VR安全教育|广州华锐互动
  19. 高一职上册计算机技能考试,职高数学高一基础模块上册
  20. vue中非父子组件通信

热门文章

  1. 点击图片放大至原始图片大小
  2. CSS3 iphone式开关的推荐写法
  3. DRF url控制 解析器 响应器 版本控制 分页(常规分页,偏移分页,cursor游标分页)...
  4. 使用EasyPoi导出Excel
  5. 《软件需求十步走》阅读笔记06
  6. 【Centos】yum 安装mariaDB
  7. Android学习——ListView的缓存机制
  8. 如何判断微信内置浏览器(JS PHP)
  9. jquery实现导航栏鼠标点击后实行背景高亮,点击离开恢复(超级简单!!!!)...
  10. Redis-主从复制