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进入一次中断。