一、内部时钟选择

(计数器时钟可以有多个时钟源提供:内部时钟、外部时钟模式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——定时器中断实验相关推荐

  1. STM32定时器中断实验-学习笔记

    目录 目录 目录 通用定时器简介 寄存器 控制寄存器 (TIMx_CR1) DMA/中断使能寄存器(TIMx_DIER) 预分频寄存器(TIMx_PSC) TIMx_CNT 寄存器 自动重装载寄存器( ...

  2. STM32定时器中断实验

    情况如下:通过定时器中断配置,每500ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁)[其中,我们可以在里面创新一下,我创新的是蜂鸣器200ms响一次,然后500ms,LED1取 ...

  3. STM32定时器中断

    目录 一.关于STM32定时器中断 1.定时器分类 2.通用定时器的功能特点 3.定时器中断的触发 4.定时时钟计算方法 二.CubeMX初始化配置 1.芯片选型(我们这里运用的STM32F103C8 ...

  4. 基于STM32F103ZET6库函数定时器中断实验

    基于STM32F103ZET6库函数定时器中断实验 STM32F1 通用定时器简介 定时器相关的库函数主要集中在固件库文件 stm32f10x_tim.h 和 stm32f10x_tim.c 文件中 ...

  5. STM32 定时器中断

    通用定时器工作过程: 时钟选择: 计数器时钟可以由下列时钟源提供: 内部时钟(CK_INT) 外部时钟模式1:外部输入脚(TIx) 外部时钟模式2:外部触发输入(ETR) 内部触发输入(ITRx):使 ...

  6. STM32CubeMX 实战教程:定时器中断实验(LL 库)

    1.资源的获取:关注博主并点赞对应博客,并在文章下留言邮箱索取: 2.资源的类型:获取资源仅限于免费公开文章或粉丝免费专享文章,不包括付费文章:   博主分享不易,请给三连哦(关注 + 点赞 + 收藏 ...

  7. 7. STM32——定时器中断(1秒闪烁灯)

    STM32--定时器中断(1秒闪烁灯) 基本框架 1. 配置定时器时钟 在 stm32f10x_rcc.h 头文件中查找相关函数函数 2. 配置定时器结构体 在 stm32f10x_tim.h 头文件 ...

  8. stm32定时器中断的配置步骤

    stm32定时器中断的配置步骤 1>TIM3 时钟使能 位于低速的APB1总线上(注意:高级定时器是在高速的APB2总线上): RCC_APB1PeriphClockCmd(RCC_APB1Pe ...

  9. 【CubeMX配置stm32定时器中断】

    CubeMX配置stm32定时器中断 一.使用CubeMX对STM32进行基础的配置 1.选择需要使用的定时器 选择TIM2和TIM3示例, 注意: TIM2和其它定时器选择时钟的方法不同,TIM3等 ...

最新文章

  1. 五分钟带你了解哈希算法
  2. php中time()和mktime()方法的区别
  3. 普通程序员,几个月如何成功转型AI?
  4. arm linux ping 通百度,linux ---之与ARM开发板相互ping 通
  5. SpringBoot 配置多数据源
  6. leetcode 904:水果成篮(滑动窗口)
  7. oracle中exists连接两个表,IN、EXISTS、多表连接,哪个速度更快
  8. 西门子滚筒洗衣机教程_西门子洗衣机怎么样 西门子洗衣机哪款好
  9. 【每日学习】Apache重写未开启,导致The requested URL /xxxx.html was not found on this server...
  10. 后端开发必备的 MySQL 日志文件知识点
  11. Action类一般情况为何要继承ActionSupport
  12. android 图片处理器-包括反转、浮雕、锐化、轮廓提取功能
  13. [转]真正了解CSS3背景下的@font face规则
  14. 数据治理:数据指标管理平台解决方案
  15. linux 安装ros软路由,Centos7安装RouterOS软路由
  16. 3、MybatisPlus
  17. Server Tomcat v7.0 Server at localhost failed to start.
  18. Oracle监听服务启动失败案例
  19. Numpy-如何对数组进行切割
  20. java 如何实现多条件筛选,JAVA-日常工作解决的bug2-多选条件筛选

热门文章

  1. 加入购物车与购物车加减
  2. angularjs 获取复选框的值_加快周期进度,DNF疲劳药获取指南
  3. pxcook的新手使用,测量图片,取色
  4. OSChina 周三乱弹 ——怎么让程序员精神百倍?
  5. UE4渲染管线学习笔记
  6. 【通信学习】一些5G基本概念
  7. 【游戏程序设计】地图拼接
  8. 关于软件开发需求分析的分享~
  9. ROS下的自主导航机器人软硬件设计
  10. linux使用sed进行字符替换