学习笔记—— STM32F103 TIM基本定时器1000ms闪烁

#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中对其进行声明。

万事俱备,只欠主函数了

扫描二维码关注公众号,回复: 12140797 查看本文章
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文件放上去,不然就会出现一些错误就像某某函数未定义什么什么的。

最后祝大家学习快乐
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41679822/article/details/100332862