点击上方"蓝字"关注我们
作业 1、使用基本定时7,完成一个定时喂狗的程序 |
01、上节回顾
STM32 | 独立看门狗+RTC时间(第八天) |
02、定时器头文件
#ifndef __TIM_H
#define __TIM_H
#include "stm32f4xx.h"
void Tim3_Init(void);
void Tim7_Init(void);
#endif
03、定时器源文件
#include "tim.h"
/*********************************
定时器说明
TIM3 -- APB1(定时器频率:84MHZ)
TIM3是16位定时器
**********************************/
void Tim3_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1、能定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = (84-1); //84分频,定时器频率84MHZ/84 = 1MHZ(计一个用1us)
TIM_TimeBaseInitStruct.TIM_Period = (1000-1); //计1000个数,在1MHZ下,用时1ms
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子 1脉冲计一个数
//2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseInitStruct);
NVIC_InitStruct.NVIC_IRQChannel = TIM3_IRQn; //中断通道,可在stm32f4xx.h文件当中查找
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //通道使能
//3、启定时器中断,配置NVIC。
NVIC_Init(&NVIC_InitStruct);
//4、设置 TIM3_DIER 允许更新中断
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
//5、使能定时器。
TIM_Cmd(TIM3, ENABLE);
}
//编写中断服务函数。每隔1ms进入中断
void TIM3_IRQHandler(void)
{
static unsigned short led_flag = 0;
//判断更新标志位是否1
if(TIM_GetITStatus(TIM3, TIM_IT_Update) == SET)
{
led_flag++; //第隔1ms 值加1
if(led_flag%9 == 0)
{
//亮灯
GPIO_ResetBits(GPIOF, GPIO_Pin_9);
}
else
{
//灭灯
GPIO_SetBits(GPIOF, GPIO_Pin_9);
}
//清空更新标志位
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
}
}
/*********************************
定时器说明
TIM7 -- APB1(定时器频率:84MHZ)
TIM7是16位定时器
**********************************/
void Tim7_Init(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
NVIC_InitTypeDef NVIC_InitStruct;
//1、使能定时器时钟。
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM7, ENABLE);
TIM_TimeBaseInitStruct.TIM_Prescaler = (8400-1); //8400分频,定时器频率84MHZ/84 = 1MHZ(计一个用1us)
TIM_TimeBaseInitStruct.TIM_Period = (10000-1); //计10000个数,在1MHZ下,用时1s
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //向上计数
TIM_TimeBaseInitStruct.TIM_ClockDivision= TIM_CKD_DIV1; //分频因子 1脉冲计一个数
//2、初始化定时器,配置ARR,PSC。
TIM_TimeBaseInit(TIM7, &TIM_TimeBaseInitStruct);
NVIC_InitStruct.NVIC_IRQChannel = TIM7_IRQn; //中断通道,可在stm32f4xx.h文件当中查找
NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 1; //抢占优先级
NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1; //响应优先级
NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE; //通道使能
//3、启定时器中断,配置NVIC。
NVIC_Init(&NVIC_InitStruct);
//4、设置 TIM7_DIER 允许更新中断
TIM_ITConfig(TIM7, TIM_IT_Update, ENABLE);
//5、使能定时器。
TIM_Cmd(TIM7, ENABLE);
}
//编写中断服务函数。每隔1s进入中断
void TIM7_IRQHandler(void)
{
//判断更新标志位是否1