stm32f4定时器8的使用

1、定时器8属于高级定时器,中断有四个,中断函数的名字也不一样,特别注意。需要查找确定。
在这里插入图片描述

在这里插入图片描述
2、初始化代码:


/*
	@定时器8:定时20ms,50HZ,读取编码器数据,并处理得到
	//注意,定时器1用APB2时钟线

*/
void TIM8_Int_Init(u16 arr,u16 psc)
{
    
    
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8,ENABLE);  	//=====TIM8时钟使能 	

  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_TimeBaseInitStructure.TIM_RepetitionCounter = 0;// 重复计数器的值,没用到不用管
	TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStructure);//初始化TIM8
	
	TIM_ITConfig(TIM8,TIM_IT_Update,ENABLE); //允许定时器8更新中断  
  TIM_ClearFlag(TIM8,TIM_FLAG_Update);
	TIM_Cmd(TIM8,DISABLE); //定时器8
	
  //确定定时器8的中断优先级,
  //		//定时器8中断配置
	NVIC_InitStructure.NVIC_IRQChannel=TIM8_UP_TIM13_IRQn; //定时器8更新中断
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0x00; //抢占优先级0
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0x01; //子优先级01
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);
}

3、中断函数,注意,LED1是F7引脚,所以用逻辑分析仪接F7,代替LED灯,测试引脚的波形。


//*************************************************
//定时器8中断服务函TIM8_UP_TIM13_IRQHandler

void TIM8_UP_TIM13_IRQHandler(void)
{
    
    
	
  if (TIM_GetITStatus(TIM8, TIM_IT_Update) != RESET)
    {
    
      
         TIM_ClearITPendingBit(TIM8, TIM_IT_Update);
         LED1=!LED1;
    } 
		  

}


4、主函数

/*
实验室217-2学习代码,希望感兴趣的同学,循序渐进完成。
理解代码,测试代码,修改代码,然后自己完成新的代码;
*/
#include "stm32f4xx.h"
#include "sys.h" //位操作
#include "delay.h"//反客科技提供
#include "delayzd.h"//正点原子提供
#include "led.h"   
#include "beep.h"   
#include "key.h" //独立按键中断------- 
#include "NVIC.h"  
#include "usart.h"  
#include "Lcd_Driver.h"//LCD 显示屏
#include "motor.h"  //电机操作
#include "pwm.h"//PWM
#include "tracksensor.h" //循迹模块传感器
#include "timer.h" //定时器3监控串口

//***************************************引用按键
//定义全局变量

u8 task_flag=0; //任务标签0-255
//
//*****************************函数声明,后面定义
//第一个测试:LED测试
void test1();
//第2个测试:蜂鸣器测试
void test2();
//第2个测试:蜂鸣器测试
void test3();
//*****************************************************************************************************
//
//
int main(void)
{
    
    	
	u16 t=0;
	u8 checktemp0=0;
	
  Delay_Init();		//延时函数初始化
  delay_init(168);
	
	LED_Init();			   //LED初始化
	BEEP_Init();
	KEY_INT_Init();
	Delay_ms(10);
	
	//uart1_init(115200);
	Delay_ms(10);
	
	MotorInit(8000);//8000HZ
	Tracksensor_Init();//

	//定时器时钟 84M,分频系数 8400,所以 84M/8400=10Khz 
//频率是10Khz----那么计算的时钟基准是1/10k=10e-4s=10
//的计数频率,计数 5000 次为 500ms,我们需要是1ms,那么是50 
	//5000次,是500ms,每次是0.1ms=100us
	//TIM3_Int_Init(50-1,8400-1);//定时器3定时1ms,定时100ms,在100ms内检测功能标记是不是等于1
  
	TIM8_Int_Init(200-1,8400-1);	//2000   f=5hz----T=0.2s===200ms.如果200,那么20ms

	Lcd_Init();//初始化函数
  Lcd_Clear(WHITE);//清屏,颜色
	
  LED1=1;
	delay_ms(500);
	LED1=0;
	delay_ms(500);
		
	LED1=1;
	delay_ms(500);
	LED1=0;
	delay_ms(500);
		
  LED1=1;
	delay_ms(500);
	LED1=0;
	delay_ms(500);

	NVIC_Config();
	delay_ms(100);
	
	//初始化:二维码显示屏幕显示++++数据
	//LCD_ShowStringQRcode96(0,0,RED,WHITE,"++++++");		
	//LCD_ShowStringQRcode96(0,0,RED,WHITE,"312+231");	
//	LCD_ShowCharAsc96(0,0,RED,WHITE,'+');//1	
//	LCD_ShowCharAsc96(48,0,RED,WHITE,'+');//2
//	LCD_ShowCharAsc96(96,0,RED,WHITE,'+');//3
//	LCD_ShowCharAsc96(144,0,RED,WHITE,'+');//+	
//	LCD_ShowCharAsc96(0,100,RED,WHITE,'+');//3		
//	LCD_ShowCharAsc96(48,100,RED,WHITE,'+');//2		
//	LCD_ShowCharAsc96(96,100,RED,WHITE,'+');//1
//	Delay_ms(100);


	
	TIM_Cmd(TIM8,ENABLE); //使能定时器8
	while (1)
	{
    
    
	

//  LED1=1;
//	delay_ms(500);
//	LED1=0;
//		delay_ms(500);
//		
//		  LED1=1;
//	delay_ms(500);
//	LED1=0;
//		delay_ms(500);
//		
//		  LED1=1;
//	delay_ms(500);
//	LED1=0;
//		delay_ms(500);
	}

	
}

5-------------波形以及分析
对反客科技的摸板设置,(需要用逻辑分析仪确定别的摸板设置,或者是自己摸清楚时钟配置,进行修改)
TIM8(200-1,8400-1)得到的波形是周期是20ms,是10ms进入一次中断。
在这里插入图片描述
tim8(200-1,4200-1)是周期10ms,频率100hz,5ms进入一次中断。

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/lmf666/article/details/112268449