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

STM32 定时器产生定周期方法

目录

背景

程序

第一步、使能PCLK1外设时钟​编辑

第二步、时基单元配置

第三步、配置NVIC(设置定时中断优先级)​编辑

第四步、使能溢出中断

第五步、使能定时器

第六步、填写中断处理函数(ISR)


背景

在单片机开发当中,我们可以经常看到定周期函数。这些定周期函数都是通过定时器最基本定时中断功能。如果学习前面的PWM。会更快的了解相关概念。

时基单元
可编程通用定时器的主要部分是一个 16 位计数器和与其相关的自动装载寄存器。这个计数器可
以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。
计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。
时基单元包含:
● 计数器寄存器 (TIMx_CNT)
● 预分频器寄存器 (TIMx_PSC)
● 自动装载寄存器 (TIMx_ARR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在
TIMx_CR1 寄存器中的自动装载预装载使能位 (ARPE) 的设置,预装载寄存器的内容被立即或在
每次的更新事件 UEV 时传送到影子寄存器。当计数器达到溢出条件 ( 向下计数时的下溢条件 ) 并当
TIMx_CR1 寄存器中的 UDIS 位等于 ’0’ 时,产生更新事件。更新事件也可以由软件产生。随后会
详细描述每一种配置下更新事件的产生。

程序

//定时器时间计算公式Tout = ((重装载值+1)*(预分频系数+1))/时钟频率;
//例如:1秒定时,重装载值=9999,预分频系数=7199void TIM3_Init(u16 arr,u16 psc){  //TIM3 初始化 arr重装载值 psc预分频系数TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3TIM_TimeBaseInitStrue.TIM_Period=arr; //设置自动重装载值TIM_TimeBaseInitStrue.TIM_Prescaler=psc; //预分频系数TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up; //计数器向上溢出TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1; //时钟的分频因子,起到了一点点的延时作用,一般设为TIM_CKD_DIV1TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue); //TIM3初始化设置TIM3_NVIC_Init (); //开启TIM3中断向量TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);//使能TIM3中断    TIM_Cmd(TIM3,ENABLE); //使能TIM3
}void TIM3_NVIC_Init (void){ //开启TIM3中断向量NVIC_InitTypeDef NVIC_InitStructure;NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x3;	//设置抢占和子优先级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x3;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);
}

第一步、使能PCLK1外设时钟

第二步、时基单元配置

输入到计数器的时钟为      72 000 000 /(7199 +1) = 1 000HZ

计数器溢出时长生Update中断频率: 10000HZ /(9999+1) =1HZ

为何+1有在PWM中介绍。

第三步、配置NVIC(设置定时中断优先级)

第四步、使能溢出中断

计数器溢出的中断就是update中断

第五步、使能定时器

第六步、填写中断处理函数(ISR)

void TIM3_IRQHandler(void){ //TIM3中断处理函数if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET){	//判断是否是TIM3中断TIM_ClearITPendingBit(TIM3, TIM_IT_Update);//此处写入用户自己的处理程序GPIO_WriteBit(LEDPORT,LED1,(BitAction)(1-GPIO_ReadOutputDataBit(LEDPORT,LED1))); //取反LED1}
}

http://www.lryc.cn/news/539153.html

相关文章:

  • 解锁机器学习核心算法 | 支持向量机:机器学习中的分类利刃
  • 青少年编程与数学 02-009 Django 5 Web 编程 21课题、部署
  • ARM系统源码编译OpenCV 4.10.0(包含opencv_contrib)
  • cmake:定位Qt的ui文件
  • (leetcode 1749 前缀和)1749. 任意子数组和的绝对值的最大值
  • 下载安装运行测试开源vision-language-action(VLA)模型OpenVLA
  • 【网络安全 | 漏洞挖掘】我如何通过Cookie Manipulation发现主域上的关键PII?
  • 【操作系统】操作系统概述
  • SQL Server 运算符优先级
  • Python的顺序结构和循环结构
  • 深入浅出TypedArray:网络数据处理、WebGPU与加密实战
  • http 响应码影响 video 标签播放视频
  • 观察者模式原理详解以及Spring源码如何使用观察者模式?
  • 【Spring】Spring配置文件
  • MSI微星电脑冲锋坦克Pro Vector GP76 12UGS(MS-17K4)原厂Win11系统恢复镜像,含还原功能,预装OEM系统下载
  • Unity合批处理优化内存序列帧播放动画
  • 【Java】逻辑运算符详解:、|| 与、 | 的区别及应用
  • 深入解析 Flutter GetX
  • Java 大视界 -- 人才需求与培养:Java 大数据领域的职业发展路径(92)
  • 顺序表常用操作和笔试题
  • List<Map<String, Object>> 如何对某个字段求和
  • 2024亚马逊数据分析!
  • foobar2000设置DSP使用教程及软件推荐
  • Apache Logic4j 库反序列化漏洞复现与深度剖析
  • FPGA VIVADO:axi-lite 从机和主机
  • LabVIEW 中的 3dgraph.llb库
  • 【Linux】文件系统:文件fd
  • Vue学习记录19
  • MATLAB更改图论的布局:设置layout
  • 【分果果——DP(困难)】