前言
本系列文章统一围绕STM32F103C8T6最小系统开发板进行记录,如涉及其他开发板将会特别说明。
定时器时钟频率
SystemInit()->SetSysClock()->SetSysClockTo72()->设置APB1为2分频
->通用定时器时钟频率为2*36MHz = 72MHz

image.png
定时器计时配置思路
-
开启定时器时钟
- 通用定时器挂载在APB1总线下。
-
配置定时器时基单元+使能定时器
- 溢出时间为1ms:arr = 1, psc = 35999
- TIM_CounterMode_Up:向上计数模式
- TIM_CKD_DIV1:决定数字滤波器采样频率的参数,在输入捕获时会被用到。
image.png -
配置定时器中断源+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;
}
