定时器--STM32f4--HAL
基本概念
STM32中有三种定时器,高级定时器,通用定时器,基本定时器,具体如下图:
发生如下事件将产生中断/DMA
- 更新:计数器向上溢出/向下溢出,计数器初始化
- 触发事件:计数器启动、停止、初始化或者由内部/外部触发计数
- 输入捕获
- 输出比较
- 支持针对定位的增量(正交)编码器和霍尔传感器电路
- 触发事件作为外部时钟或者按周期的电流管理
计数器模式
- 向上计数:计数器从0计数到自动加载值ARR,然后重新冲0开始计数并且产生一个计数器溢出事件
- 向下计数模式:计数器从自动装入的值ARR开始向下计数到0,然后从自动装载值重新开始,并产生一个计数器向下溢出事件
- 终于对齐模式(向上/向下计数):计数器从0开始计数到自动装载值的值-1,产生一个计数器溢出事件,然后向下计数到1并产生一个计数器溢出事件,然后再从0开始重新计数
定时器中断实现步骤
- 使能定时器
__HAL_RCC_TIM3_CLK_ENABLE();
- 初始化定时器,配置ARR,PSC
HAL_TIM_Base_Init();
- 开启定时器中断
HAL_TIM_Base_Start();
HAL_TIM_Base_Start_IT();
- 设置中断优先级
HAL_NVIC_SetPriority();
HAL_NVIC_EnableIRQ();
- 编写中断服务函数
TIMx_IRQHandler();//中断服务函数
HAL_TIM_IRQHandler(); //HAL库定时器中断通用处理函数
HAL_TIM_PeriodElapsedCallback(); //定时器更新中断回调函数
具体代码
使用TIM3让LED1每500ms亮一次
- 使能定时器,我们放在第二步
- 初始化定时器,配置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
- 开启定时器中断,在步骤2中完成
- 设置中断优先级,在步骤2中完成
步骤1-4是配置TIM3定时器中断,步骤5是来处理TIM3定时器中断
- 编写中断服务函数
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相关推荐
- STM32F4 HAL库开发 -- 串口
一.串口介绍 串口设置包含:开启串口时钟.设置响应的IO口模式.设置波特率.数据位长度.奇偶校验位.DMA等信息. 具体参看:STM32开发 – 串口详解 二.函数 1.串口参数初始化,并使能串口. ...
- stm32f4 hal 4位数码管_STM32裸机开发基础篇01开发环境搭建(HAL库)
前言 众所周知,在32位单片机中,STM32占有重要市场份额,其社区活动频繁,网上相关资料也比较多,无论是学习入门,还是工作使用,都无疑是极好的选择,本节开始,我们将学习如何使用STM32,首先,我们 ...
- STM32F4 HAL库开发 -- 独立看门狗(IWDG)
之前讲过看门狗,参看:STM32开发 – 看门狗详解 一.HAL库配置独立看门狗步骤 1.取消寄存器写保护,设置看门狗预分频系数和重装载值. 首先我们必须取消 IWDG_PR和 IWDG_RLR寄存器 ...
- STM32F4 HAL库开发 -- RTC
一.STM32F407 RTC时钟简介 STM32F407的RTC,是一个独立的BCD定时器/计数器.RTC提供了一个日历时钟(包含年月日时分秒信息).两个可编程闹钟(ALARM A和ALARM B) ...
- STM32F4 HAL库开发 -- STM32CubeMX
一.STM32CubeMX 简介 STM32CubeMX 是 ST 意法半导体近几年来大力推荐的 STM32 芯片图形化配置工具, 允许用户使用图形化向导生成 C 初始化代码,可以大大减轻开发工作,时 ...
- STM32F4 HAL库开发 --时钟使能和配置
在STM32F4的HAL库中,外设时钟使能操作都是在RCC相关固件库文件头文件stm32f4xx_hal_rcc.h 定义的.外设时钟使能在HAL库中都是通过宏定义标识符来实现.首先,我们来看看GPI ...
- STM32F4 HAL库开发 -- 工程模板解读
一.关键文件介绍 1.HAL库关键文件 stm32f4xx_hal_ppp.c/.h 基本外设的操作API,ppp代表任意外设.其中stm32f4xx_hal_cortex.c/.h比较特殊,它是一些 ...
- STM32F4 HAL库开发 -- 再识
之前开发都是基于STM32F105 和 STM32F429,使用的是标准库,操作系统是UCOSII操作系统的. 新入职公司,使用的是STM32F407 和 STM32F429,使用的是HAL库的,国产 ...
- STM32F4 HAL库开发 -- 温度传感器(DS18B20)
参看:<嵌入式-STM32开发指南>第三部分 外设篇 - 第2章 温度传感器DS18B20 这篇文章讲的非常详细了. 一.简介 1.概述 DS18B20 是 DALLAS 最新单线数字温度 ...
- STM32F4 HAL库开发 -- USB U盘
主要实现读写 U 盘/读卡器等大容量 USB 存储设备. 一.U盘简介 U盘,全程USB闪存盘,英文名"USB flash disk".它是一种使用USB接口的无需物理驱动器的微型 ...
最新文章
- The Minimum Cycle Mean in a Digraph 《有向图中的最小平均权值回路》 Karp
- DHTML中style的display和visibility属性
- PLSQL常用方法汇总(转载)
- 【实例】销售合同VA41屏幕字段增强实例
- 使用宝塔面板进行wordpress建站
- 反思本地测试没有问题 但测试服务器存在问题的解决方法:1.文件夹2.分支切换
- LeetCode 740. 删除与获得点数(排序+动态规划)
- python之函数基础
- 计算机组装与维护推荐教材,计算机组装与维护(全国高等专科教育计算机类规划教材)...
- MY_0001:添加命令到自定义工具栏
- linux安装时路径错误,科学网—安装Linux版的hysplit及相关问题集锦-系统Centos - 周勤迁的博文...
- 菜肴百度百科html,酸汤鱼
- 利用SPSS对数据转置和数据整理
- ECMAScript 语法
- Hibernate手动控制事物
- 搞中视频搬运赚钱,只因我用了这些方法
- GSMA公布2018世界移动大会-上海的最新进展
- 高科技恢复展示模式-VR安全教育|广州华锐互动
- 高一职上册计算机技能考试,职高数学高一基础模块上册
- vue中非父子组件通信