STM32-TIM 学习笔记
2022-04-27 本文已影响0人
水妖
STM32_Study: STM32_Study (gitee.com)
不逼逼 贴代码
tim.c
#include "stm32f10x.h"
#include "tim.h"
#include <stdio.h>
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