STM32——定时器中断实验
一、内部时钟选择
(计数器时钟可以有多个时钟源提供:内部时钟、外部时钟模式1、外部时钟模式2、内部触发模式。本次以内部时钟为时钟源,进行学习)
1、选择内部时钟 2、设置预分频系数、自动重装载值 3、使能定时器,写中断服务函数
通用定时器来源时APB1时钟,经过一个倍频系数产生CK_PSC,再通过一个分频产生CK_CNT。
如果APB1的分频系数为1,则通用定时器时钟就等于APB1时钟,否则通用定时器时钟就为APB1时钟的2倍。
例如:默认调用Systemlnit函数情况下:SYSCLK=168M AHB时钟=168M APB1时钟=42M
APB1的分频系数=AHB/APB1时钟=4 所以,通用定时器时钟CK_INT=2*42M=84M
二、计数模式详细工作原理
1、向下计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
假设时钟分频因子为1,则CK_INT与APB1相同,定时器时钟=CK_INT。首先使能定时器(CNT_EN),向上计数到重装载值36,计数到36之后会产生一个溢出事件并溢出,产生更新事件,接着计数器再次从0开始计数到36后再次产生更新事件。第一次向上计数到ARR产生一个中断,然后又从0开始第二次向上计数到ARR产生中断,即计时的长度就是从第一次计数开始到第二次计数开始(0~ARR之间)。
2、向下计数模式
同向上计数模式差不多,只是向下计数是从初值开始递减计数直到0
3、中央对齐计数模式
从自动重装载值计数到0会产生更新事件,然后再从0开始计数到ARR再次产生更新事件。
三、向上计数模式使用通用定时器
1、计数器当前值寄存器(TIMx_CNT)16位计数器
2、预分频寄存器(TIMx_PSC)16位设置预分频值
3、自动重装载寄存器(TIMx_ARR)16位寄存器
4、控制寄存器1(TIMx_CR1)位4控制计数方向(向上/向下),位0施恩计数器
5、DMA中断使能寄存器(TIMx_DIER)使能中断
四、常用库函数
1、定时器参数初始化:void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);
typedef struct
{uint16_t TIM_Prescaler; //预分频系数PSCuint16_t TIM_CounterMode;//计数器模式DIRuint32_t TIM_Period;//自动装载值uint16_t TIM_ClockDivision; //输入捕获uint8_t TIM_RepetitionCounter;}
TIM_TimeBaseStructure.TIM_Period=4999;//设置自动装载值TIM_TimeBaseStructure.TIM_Prescaler=7199;//预分频系数TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器计数模式TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
2、定时器使能函数:
void TIM_Cmd(TIM_TypeDef* TIMx,FuctionalState NewState);
3、定时器中断使能函数:
void TIM_ITConfig(TIM_TypeDef* TIMx,uint16_t TIM_IT,FunctionalState NewState);
4、状态标志位获取和清除:
FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);
void TIM_ClearFlag(TIM_TypeDef* TIMx,uint16_t TIM_FLAG);
ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx,uint16_t TIM_IT);
void TIM_ClearITPendingBit(TIM_TypeDef* TIMx,uint16_t TIM_IT):
五、定时器中断使能步骤
1、使能定时器时钟:RCC_APB1PeriphClockCmd();
2、初始化定时器,配置ARR、PSC:TIM_YimeBaseInit();
3、开启定时器中断,配置NVIC:NVIC_Init();
4、使能定时器:TIM_Cmd();
5、编写中断服务函数:TIMx_IRQHandler();
6、代码(通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反闪烁,溢出时间:Tout=(ARR+1)(PSC+1)/Tclk)
int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);delay_init(168);LED_Init();TIM3_Int_Init(4999,8399);while(1){LED0=!LED0;delay_ms(500);LED1=!LED1;}
}void TIM3_Int_Init(u16 arr,u16 psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitABC;
NVIC_InitTypeDef NVIC_InitABC;RCC_AHB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitABC.TIM_Period=arr;TIM_TimeBaseInitABC.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitABC.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitABC.TIM_Prescaler=psc;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitABC);TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);NVIC_InitABC.NVIC_IRQChannel=TIM3_IRQn;NVIC_InitABC.NVIC_IRQChannelCmd=0x01;NVIC_InitABC.NVIC_IRQChannelPreemptionPriority=0x03;NVIC_InitABC.NVIC_IRQChannelSubPriority=ENABLE;NVIC_Init(&NVIC_InitABC);TIM_Cmd(TIM3,ENABLE);
}
void TIM3_IRQHandler(void){if(TIM_GetITStatus(TIM3,TIM_IT_Update)!=RESET)
{LED1=!LED1;TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
}}#ifndef _TIMER_H
#define _TIMER_H#include"sys.h"void TIM3_Tin_Init(u16 arr,u16 psc);//16位寄存器,arr重装载值,psc预分频系数#endif
定时器中断实验
STM32——定时器中断实验相关推荐
- STM32定时器中断实验-学习笔记
目录 目录 目录 通用定时器简介 寄存器 控制寄存器 (TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄存器(TIMx_PSC) TIMx_CNT 寄存器 自动重装载寄存器( ...
- STM32定时器中断实验
情况如下:通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)[其中,我们可以在里面创新一下,我创新的是蜂鸣器200ms响一次,然后500ms,LED1取 ...
- STM32定时器中断
目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...
- 基于STM32F103ZET6库函数定时器中断实验
基于STM32F103ZET6库函数定时器中断实验 STM32F1 通用定时器简介 定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中 ...
- STM32 定时器中断
通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使 ...
- STM32CubeMX 实战教程:定时器中断实验(LL 库)
1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取: 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章: 博主分享不易,请给三连哦(关注 + 点赞 + 收藏 ...
- 7. STM32——定时器中断(1秒闪烁灯)
STM32--定时器中断(1秒闪烁灯) 基本框架 1. 配置定时器时钟 在 stm32f10x_rcc.h 头文件中查找相关函数函数 2. 配置定时器结构体 在 stm32f10x_tim.h 头文件 ...
- stm32定时器中断的配置步骤
stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...
- 【CubeMX配置stm32定时器中断】
CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...
最新文章
- 五分钟带你了解哈希算法
- php中time()和mktime()方法的区别
- 普通程序员,几个月如何成功转型AI?
- arm linux ping 通百度,linux ---之与ARM开发板相互ping 通
- SpringBoot 配置多数据源
- leetcode 904:水果成篮(滑动窗口)
- oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快
- 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
- 【每日学习】Apache重写未开启,导致The requested URL /xxxx.html was not found on this server...
- 后端开发必备的 MySQL 日志文件知识点
- Action类一般情况为何要继承ActionSupport
- android 图片处理器-包括反转、浮雕、锐化、轮廓提取功能
- [转]真正了解CSS3背景下的@font face规则
- 数据治理:数据指标管理平台解决方案
- linux 安装ros软路由,Centos7安装RouterOS软路由
- 3、MybatisPlus
- Server Tomcat v7.0 Server at localhost failed to start.
- Oracle监听服务启动失败案例
- Numpy-如何对数组进行切割
- java 如何实现多条件筛选,JAVA-日常工作解决的bug2-多选条件筛选