当前位置: 首页 > news >正文

STM32-基本定时器

一.基本定时器简介

  STM32F1 系列共有 8 个定时器,分别为:基本定时器、通用定时器、高级定时器。基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO。

二.基本定时器功能

在这里插入图片描述
上图为基本定时器的功能框图。

  • 时钟源:定时器时钟TIMxCLK,即内部时钟CK_INT

  • 计数器时钟:定时器时钟经过PSC预分频器后,即CK_CNT,用于驱动计数器计数 。
    计数器时钟计算方式:CK_CNT=TIMxCLK/(PSC+1)

  • 计数器CNT是一个16位的计数器,最大计数值是65535。当计数达到自动重载寄存器的时候产生更新事件,并清零重头开始计数。

  • 自动重装载寄存器:自动重装载寄存器 ARR 是一个 16 位的寄存器,这里面装着计数器能计数的最大数值。当计数到这个值的时候,如果使能了中断的话,定时器就产生溢出中断。

  • 定时时间的计算:定时时间=计数器的中断周期*中断的次数 = 1/CK_CNT * (ARR+1)

三.定时器初始化结构体

typedef struct {uint16_t TIM_Prescaler; // 预分频器uint16_t TIM_CounterMode; // 计数模式(基本定时器只能使用向上计数)uint32_t TIM_Period; // 定时器周期uint16_t TIM_ClockDivision; // 时钟分频(基本定时器不用设置)uint8_t TIM_RepetitionCounter; // 重复计算器(基本定时器不用设置)
} TIM_TimeBaseInitTypeDef;
  • TIM_Prescaler:定时器预分频器设置,时钟源经过预分频器后才是定时器时钟。
  • TIM_CounterMode:定时器计数方式,包含:向上计数、向下计数、中心对齐模式。基本定时器只能是向上计数(从0开始递增)
  • TIM_Period:定时器周期,设定自动重载寄存器的值。

四.源代码

1.定时器初始化设置和中断初始化设置

//baseTimer.c
#include "baseTimer.h"
void INIT_NVIC_CONFIG(void)
{NVIC_InitTypeDef NVIC_InitStructure;//设置中断分组NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);NVIC_InitStructure.NVIC_IRQChannel = TIM6_IRQn;//设置中断源 基本定时器 6,7NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}void INIT_BASETimer_CONFIG(void)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//开启定时器时钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);TIM_TimeBaseInitStructure.TIM_Prescaler = 71;//分频因子 CLK/(pre+1) 72MHZ/72 = 1MHZ =10^6HZ 周期是1usTIM_TimeBaseInitStructure.TIM_Period = 1000-1;//定时1ms中断  (per+1)*计数周期//初始化定时器TIM_TimeBaseInit(TIM6,&TIM_TimeBaseInitStructure);//清除计数器中断标志位TIM_ClearFlag(TIM6,TIM_FLAG_Update);//开启计数器中断TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE);//使能计数器TIM_Cmd(TIM6,ENABLE);
}

2.中断处理函数

//stm32f10x_it.h
void TIM6_IRQHandler(void)
{if(TIM_GetITStatus(TIM6,TIM_IT_Update) == SET){Time_Count++;TIM_ClearITPendingBit(TIM6,TIM_FLAG_Update);if(Time_Count == 1000){Time_Count = 0;if(FLAG == 0){FLAG = 1;}else if(FLAG == 1){FLAG = 0;}}}
}

3.主函数

//main.c
#include "stm32f10x.h"
#include "bsp_colorled.h"
#include "baseTimer.h"uint8_t FLAG=0;int main(void)
{INIT_LED_CONFIG();CLOSE_LED();INIT_NVIC_CONFIG();INIT_BASETimer_CONFIG();while(1){if(FLAG == 0){OPEN_GREEN();}else{CLOSE_LED();}}
}

五.实验现象

  • 每隔1s RGB灯绿色交替显示熄灭
  • 工程下载链接:STM32-基本定时器
http://www.lryc.cn/news/602736.html

相关文章:

  • JavaScript手录-排序算法篇
  • 二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
  • 城阳区奥赛暑假公益班第三次入门组初赛模拟赛
  • 把振动数据转成音频并播放
  • 提取apk中的各种语言翻译成表格,python脚本
  • Lakehouse: Unifying DW Advanced Analytics in Open Platforms
  • 《Java 程序设计》第 8 章 - Java 常用核心类详解
  • 未授权访问漏洞 总结
  • 阿里云【免费试用】Elasticsearch 智能运维 AI 助手
  • python毕业设计案例:基于python django的抖音数据分析与可视化系统,可视化有echarts,算法包括lstm+朴素贝叶斯算法
  • Flutter渲染引擎:Impeller和Skia
  • 低成本嵌入式Linux开发方案:通过配置文件实现参数设置
  • R语言与作物模型(以DSSAT模型为例)融合应用高级实战技术
  • 亚远景-“过度保守”还是“激进创新”?ISO/PAS 8800的99.9%安全阈值之争
  • 11.Dockerfile简介
  • 神经网络CNN、RNN、Transform
  • Avalonia的自定义边框窗口
  • opencv 模块裁剪 按需安装指定模块
  • 火线、零线、地线
  • ICPC 2024 网络赛(I)
  • 网络与信息安全有哪些岗位:(3)安全运维工程师
  • C++算法实例精讲
  • Solidity基础(教程④-ERC-4626收益金库)
  • nvim编辑器
  • unisS5800XP-G交换机配置命令之登录篇
  • Parasoft Virtualize用服务虚拟化加速银行系统的软件测试
  • uni-app switch(开关选择器) BUG
  • [免费]【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts)【论文+源码+SQL脚本】
  • 从像素到频率:OpenCV傅里叶变换
  • Java面试宝典:MySQL事务和事务的隔离级别