STM32综合实验:定时器中断同时产生两路不同频率的信号

STM32综合实验:定时器中断同时产生两路不同频率的信号


一、实验目的

使用STM32同时产生两路不同频率的信号,并通过观察开发板两个LED闪烁快慢的现象,以及在MDK5中软件仿真逻辑分析中查看波形,体现两路信号频率的不同。

二、实验原理

通过定时器中断配置,定时器3每600ms中断一次,然后中断服务函数中控制LED实现LED1状态取反(闪烁);定时器4每200ms中断一次,然后中断服务函数中控制LED实现LED0状态取反(闪烁)。

本实验用到的硬件资源有:
1) 指示灯 LED0 和 LED1
2) 定时器 TIM3,TIM4
TIM3,TIM4属于 STM32 的内部资源,只需要软件设置即可正常工作。

1、通用定时器电路框图
STM32综合实验:定时器中断同时产生两路不同频率的信号_第1张图片

2、计数器模式
采用向上计数
向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事件。
STM32综合实验:定时器中断同时产生两路不同频率的信号_第2张图片

3、信号周期计算(定时器溢出时间)
TIM3 的时钟为 72 M,再根据我们设计的 arr 和 psc的值, 就可以计算中断时间了。公式如下:
Tout= ((arr +1)*(psc+1)) /Tclk;
其中:
Tclk :TIM3 的输入时钟频率 (单位为 Mhz)。
Tout :TIM3 溢出时间(单位为 us)。

4、定时器中断实现步骤
(1) 能定时器时钟。
RCC_APB1PeriphClockCmd();
(2) 初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit();
(3) 开启定时器中断,配置NVIC。
void TIM_ITConfig();
NVIC_Init();
(4) 使能定时器。
TIM_Cmd();
(5) 编写中断服务函数。
TIMx_IRQHandler();

三、实验代码

timer.c

#include "timer.h"
#include "led.h"
//通用定时器3中断初始化
//这里时钟选择为APB1的2倍,而APB1为36M
//arr:自动重装值。
//psc:时钟预分频数
//这里使用的是定时器3!
void TIM3_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能
	
	//定时器TIM3初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM3, ENABLE);  //使能TIMx					 
}
//定时器3中断服务程序
void TIM3_IRQHandler(void)   //TIM3中断
{
	if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)  //检查TIM3更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );  //清除TIMx更新中断标志 
		LED1=!LED1;
		}
}

//这里使用的是定时器4!
void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //时钟使能
	
	//定时器TIM4初始化
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值	
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据指定的参数初始化TIMx的时间基数单位
 
	TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //使能指定的TIM4中断,允许更新中断

	//中断优先级NVIC设置
	NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQn;  //TIM4中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
	NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器


	TIM_Cmd(TIM4, ENABLE);  //使能TIMx					 
}
//定时器4中断服务程序
void TIM4_IRQHandler(void)   //TIM4中断
{
	if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  //检查TIM4更新中断发生与否
		{
		TIM_ClearITPendingBit(TIM4, TIM_IT_Update  );  //清除TIMx更新中断标志 
		LED0=!LED0;
		}
}

main.c

#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"
	
 int main(void)
 {		
 
	delay_init();	    	 //延时函数初始化	  
	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
	uart_init(115200);	 //串口初始化为115200
 	LED_Init();			     //LED端口初始化
	TIM3_Int_Init(5999,7199);//10Khz的计数频率,计数到6000为600ms  
	TIM4_Int_Init(1999,7199);//10Khz的计数频率,计数到2000为200ms 
	 
	 while(1)
	{
	}	 

 
}	 
 

四、结果分析

1、MDK5的软件仿真中的逻辑分析

STM32综合实验:定时器中断同时产生两路不同频率的信号_第3张图片

波形对应LED说明如下

定时器 亮灯 引脚 周期 波形颜色
TIM3 LED1(绿色灯) PE5 600ms 绿色波
TIM4 LED0(红色灯) PB5 200ms 红色波

2、开发板现象
如图
LED0红色灯闪的更快,差不多是红色灯闪3次,绿色灯闪1次。
这与软件仿真相符。

STM32综合实验:定时器中断同时产生两路不同频率的信号_第4张图片
3、注意事项
要确认外部晶振频率为8.0Mhz,不然会计时不准。
STM32综合实验:定时器中断同时产生两路不同频率的信号_第5张图片

STM32综合实验:定时器中断同时产生两路不同频率的信号_第6张图片

你可能感兴趣的:(STM32综合实验:定时器中断同时产生两路不同频率的信号)