STM32F407系列文章之第七章 定时器中断实验

STM32F407系列文章目录

第一章 获取相关组件(注意:下载或安装不要有中文路径)
第二章 新建工程
第三章 GPIO相关配置实验
第四章 串口实验
第五章 外部中断实验
第六章 看门狗实验
第七章 定时器中断实验



前言

本文章采用Keil5及STM32F4(SDK-设计资源)进行STM32F407(ARM芯片)系列学习

  • 萌新入坑,如有不对的地方请大佬多多指教,谢谢!->欢迎评论区留言
  • 对于萌新来说,学习无非就是多看博文,但是…0.0大佬们的思维大多都有些跳跃,真的很难理解(当然大佬们估计都是为了记录或者提醒自己的工作及学习例程),所以想通过慢慢学习,把每一步都解释出来(保姆版)

第七章 定时器中断实验

1.原理图

  • MCU引脚

  • 涉及外设

2. 代码示例

  • timer.c
  • 库函数版本
#include "timer.h"

//通用定时器3中断初始化
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr, u16 psc)
{
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); // 使能TIM3时钟
	
	TIM_TimeBaseInitStructure.TIM_Period = arr; 	                // 自动重装载值
	TIM_TimeBaseInitStructure.TIM_Prescaler = psc;                  // 定时器分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; 
	
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStructure); // 初始化TIM3
	
	TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE); // 允许定时器3更新中断
	TIM_Cmd(TIM3, ENABLE); // 使能定时器3
	
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;              // 定时器3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x01; // 抢占优先级1
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03;        // 子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

//定时器3中断服务函数
void TIM3_IRQHandler(void)
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) == SET) // 溢出中断
	{
		;
	}
	TIM_ClearITPendingBit(TIM3, TIM_IT_Update); // 清除中断标志位
}
  • 寄存器版本
#include "timer.h"
 
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为42M
//arr:自动重装值
//psc:时钟预分频数
//定时器溢出时间计算方法:Tout=((arr+1)*(psc+1))/Ft us
//Ft=定时器工作频率,单位:Mhz
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr, u16 psc)
{
	RCC->APB1ENR |= 1 << 1;	// TIM3时钟使能    
 	TIM3->ARR = arr;  	    // 设定计数器自动重装值 
	TIM3->PSC = psc;  	    // 预分频器	  
	TIM3->DIER |= 1 << 0;   // 允许更新中断	  
	TIM3->CR1 |= 0x01;      // 使能定时器3
  	MY_NVIC_Init(1, 3, TIM3_IRQn, 2); // 抢占1,子优先级3,组2									 
}

//定时器3中断服务程序	 
void TIM3_IRQHandler(void)
{ 		    		  			    
	if (TIM3->SR & 0X0001) // 溢出中断
	{
		;			    				   				     	    	
	}				   
	TIM3->SR &= ~(1 << 0); // 清除中断标志位 	    
}
  • timer.h
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"

void TIM3_Int_Init(u16 arr, u16 psc);
#endif
  • main.c
#include "sys.h"
#include "delay.h"  
#include "timer.h"

int main(void)
{  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); // 设置系统中断优先级分组2
	//Stm32_Clock_Init(336, 8, 2, 7); // 设置时钟,168Mhz 
	delay_init(168); // 延时初始化  
 	TIM3_Int_Init(5000-1, 8400-1); // 10Khz的计数频率,计数5K次为500ms     
	while(1)
	{
		;
	}
}

总结

本章为TMS320F280049学习系列文章 第七章:定时器中断实验

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
除了TIM6和TIM7以外的定时器,其他定时器都可以用来产生PWM输出。其中高级定时器TIM1和TIM8可以同时产生多达7路的PWM输出,而通用定时器也能同时产生多达4路的PWM。此外,STM32定时器还具有输入捕获功能,可以用于对输入信号的频率、占空比、高低脉宽等参数的计算。对于PWM输入捕获,可以通过设置定时器的通道来实现。例如,通过利用TIM3_CH1作为PWM输出,TIM2_CH2进行捕获,可以测量出PWM的频率和占空比。具体步骤如下:首先设置PWM输出频率为1KHz,占空比为50%。为了实现PWM输入捕获,TIM2占用了2个通道,其中第2通道的电平变化会被第1通道和第2通道引脚检测到。假设输入的PWM从低电平开始跳变,在第一个上升沿到来时,1,2通道同时检测到上升沿。而从机设置为复位模式,将TIM2的计数值复位至0,此时不会产生一个中断请求。下一个到来的电平是下降沿,此时通道1发生捕获事件,将计数值存入通道1的CCR1里。然后是第二个上升沿到来后,此时通道2发生捕获事件,将此时的计数值存入通道2的CCR2里。复位模式此时又将TIM2计数值复位至0,等待第二个下降沿到来。一次捕获过程完成,则PWM的频率f=72M/CCR2,占空比duty=(CCR1/CCR2) X 100%。综上所述,STM32定时器可以实现PWM输入捕获功能,并可以用来测量PWM的频率和占空比。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [stm32定时器部分学习(通用定时器的用法、PWM、输入捕获)](https://blog.csdn.net/non_mainstream/article/details/79221519)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [stm32定时器pwm模式输入捕获](https://blog.csdn.net/qq_29413829/article/details/52743273)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值