【STM32学习笔记7.2】定时器计时

前言

本系列文章统一围绕STM32F103C8T6最小系统开发板进行记录,如涉及其他开发板将会特别说明。

定时器时钟频率

SystemInit()->SetSysClock()->SetSysClockTo72()->设置APB1为2分频
->通用定时器时钟频率为2*36MHz = 72MHz

image.png

定时器计时配置思路

  1. 开启定时器时钟

    • 通用定时器挂载在APB1总线下。
  2. 配置定时器时基单元+使能定时器

    • 溢出时间为1ms:arr = 1, psc = 35999
    • TIM_CounterMode_Up:向上计数模式
    • TIM_CKD_DIV1:决定数字滤波器采样频率的参数,在输入捕获时会被用到。
    image.png
  3. 配置定时器中断源+NVIC

    • TIM_IT_Update:溢出中断

代码

时基单元配置:1ms

static void _timeBase_init(TIM_TypeDef *tim, u16 arr, u16 psc) 
{
    TIM_TimeBaseInitTypeDef timBase;

    timBase.TIM_Period = arr;
    timBase.TIM_Prescaler = psc;
    timBase.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数
    timBase.TIM_ClockDivision = TIM_CKD_DIV1;
    // 初始化时基单元
    TIM_TimeBaseInit(tim, &timBase);
    // 使能定时器
    TIM_Cmd(tim, ENABLE);
}

NVIC配置

static void _timer_nvic_init(void)
{
    NVIC_InitTypeDef tim;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    tim.NVIC_IRQChannel = TIM2_IRQn;
    tim.NVIC_IRQChannelSubPriority = 1;
    tim.NVIC_IRQChannelPreemptionPriority = 0;
    tim.NVIC_IRQChannelCmd = ENABLE;

    NVIC_Init(&tim);
}

定时器初始化

void bsp_timer_init(void)
{   
    // 开启TIM3时钟
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
    // 时基单元配置:1ms
    _timeBase_init(TIM2, 1, 35999);
    // 配置NVIC
    _timer_nvic_init(); 
    // 配置TIM3中断为溢出中断
    TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
}

中断处理函数

void TIM2_IRQHandler(void)
{
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) == SET) {
        // 清除中断标志位
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update);
        tim_cnt++;
    }
}

主函数

现象:tim_cnt每1ms进行自增,达到1000时置为0,并进行LED状态翻转。

int main()
{
u8 led_state = 0;
    bsp_timer_init();
    drv_led_init();

    while (1) {
        if (tim_cnt == 1000) {
            tim_cnt = 0;
            led_state ^= 1;
          drv_led_ctl(led_state);      

        }
    }
    return 0;
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容