#STM32F103ZET6 TIM基本定时器 代码操作
首先,我需要在野火给的例程里复制一个GPIO例程的副本,点击打开。
1、在User文件夹下新建两个文件,分别是bsp_BasicTim.h,
bsp_BasicTim.c.
2、然后在MDK的目录下添加刚刚新建好的两个文件。
3、由于我们在.c文件中需要用到.h文件,因此需要在魔法棒中的C/C++选项中选择Include Paths,添加.h的搜索路径,这是为了告诉计算机去哪里找文件。
基本定时器的好处在于由于没有外部的GPIO,就可以直接初始化结构体。
在.c文件内添加函数
static void BASIC_TIM_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
//定义一个初始化结构体
BASIC_TIM_APBxClock_FUN(BASIC_TIM_CLK, ENABLE);
//开启定时器时钟,即CK_INT=72M
TIM_TimeBaseStructure.TIM_Period = BASIC_TIM_Period;
//自动重装载寄存器的值
TIM_TimeBaseStructure.TIM_Prescaler= BASIC_TIM_Prescaler;
//时钟预分频数
// TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
//时钟分频因子,基本定时器没有,不用管
//TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
// 计数器计数模式,基本定时器只能向上计数,没有计数模式设置
// TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
//重复计数器的值,基本定时器没有,不用管
TIM_TimeBaseInit(BASIC_TIM, &TIM_TimeBaseStructure);
//初始化定时器
TIM_ClearFlag(BASIC_TIM, TIM_FLAG_Update);
//清除计数器中断标志位
TIM_ITConfig(BASIC_TIM,TIM_IT_Update,ENABLE);
//开启计数器中断
TIM_Cmd(BASIC_TIM, ENABLE);
//使能计数器
}
初始化完结构体之后,我们还需要对中断优先级进行配置。
代码如下:
static void BASIC_TIM_NVIC_Config(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//设置中断组为0
NVIC_InitStructure.NVIC_IRQChannel = BASIC_TIM_IRQ ;
//设置中断来源
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
//设置主优先级为0
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;
//设置抢占优先级为3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
在这里要注意一点,中断函数要写在stm32f10x_it.c中
中断函数如下:
void BASIC_TIM_IRQHandler (void)
{
if ( TIM_GetITStatus( BASIC_TIM, TIM_IT_Update) != RESET )
//判断Update中断是否真正来了,进一次中断的时间是1MS
{
time++;
TIM_ClearITPendingBit(BASIC_TIM , TIM_FLAG_Update);
//清除中断标志位
}
这里要注意一点的是:由于TIME是全局变量,因此需要在main.c中定义uint16_t time=0;
但是在it,c中使用了 time ,因此需要在it.c里面声明,extern uint16_t time 用以表示外部定义。
好的,接下来我们还需要对定时器进行初始化
代码如下:
void BASIC_TIM_Init(void)
{
BASIC_TIM_NVIC_Config();
BASIC_TIM_Config();
}
由于我们会在主函数中使用定时器初始化这个函数,因此我们需要在bsp_BasicTim.h中对其进行声明。
万事俱备,只欠主函数了
int main(void)
{
LED_GPIO_Config();//初始化IO口
BASIC_TIM_Init();//定时器初始化
while(1)//时间到了之后会进入中断
{
if(time==500) 当time==500ms时
{
time=0;//清零,防止下一次循环开始
LED1_TOGGLE; //对LED1进行一次翻转
}
}
}
这样就大功告成了,大家在使用JTAG连接上开发板之后,点击MDK左上方的Dwonload,就可以看到上面的小灯半秒闪烁了。
在这里有几点要提醒大家,这也是我在实践时遇到的问题,由于我们的bsp_BasicTim.c文件的头文件是
#include “bsp_BasicTim.h”,所以,c文件中的函数要是有用到.h里面的函数,都需要在在头文件那里把声明该函数的.h文件放上去,不然就会出现一些错误就像某某函数未定义什么什么的。
最后祝大家学习快乐