STM32定时器定时中断

你的糖来啦
2024-06-21 / 0 评论 / 10 阅读 / 正在检测是否收录...

图片来源bilibil 江协科技
定时器中断结构
上图为定时器中断结构,我们使用定时器中断的操作步骤:

  1. 选择时钟源(如上图左内部时钟、外部时钟、其他定时器、通道捕获)
  2. 初始化时基单元
  3. 配置中断输出控制
  4. 配置NVIC
  5. 使能时钟运行控制

以下为一个示例 1s触发一次中断

#include "stm32f10x.h"                  // Device header

void Timer_Init(void)
{
    //启动APB1下的TIM2通用定时器
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    //选择TIM2通用定时器 系统默认配置使用 可以不配置 但是规范流程 写一下
    TIM_InternalClockConfig(TIM2);

    //初始化时基单元
    TIM_TimeBaseInitTypeDef TIM_TimeBaseInitSturcture;
    //选择时钟分频 这里是1分频就是不分频
    TIM_TimeBaseInitSturcture.TIM_ClockDivision = TIM_CKD_DIV1;
    //选择计数模式 向上计数
    TIM_TimeBaseInitSturcture.TIM_CounterMode = TIM_CounterMode_Up;
    //因为从0开始所以需要减一
    //stm32103c8单片机频率是72Mhz; 72M分频(除以)7200 = 10000 的意思是单片机进行7200分频得到每秒10000个震动 ,然后计数设置成10000每10000次触发一次更新
    TIM_TimeBaseInitSturcture.TIM_Period = 10000 -1;
    TIM_TimeBaseInitSturcture.TIM_Prescaler = 7200 -1;
    //高级定时器才有 这里填0
    TIM_TimeBaseInitSturcture.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitSturcture);
    
    //手动清除一次标志位 系统初始化时手动触发了更新事件 因此手动清除一次标志位 可以理解不清除的话代码单片机上电就会从1开始 但是计数是从0开始
    TIM_ClearFlag(TIM2,TIM_FLAG_Update);
    //中断输出控制 允许TIM2定时器更新 
    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
    
    //NVIC
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    //使能TIM2
    TIM_Cmd(TIM2,ENABLE);
}
//配置TIM2的中断函数 这个格式固定可以开始文件中找到
void TIM2_IRQHandler(void)
{
    //检查中断标志位 规范步骤
    if(TIM_GetITStatus(TIM2,TIM_IT_Update) == SET)
    {
        //需要中断执行的代码块
      
        //代码结束清除标志位 不然退出不了中断函数
        TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
    }
}
0

评论 (0)

取消