用一个计时器计时1秒,使得LED灯间隔一秒闪烁。
主程序:
#include "stm32f10x.h"
#include "delay.h"
#include "LED1.h"
#include "time.h"
int main(void)
{
delay_init(10); //延时初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断分组 这个要在设置中断优先级前面,一开始就要设置好的不能更改
LED_Init1();
Time3_Init(9999, 7199); //时间计算放在下面说明
while (1)
{
GPIO_ResetBits(GPIOB,GPIO_Pin_12); //让LED灯一直亮
}
}
头文件:
1. LED1.h
#ifndef __LED_H
#define __LED_H
void LED_Init1(void);
#endif
2.time.h
#ifndef __TIME__H
#define __TIME__H
#include "sys.h"
void Time3_Init(u16 arr, u16 psc); //定时器3初始化函数
#endif
C文件
1. LED.c
#include "LED1.h" //引用头文件
#include"stm32f10x.h"
void LED_Init1(void)
{
GPIO_InitTypeDef GPIO_InitStrucyure; //结构变量
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //使能时钟GPLOB
GPIO_InitStrucyure.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStrucyure.GPIO_Pin=GPIO_Pin_12;
GPIO_InitStrucyure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStrucyure); //初始化io口
GPIO_SetBits(GPIOB,GPIO_Pin_12); // io口默认不点亮,先将io口设置为高电平
}
2.time.c
#include "time.h"
#include "delay.h"
#include "LED1.h"
void Time3_Init(u16 arr, u16 psc)
{
NVIC_InitTypeDef NVIC_Initstruct; //结构变量
TIM_TimeBaseInitTypeDef TIM_Timeinit; //结构变量
TIM_Timeinit.TIM_ClockDivision = TIM_CKD_DIV1; //随意选取
TIM_Timeinit.TIM_CounterMode = TIM_CounterMode_Up; //计数模式
TIM_Timeinit.TIM_Period = arr; // 需要根据要计时的长度来计算输入
TIM_Timeinit.TIM_Prescaler = psc; //预分频系数 计算输入
//TIM_Timeinit.TIM_RepetitionCounter = //这个不需要
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //使能定时器3时钟
TIM_TimeBaseInit(TIM3,&TIM_Timeinit); //初始化定时器配置
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); //开启定时器中断 配置nvic
////////配置NIIC 记住要在主函数main中 先设置好优先级分组
NVIC_Initstruct.NVIC_IRQChannel=TIM3_IRQn ; //通道在stm32的头文件中找,io10对应通道9 对应EXTI9_5_IRQn
NVIC_Initstruct.NVIC_IRQChannelCmd= ENABLE;
NVIC_Initstruct.NVIC_IRQChannelPreemptionPriority=2; //抢占优先级, 在这个之前要中断分组好,所以要在主函数中分好组
NVIC_Initstruct.NVIC_IRQChannelSubPriority= 2 ; //子优先级
NVIC_Init(&NVIC_Initstruct);
//////////////////////
TIM_Cmd(TIM3,ENABLE); //使能定时器
///前面4个步骤已经完成现在完成中断服务函数
}
void TIM3_IRQHandler()
{
if(TIM_GetITStatus(TIM3,TIM_IT_Update) == SET) //获取状态定时器的状态 Upadate更新中断,是否更新了
{
GPIO_SetBits(GPIOB,GPIO_Pin_12); //定时器中断发生,将灯灭;
delay_ms(500);
///////别忘记了手动清除标志位!!!!!!!!!
TIM_ClearITPendingBit(TIM3,TIM_IT_Update); //清除中断标志
}
}
其中在主程序中有 Time3_Init(9999, 7199); 这里表示定时的时间是1s:
计算公式:
T = (A+1)*(B+1)/TCLK; A为前面的输入 ,B 为后面的那个输入
TCLK一般为72M 先计算(B+1)/TCLK 当B为7199时候,(B+1)/TCLK = 0.1ms 所以要让T 为1, 只要将A设为9999。