STM32-TIM 学习笔记

STM32_Study: STM32_Study (gitee.com)

不逼逼 贴代码

tim.c
#include "stm32f10x.h"
#include "tim.h"
#include 

uint8_t Num;

/**
 * @brief 初始化tim2 内部 普通时钟
 *
 */
void tim2_internal_init_p(uint16_t period, uint16_t prescale)
{
    // 1.使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    // 2.使用内部时钟 //可不写 system_init(); 中会有设置
    TIM_InternalClockConfig(TIM2);
    // 3.初始化时基时钟 设置1s  计数器溢出频率:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitTypeDef tim_time_base_init_type_def;
    tim_time_base_init_type_def.TIM_ClockDivision = TIM_CKD_DIV1;     //分频
    tim_time_base_init_type_def.TIM_CounterMode = TIM_CounterMode_Up; //模式 向上计数
    tim_time_base_init_type_def.TIM_Period = 10000 - 1;               //周期 ARR 自动重装器的值 (最大65536)
    tim_time_base_init_type_def.TIM_Prescaler = 7200 - 1;             // PSC预分频 (最大65535)
    tim_time_base_init_type_def.TIM_RepetitionCounter = 0;            //高级定时器的重复计数器的值
    TIM_TimeBaseInit(TIM2, &tim_time_base_init_type_def);
    // 防止TIM_TimeBaseInit方法最后的语句在系统启动时调用中断,如下:
    // Generate an update event to reload the Prescaler and the Repetition counter values immediately
    // TIMx->EGR = TIM_PSCReloadMode_Immediate;
    // 清除标志位
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);
    // 4.使能中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中断
    // 5.NVIC 优先级分组 开启初始化并开启中断
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef nvic_init_type_def;
    nvic_init_type_def.NVIC_IRQChannel = TIM2_IRQn;           //中断通道
    nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE;           //使能
    nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
    nvic_init_type_def.NVIC_IRQChannelSubPriority = 1;        //响应优先级
    NVIC_Init(&nvic_init_type_def);
    // 6.使能定时器
    TIM_Cmd(TIM2, ENABLE);
}

void tim2_internal_init(void)
{
    tim2_internal_init_p(10000 - 1, 7200 - 1);
}

/**
 * @brief 初始化tim2 外部 普通时钟
 *
 */
void tim2_external_init(void)
{
    // 1.使能时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    // 2.gpio 初始化
    GPIO_InitTypeDef gpio_init_type_def;
    gpio_init_type_def.GPIO_Mode = GPIO_Mode_IPU;
    gpio_init_type_def.GPIO_Pin = GPIO_Pin_0;
    gpio_init_type_def.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &gpio_init_type_def);

    // 3.使用外部时钟
    // TIM_InternalClockConfig(TIM2);
    TIM_ETRClockMode2Config(TIM2, TIM_ExtTRGPSC_OFF, TIM_ExtTRGPolarity_NonInverted, 0x00);

    // 4.初始化时基时钟 设置1s  计数器溢出频率:CK_CNT_OV=CK_PSC/(PSC+1)/(ARR+1)
    TIM_TimeBaseInitTypeDef tim_time_base_init_type_def;
    tim_time_base_init_type_def.TIM_ClockDivision = TIM_CKD_DIV1;     //分频
    tim_time_base_init_type_def.TIM_CounterMode = TIM_CounterMode_Up; //模式 向上计数
    tim_time_base_init_type_def.TIM_Period = 10 - 1;                  //周期 ARR 自动重装器的值 (最大65536)
    tim_time_base_init_type_def.TIM_Prescaler = 1 - 1;                // PSC预分频 (最大65535)
    tim_time_base_init_type_def.TIM_RepetitionCounter = 0;            //高级定时器的重复计数器的值
    TIM_TimeBaseInit(TIM2, &tim_time_base_init_type_def);
    // 防止TIM_TimeBaseInit方法最后的语句在系统启动时调用中断,如下:
    // Generate an update event to reload the Prescaler and the Repetition counter values immediately
    // TIMx->EGR = TIM_PSCReloadMode_Immediate;
    // 清除标志位
    TIM_ClearFlag(TIM2, TIM_FLAG_Update);

    // 5.使能中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE); //更新中断

    // 6.NVIC 优先级分组 开启初始化并开启中断
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    NVIC_InitTypeDef nvic_init_type_def;
    nvic_init_type_def.NVIC_IRQChannel = TIM2_IRQn;           //中断通道
    nvic_init_type_def.NVIC_IRQChannelCmd = ENABLE;           //使能
    nvic_init_type_def.NVIC_IRQChannelPreemptionPriority = 2; //抢占优先级
    nvic_init_type_def.NVIC_IRQChannelSubPriority = 1;        //响应优先级
    NVIC_Init(&nvic_init_type_def);
    
    // 7.使能定时器
    TIM_Cmd(TIM2, ENABLE);
}
/**
 * @brief
 * 为避免其它文件重定义该函数,注销该代码.如使用,请打开.
 *
 */
// void TIM2_IRQHandler(void)
// {
//     if (TIM_GetITStatus(TIM2, TIM_IT_Update))
//     {
//         Num++;
//         printf("Num:%d", Num);
//         TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
//     }
// }

tim.h
#include "stm32f10x.h"
#ifndef __TIM_H__
#define __TIM_H__
void tim2_internal_init_p(uint16_t period,uint16_t prescale);
void tim2_internal_init(void);
void tim2_external_init(void);
#endif

你可能感兴趣的:(STM32-TIM 学习笔记)