//这段程序编译没有错误,
//我用的是Keil 5 自带的创建工程模板这样减少了一些麻烦,模板没有问题毕竟前面的实验都没有问题的
/*头文件*/
#include"stm32f10x.h"
#ifndef _BSP_BASCTIM_H //如果没有定义_bsp_BaseTim_h_
#define _BSP_BASCTIM_H //那么就定义_bsp_BaseTim_h_
void All_Init(void);
#endif //定义完毕
/*.c文件*/
#include"bsp_BaseTim.h"
extern uint16_t time; //全局变量用来作为计数器使用
//基本定时器配置
void BaseTim_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_I;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM6,ENABLE);
TIM_I.TIM_Prescaler=71; //PSC+1 //时钟预分频器 时钟源经过该预分频器才是定时器时钟(0x0000~0xFFFF之间的分频)
// TIM_I.TIM_CounterMode=TIM_CounterMode_Up; //模式选择 向上 向下 中心对齐模式(基本定时器不需要设置)
TIM_I.TIM_Period=999; //定时器周期值(到达这个值的时候产生中断) 自动重载寄存器的值0x0000~0xFFFF之间
// TIM_I.TIM_ClockDivision=TIM_CKD_DIV1; //时钟分频 (基本定时器不需要设置)
// TIM_I.TIM_RepetitionCounter=0x00; //重复计数器 (基本定时器不需要设置)
TIM_TimeBaseInit(TIM6,&TIM_I); //初始化TIM6
TIM_ClearFlag(TIM6,TIM_FLAG_Update); //清除定时器中断标志位
TIM_ITConfig(TIM6,TIM_IT_Update,ENABLE); //开启定时器中断
TIM_Cmd(TIM6,ENABLE); //使能定时器
}
//GPIO配置
void GPIO_Config(void)
{
GPIO_InitTypeDef gpio_i;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE); //打开PB
//输出模式
gpio_i.GPIO_Pin=GPIO_Pin_5; //配置引脚
gpio_i.GPIO_Mode=GPIO_Mode_Out_PP; //配置模式
gpio_i.GPIO_Speed=GPIO_Speed_50MHz; //配置输出速率
GPIO_Init(GPIOB,&gpio_i); //初始化GPIO配置
}
//嵌套向量中断配置
void NVIC_Config(void)
{
NVIC_InitTypeDef nvic;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1); //中断优先级分组
nvic.NVIC_IRQChannel=TIM6_IRQn; //中断通道
nvic.NVIC_IRQChannelPreemptionPriority=0x01; //中断抢占优先级
nvic.NVIC_IRQChannelSubPriority=0x02; //中断响应优先级
nvic.NVIC_IRQChannelCmd=ENABLE; //中断使能
NVIC_Init(&nvic); //中断初始化
}
//中断服务函数
void TIM6_IRQHandler(void)
{
if(TIM_GetITStatus(TIM6,TIM_IT_Update)!=RESET) //判断是否真的进入了中断
{
time++;
GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED常亮(主函数里面每秒让LED灭一次)
TIM_ClearITPendingBit(TIM6,TIM_IT_Update); //清除中断标志位
}
}
//这个函数时用来调用其他配置函数的目的是为了在main函数里面更美观
void All_Init(void)
{
NVIC_Config();
BaseTim_Config(); //定时器配置
GPIO_Config(); //GPIO配置
}
/*main函数*/
#include"bsp_BaseTim.h"
uint16_t time=0; //用来记录中断次数的全局变量
int main()
{
All_Init(); //所有的初始化都在这个函数里面完成了
while(1)
{
// GPIO_ResetBits(GPIOB,GPIO_Pin_5); //LED常亮(放置于中断函数内部用来验证是否进入了中断函数)
if(time==1000) //如果1s到了LED就灭掉
{
time=0; //对time清零
GPIO_SetBits(GPIOB,GPIO_Pin_5); //LED灭
}
}
} |